package logic import ( "context" "strconv" "strings" "spark-server/internal/pkg/errs" ) func (s *Service) ListGroups(ctx context.Context, q string) ([]GroupView, error) { if !s.ready() { return nil, ErrNotReady } rows, err := s.repo.ListGroups(ctx, q) if err != nil { return nil, err } out := make([]GroupView, 0, len(rows)) for _, r := range rows { out = append(out, groupSummary(r)) } return out, nil } func (s *Service) GroupDetail(ctx context.Context, groupIDStr string) (*GroupView, error) { if !s.ready() { return nil, ErrNotReady } gid, err := strconv.ParseInt(strings.TrimSpace(groupIDStr), 10, 64) if err != nil || gid <= 0 { return nil, errs.ErrNotFound } g, err := s.repo.GroupByID(ctx, gid) if err != nil { return nil, err } view := groupSummary(*g) members, err := s.repo.ListGroupMembers(ctx, gid) if err != nil { return nil, err } view.Members = make([]GroupMemberOut, 0, len(members)) for _, m := range members { nick := m.Nickname if nick == "" { nick = m.UNick } view.Members = append(view.Members, GroupMemberOut{ UserID: m.UserID, Email: m.Email, Nickname: nick, Role: roleName(m.Role), }) } msgs, err := s.repo.ListGroupMessages(ctx, gid, 100) if err != nil { return nil, err } view.Messages = make([]ImMessageView, 0, len(msgs)) for _, m := range msgs { view.Messages = append(view.Messages, messageView(m)) } return &view, nil } func (s *Service) DissolveGroup(ctx context.Context, groupIDStr string) error { if s.groups == nil || !s.ready() { return ErrNotReady } gid, err := strconv.ParseInt(strings.TrimSpace(groupIDStr), 10, 64) if err != nil || gid <= 0 { return errs.ErrNotFound } ownerID, err := s.repo.ActiveGroupOwner(ctx, gid) if err != nil { return err } return s.groups.Dissolve(ctx, ownerID, gid) }