78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
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)
|
|
}
|