spark-server/internal/module/group/logic/purge.go
2026-09-20 17:49:09 +08:00

74 lines
1.6 KiB
Go

package logic
import (
"context"
"errors"
"spark-server/internal/module/group/entity"
"spark-server/internal/pkg/errs"
)
func (s *Service) PurgeUser(ctx context.Context, userID int64) error {
if s == nil || s.repo == nil || userID <= 0 {
return nil
}
groups, err := s.repo.ListAllActiveByUser(ctx, userID)
if err != nil {
return err
}
for _, g := range groups {
if g == nil {
continue
}
if g.OwnerID == userID {
if err := s.handOffOwnedGroup(ctx, userID, g); err != nil {
return err
}
continue
}
if err := s.repo.RemoveMember(ctx, g.ID, userID); err != nil && !errors.Is(err, errs.ErrNotFound) {
return err
}
s.invalidateMembers(g.ConversationID)
}
return nil
}
func (s *Service) handOffOwnedGroup(ctx context.Context, ownerID int64, g *entity.Group) error {
members, err := s.repo.ListMembers(ctx, g.ID, entity.MemberListMax)
if err != nil {
return err
}
next := successorOwnerID(ownerID, members)
if next == 0 {
err := s.Dissolve(ctx, ownerID, g.ID)
if err != nil && !errors.Is(err, errs.ErrNotFound) {
return err
}
return nil
}
if _, err := s.Transfer(ctx, ownerID, g.ID, &TransferInput{UID: next}); err != nil {
return err
}
if err := s.RemoveMember(ctx, ownerID, g.ID, ownerID); err != nil && !errors.Is(err, errs.ErrNotFound) {
return err
}
return nil
}
func successorOwnerID(ownerID int64, members []*entity.Member) int64 {
var firstOther int64
for _, m := range members {
if m == nil || m.UserID == ownerID {
continue
}
if m.Role == entity.RoleAdmin {
return m.UserID
}
if firstOther == 0 {
firstOther = m.UserID
}
}
return firstOther
}