Added: withDeliveryReport field support

This commit is contained in:
Aleksandr Soloshenko 2023-12-03 20:33:25 +07:00
parent 180644a14c
commit df1a84b27b
9 changed files with 58 additions and 26 deletions

View File

@ -8,12 +8,13 @@ Content-Type: application/json
Authorization: Basic {{localCredentials}}
{
"message": "Test",
"message": "{{$localDatetime iso8601}}",
"ttl": 600,
"phoneNumbers": [
"{{phone}}"
],
"simNumber": 1
"simNumber": 1,
"withDeliveryReport": true
}
###

View File

@ -23,7 +23,8 @@ Authorization: Basic {{credentials}}
"phoneNumbers": [
"{{phone}}"
],
"simNumber": 3
"simNumber": 1,
"withDeliveryReport": true
}
###

View File

@ -369,6 +369,11 @@
"type": "integer",
"minimum": 5,
"example": 86400
},
"withDeliveryReport": {
"description": "Запрашивать отчет о доставке",
"type": "boolean",
"example": true
}
}
},

View File

@ -43,6 +43,10 @@ definitions:
example: 86400
minimum: 5
type: integer
withDeliveryReport:
description: Запрашивать отчет о доставке
example: true
type: boolean
required:
- message
- phoneNumbers

View File

@ -0,0 +1,10 @@
-- +goose Up
-- +goose StatementBegin
ALTER TABLE `messages`
ADD `with_delivery_report` tinyint(1) unsigned DEFAULT false;
-- +goose StatementEnd
---
-- +goose Down
-- +goose StatementBegin
ALTER TABLE `messages` DROP `with_delivery_report`;
-- +goose StatementEnd

View File

@ -42,13 +42,14 @@ type Device struct {
}
type Message struct {
ID uint64 `gorm:"primaryKey;type:BIGINT UNSIGNED;autoIncrement"`
DeviceID string `gorm:"not null;type:char(21);uniqueIndex:unq_messages_id_device,priority:2;index:idx_messages_device_state"`
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"`
SimNumber *uint8 `gorm:"type:tinyint(1) unsigned"`
ID uint64 `gorm:"primaryKey;type:BIGINT UNSIGNED;autoIncrement"`
DeviceID string `gorm:"not null;type:char(21);uniqueIndex:unq_messages_id_device,priority:2;index:idx_messages_device_state"`
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"`
SimNumber *uint8 `gorm:"type:tinyint(1) unsigned"`
WithDeliveryReport bool `gorm:"type:tinyint(1) unsigned;default:0"`
Device Device `gorm:"foreignKey:DeviceID;constraint:OnDelete:CASCADE"`
Recipients []MessageRecipient `gorm:"foreignKey:MessageID;constraint:OnDelete:CASCADE"`

View File

@ -62,11 +62,12 @@ func (s *MessagesService) SelectPending(deviceID string) ([]smsgateway.Message,
}
result[i] = smsgateway.Message{
ID: v.ExtID,
Message: v.Message,
TTL: ttl,
PhoneNumbers: s.recipientsToDomain(v.Recipients),
SimNumber: v.SimNumber,
ID: v.ExtID,
Message: v.Message,
TTL: ttl,
PhoneNumbers: s.recipientsToDomain(v.Recipients),
SimNumber: v.SimNumber,
WithDeliveryReport: types.AsPointer[bool](v.WithDeliveryReport),
}
}
@ -129,12 +130,13 @@ func (s *MessagesService) Enqeue(device models.Device, message smsgateway.Messag
}
msg := models.Message{
DeviceID: device.ID,
ExtID: message.ID,
Message: message.Message,
ValidUntil: validUntil,
SimNumber: message.SimNumber,
Recipients: s.recipientsToModel(message.PhoneNumbers),
DeviceID: device.ID,
ExtID: message.ID,
Message: message.Message,
ValidUntil: validUntil,
SimNumber: message.SimNumber,
WithDeliveryReport: types.OrDefault[bool](message.WithDeliveryReport, true),
Recipients: s.recipientsToModel(message.PhoneNumbers),
}
if msg.ExtID == "" {
msg.ExtID = s.idgen()

View File

@ -12,11 +12,12 @@ const (
// Сообщение
type Message struct {
ID string `json:"id,omitempty" validate:"omitempty,max=36" example:"PyDmBQZZXYmyxMwED8Fzy"` // Идентификатор
Message string `json:"message" validate:"required,max=256" example:"Hello World!"` // Текст сообщения
TTL *uint64 `json:"ttl,omitempty" validate:"omitempty,min=5" example:"86400"` // Время жизни сообщения в секундах
SimNumber *uint8 `json:"simNumber,omitempty" validate:"omitempty,max=3" example:"1"` // Номер сим-карты
PhoneNumbers []string `json:"phoneNumbers" validate:"required,min=1,max=100,dive,required,min=10" example:"79990001234"` // Получатели
ID string `json:"id,omitempty" validate:"omitempty,max=36" example:"PyDmBQZZXYmyxMwED8Fzy"` // Идентификатор
Message string `json:"message" validate:"required,max=256" example:"Hello World!"` // Текст сообщения
TTL *uint64 `json:"ttl,omitempty" validate:"omitempty,min=5" example:"86400"` // Время жизни сообщения в секундах
SimNumber *uint8 `json:"simNumber,omitempty" validate:"omitempty,max=3" example:"1"` // Номер сим-карты
WithDeliveryReport *bool `json:"withDeliveryReport,omitempty" example:"true"` // Запрашивать отчет о доставке
PhoneNumbers []string `json:"phoneNumbers" validate:"required,min=1,max=100,dive,required,min=10" example:"79990001234"` // Получатели
}
// Состояние сообщения

View File

@ -3,3 +3,10 @@ package types
func AsPointer[T any](v T) *T {
return &v
}
func OrDefault[T any](v *T, def T) T {
if v == nil {
return def
}
return *v
}