spark-server/internal/module/group/logic/mention.go
2026-09-18 14:50:41 +08:00

49 lines
1.2 KiB
Go

package logic
import (
"context"
"spark-server/internal/module/group/entity"
"spark-server/internal/pkg/errs"
"spark-server/internal/pkg/i18n"
"spark-server/internal/pkg/reqctx"
)
func (s *Service) CheckMentions(ctx context.Context, userID, conversationID int64, atAll bool, uids []int64) error {
if !s.ready() || userID <= 0 || conversationID <= 0 {
return errs.ErrForbidden
}
if !atAll && len(uids) == 0 {
return nil
}
g, err := s.repo.GetByConversation(ctx, conversationID)
if err != nil || !g.Active() {
return errs.ErrForbidden
}
mem, err := s.requireMember(ctx, g.ID, userID)
if err != nil {
return err
}
lang := reqctx.Lang(ctx)
if atAll && !mem.CanManage() {
return errs.ErrForbidden.WithMsg(i18n.T(lang, i18n.KeyGroupMentionDenied, nil))
}
if len(uids) == 0 {
return nil
}
ids, err := s.repo.ListMemberIDs(ctx, g.ID)
if err != nil {
return err
}
inGroup := make(map[int64]struct{}, len(ids))
for _, id := range ids {
inGroup[id] = struct{}{}
}
for _, uid := range entity.UniqueUIDs(uids) {
if _, ok := inGroup[uid]; !ok {
return errs.ErrInvalidArgument.WithMsg(i18n.T(lang, i18n.KeyGroupMentionInvalid, nil))
}
}
return nil
}