From 6cddeb33ababe68fdfdb5011e236b317b5027ff7 Mon Sep 17 00:00:00 2001 From: Aleksandr Soloshenko Date: Mon, 27 Nov 2023 23:57:10 +0700 Subject: [PATCH] Added: errors logging --- api/swagger.json | 5 +++++ api/swagger.yaml | 4 ++++ db/migrations/20231127234448_error_reporting.sql | 10 ++++++++++ internal/sms-gateway/models/models.go | 1 + internal/sms-gateway/repositories/messages.go | 2 +- internal/sms-gateway/services/messages.go | 7 +++++++ pkg/smsgateway/domain.go | 1 + 7 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 db/migrations/20231127234448_error_reporting.sql diff --git a/api/swagger.json b/api/swagger.json index d5e1bfc..1eca0a0 100644 --- a/api/swagger.json +++ b/api/swagger.json @@ -493,6 +493,11 @@ "state" ], "properties": { + "error": { + "description": "Ошибка", + "type": "string", + "example": "timeout" + }, "phoneNumber": { "description": "Номер телефона", "type": "string", diff --git a/api/swagger.yaml b/api/swagger.yaml index 23b35a4..31aeda0 100644 --- a/api/swagger.yaml +++ b/api/swagger.yaml @@ -135,6 +135,10 @@ definitions: - MessageStateFailed smsgateway.RecipientState: properties: + error: + description: Ошибка + example: timeout + type: string phoneNumber: description: Номер телефона example: "79990001234" diff --git a/db/migrations/20231127234448_error_reporting.sql b/db/migrations/20231127234448_error_reporting.sql new file mode 100644 index 0000000..d25891a --- /dev/null +++ b/db/migrations/20231127234448_error_reporting.sql @@ -0,0 +1,10 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE `message_recipients` +ADD `error` varchar(256); +-- +goose StatementEnd +--- +-- +goose Down +-- +goose StatementBegin +ALTER TABLE `message_recipients` DROP `error`; +-- +goose StatementEnd \ No newline at end of file diff --git a/internal/sms-gateway/models/models.go b/internal/sms-gateway/models/models.go index eef8a2f..6214084 100644 --- a/internal/sms-gateway/models/models.go +++ b/internal/sms-gateway/models/models.go @@ -60,4 +60,5 @@ type MessageRecipient struct { MessageID uint64 `gorm:"primaryKey;type:BIGINT UNSIGNED"` PhoneNumber string `gorm:"primaryKey;type:varchar(16)"` State MessageState `gorm:"not null;type:enum('Pending','Sent','Processed','Delivered','Failed');default:Pending"` + Error *string `gorm:"type:varchar(256)"` } diff --git a/internal/sms-gateway/repositories/messages.go b/internal/sms-gateway/repositories/messages.go index adcf870..3d0b159 100644 --- a/internal/sms-gateway/repositories/messages.go +++ b/internal/sms-gateway/repositories/messages.go @@ -57,7 +57,7 @@ func (r *MessagesRepository) UpdateState(message *models.Message) error { } for _, v := range message.Recipients { - if err := tx.Model(&v).Where("message_id = ? AND phone_number = ?", message.ID, v.PhoneNumber).Update("state", v.State).Error; err != nil { + if err := tx.Model(&v).Where("message_id = ?", message.ID).Select("State", "Error").Updates(&v).Error; err != nil { return err } } diff --git a/internal/sms-gateway/services/messages.go b/internal/sms-gateway/services/messages.go index b33c15f..059f467 100644 --- a/internal/sms-gateway/services/messages.go +++ b/internal/sms-gateway/services/messages.go @@ -16,6 +16,10 @@ import ( "github.com/nyaruka/phonenumbers" ) +const ( + ErrorTTLExpired = "TTL expired" +) + var ErrValidation error = errors.New("validation error") type MessagesService struct { @@ -166,6 +170,7 @@ func (s *MessagesService) filterTimeouted(messages []models.Message) []models.Me v.State = models.MessageStateFailed for i := range v.Recipients { v.Recipients[i].State = models.MessageStateFailed + v.Recipients[i].Error = types.AsPointer(ErrorTTLExpired) } s.Messages.UpdateState(&v) } @@ -211,6 +216,7 @@ func (s *MessagesService) recipientsStateToModel(input []smsgateway.RecipientSta output[i] = models.MessageRecipient{ PhoneNumber: phoneNumber, State: models.MessageState(v.State), + Error: v.Error, } } @@ -229,6 +235,7 @@ func modelToRecipientState(input models.MessageRecipient) smsgateway.RecipientSt return smsgateway.RecipientState{ PhoneNumber: input.PhoneNumber, State: smsgateway.ProcessState(input.State), + Error: input.Error, } } diff --git a/pkg/smsgateway/domain.go b/pkg/smsgateway/domain.go index 00551c3..f762142 100644 --- a/pkg/smsgateway/domain.go +++ b/pkg/smsgateway/domain.go @@ -30,4 +30,5 @@ type MessageState struct { type RecipientState struct { PhoneNumber string `json:"phoneNumber" validate:"required,min=10" example:"79990001234"` // Номер телефона State ProcessState `json:"state" validate:"required" example:"Pending"` // Состояние + Error *string `json:"error,omitempty" example:"timeout"` // Ошибка }