diff --git a/internal/api/delete_user.go b/internal/api/delete_user.go index ccc3be175..1fe5457fd 100644 --- a/internal/api/delete_user.go +++ b/internal/api/delete_user.go @@ -48,7 +48,7 @@ type deleteUserReq struct { } // DeleteUser permanently deletes a user account and cleans up associated data. -// Steps: force-logout → delete friends → quit/kick groups → hard-delete user doc. +// Steps: force-logout → delete friends → dismiss owned groups / quit others → hard-delete user doc. // Caller must be the same user as userID, or an IM admin (see CheckAccessV3). func (d *DeleteUserApi) DeleteUser(c *gin.Context) { var req deleteUserReq @@ -108,7 +108,7 @@ func (d *DeleteUserApi) DeleteUser(c *gin.Context) { } } - // 4. Quit / kick from all joined groups (paginated, page size 100) + // 4. Leave all joined groups: dismiss groups owned by the user, quit the rest (paginated). pageNumber := int32(1) const pageSize = int32(100) for { @@ -121,6 +121,15 @@ func (d *DeleteUserApi) DeleteUser(c *gin.Context) { break } for _, g := range groupListResp.Groups { + if g.OwnerUserID == req.UserID { + if _, err := d.groupClient.DismissGroup(c, &group.DismissGroupReq{ + GroupID: g.GroupID, + DeleteMember: true, + }); err != nil { + log.ZWarn(c, "DeleteUser: DismissGroup failed", err, "userID", req.UserID, "groupID", g.GroupID) + } + continue + } if _, err := d.groupClient.QuitGroup(c, &group.QuitGroupReq{ GroupID: g.GroupID, UserID: req.UserID,