Fixed: nullable ValidUntil model field

This commit is contained in:
Aleksandr Soloshenko 2023-10-31 23:00:12 +07:00
parent 966e4b712f
commit a9bfb84704
3 changed files with 13 additions and 7 deletions

View File

@ -47,7 +47,7 @@ type Message struct {
ExtID string `gorm:"not null;type:varchar(36);uniqueIndex:unq_messages_id_device,priority:1"`
Message string `gorm:"not null;type:tinytext"`
State MessageState `gorm:"not null;type:enum('Pending','Sent','Processed','Delivered','Failed');default:Pending;index:idx_messages_device_state"`
ValidUntil time.Time `gorm:"type:datetime"`
ValidUntil *time.Time `gorm:"type:datetime"`
Device Device `gorm:"foreignKey:DeviceID;constraint:OnDelete:CASCADE"`
Recipients []MessageRecipient `gorm:"foreignKey:MessageID;constraint:OnDelete:CASCADE"`

View File

@ -11,6 +11,7 @@ import (
"github.com/capcom6/sms-gateway/internal/sms-gateway/repositories"
"github.com/capcom6/sms-gateway/pkg/slices"
"github.com/capcom6/sms-gateway/pkg/smsgateway"
"github.com/capcom6/sms-gateway/pkg/types"
"github.com/jaevor/go-nanoid"
"github.com/nyaruka/phonenumbers"
)
@ -45,8 +46,8 @@ func (s *MessagesService) SelectPending(deviceID string) ([]smsgateway.Message,
result := make([]smsgateway.Message, len(messages))
for i, v := range messages {
var ttl *uint64 = nil
if !v.ValidUntil.IsZero() {
delta := time.Until(v.ValidUntil).Seconds()
if v.ValidUntil != nil {
delta := time.Until(*v.ValidUntil).Seconds()
if delta > 0 {
deltaInt := uint64(delta)
ttl = &deltaInt
@ -113,9 +114,9 @@ func (s *MessagesService) Enqeue(device models.Device, message smsgateway.Messag
}
}
validUntil := time.Time{}
var validUntil *time.Time = nil
if message.TTL != nil && *message.TTL > 0 {
validUntil = time.Now().Add(time.Duration(*message.TTL) * time.Second)
validUntil = types.AsPointer(time.Now().Add(time.Duration(*message.TTL) * time.Second))
}
msg := models.Message{
@ -153,11 +154,11 @@ func (s *MessagesService) Enqeue(device models.Device, message smsgateway.Messag
func (s *MessagesService) filterTimeouted(messages []models.Message) []models.Message {
result := make([]models.Message, 0, len(messages))
for _, v := range messages {
if v.ValidUntil.IsZero() || time.Now().Before(v.ValidUntil) {
if v.ValidUntil == nil || time.Now().Before(*v.ValidUntil) {
result = append(result, v)
} else if v.State == models.MessageStatePending {
v.State = models.MessageStateFailed
for i, _ := range v.Recipients {
for i := range v.Recipients {
v.Recipients[i].State = models.MessageStateFailed
}
s.Messages.UpdateState(&v)

5
pkg/types/types.go Normal file
View File

@ -0,0 +1,5 @@
package types
func AsPointer[T any](v T) *T {
return &v
}