46 lines
1016 B
Go
46 lines
1016 B
Go
package logic
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
|
|
"spark-server/internal/infrastructure/id"
|
|
"spark-server/internal/module/message/entity"
|
|
"spark-server/internal/pkg/errs"
|
|
)
|
|
|
|
func (s *Service) assignID(requested int64, now time.Time, msg *entity.Message) error {
|
|
if requested > 0 {
|
|
if !id.WithinSkew(requested, now, msgIDSkew) {
|
|
return errs.ErrInvalidArgument
|
|
}
|
|
msg.ID = requested
|
|
return nil
|
|
}
|
|
nid, err := s.ids.NextID()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
msg.ID = nid
|
|
return nil
|
|
}
|
|
|
|
func (s *Service) persistSend(ctx context.Context, msg *entity.Message) (*entity.Message, bool, error) {
|
|
err := s.repo.CreateAndBump(ctx, msg)
|
|
if err == nil {
|
|
return msg, false, nil
|
|
}
|
|
if !errors.Is(err, errs.ErrDuplicate) {
|
|
return nil, false, err
|
|
}
|
|
existing, lookErr := s.repo.GetByClientMsgID(ctx, msg.SenderID, msg.ConversationID, msg.ClientMsgID)
|
|
if lookErr != nil {
|
|
existing, lookErr = s.repo.GetByID(ctx, msg.ID)
|
|
}
|
|
if lookErr != nil {
|
|
return nil, false, err
|
|
}
|
|
return existing, true, nil
|
|
}
|