49 lines
1.2 KiB
Go
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
|
|
}
|