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

47 lines
1.1 KiB
Go

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),
})
}