package logic import ( "context" "errors" deliverentity "spark-server/internal/module/deliver/entity" "spark-server/internal/pkg/errs" ) const cmdDelete uint16 = 15 func (s *Service) DeleteMessage(ctx context.Context, userID int64, deviceID uint64, msgID int64) error { if !s.ready() || userID <= 0 { return errs.ErrUnauthorized } if msgID <= 0 { return errs.ErrInvalidArgument } msg, err := s.repo.GetByID(ctx, msgID) if err != nil { return err } if _, err := s.chats.GetMember(ctx, msg.ConversationID, userID); err != nil { if errors.Is(err, errs.ErrNotFound) { return errs.ErrForbidden } return err } if err := s.repo.HideForUser(ctx, userID, msg); err != nil { return err } if s.queue == nil { return nil } jobID, err := s.ids.NextID() if err != nil { return err } return s.queue.Push(ctx, &deliverentity.Job{ MsgID: jobID, Cmd: cmdDelete, ConversationID: msg.ConversationID, FromUserID: userID, FromDeviceID: deviceID, ExcludeDevice: deviceID, ToUserIDs: []int64{userID}, NotPush: true, Payload: controlBytes(msg.ID, msg.ConversationID), }) }