Added: message state update

This commit is contained in:
Aleksandr Soloshenko 2022-10-06 21:50:20 +07:00
parent cad991d442
commit 7b9316f64d
3 changed files with 61 additions and 1 deletions

View File

@ -1,10 +1,12 @@
package handlers
import (
"errors"
"fmt"
"strings"
"bitbucket.org/capcom6/smsgatewaybackend/internal/smsgateway/models"
"bitbucket.org/capcom6/smsgatewaybackend/internal/smsgateway/repositories"
"bitbucket.org/capcom6/smsgatewaybackend/internal/smsgateway/services"
"bitbucket.org/capcom6/smsgatewaybackend/pkg/smsgateway"
"bitbucket.org/soft-c/gohelpers/pkg/fiber/middleware/apikey"
@ -71,7 +73,14 @@ func (h *mobileHandler) patchMessage(device models.Device, c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, err.Error())
}
return fiber.ErrNotImplemented
for _, v := range req {
err := h.messagesSvc.UpdateState(device.ID, v)
if err != nil && !errors.Is(err, repositories.ErrMessageNotFound) {
errorLog.Printf("Can't update message status: %s\n", err.Error())
}
}
return c.SendStatus(fiber.StatusNoContent)
}
func (h *mobileHandler) authorize(handler func(models.Device, *fiber.Ctx) error) fiber.Handler {

View File

@ -5,6 +5,10 @@ import (
"gorm.io/gorm"
)
var (
ErrMessageNotFound = gorm.ErrRecordNotFound
)
type MessagesRepository struct {
db *gorm.DB
}
@ -20,6 +24,28 @@ func (r *MessagesRepository) SelectPending(deviceID string) (messages []models.M
return
}
func (r *MessagesRepository) Get(deviceID, ID string) (message models.Message, err error) {
err = r.db.Where("device_id = ? AND ext_id = ?", deviceID, ID).Take(&message).Error
return
}
func (r *MessagesRepository) UpdateState(message *models.Message) error {
return r.db.Transaction(func(tx *gorm.DB) error {
if err := tx.Model(message).Select("State").Updates(message).Error; err != nil {
return err
}
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 {
return err
}
}
return nil
})
}
func NewMessagesRepository(db *gorm.DB) *MessagesRepository {
return &MessagesRepository{
db: db,

View File

@ -31,6 +31,18 @@ func (s *MessagesService) SelectPending(deviceID string) ([]smsgateway.Message,
return result, nil
}
func (s *MessagesService) UpdateState(deviceID string, message smsgateway.MessageState) error {
existing, err := s.messages.Get(deviceID, message.ID)
if err != nil {
return err
}
existing.State = models.MessageState(message.State)
existing.Recipients = s.recipientsStateToModel(message.Recipients)
return s.messages.UpdateState(&existing)
}
func (s *MessagesService) recipientsToDomain(input []models.MessageRecipient) []string {
output := make([]string, len(input))
@ -41,6 +53,19 @@ func (s *MessagesService) recipientsToDomain(input []models.MessageRecipient) []
return output
}
func (s *MessagesService) recipientsStateToModel(input []smsgateway.RecipientState) []models.MessageRecipient {
output := make([]models.MessageRecipient, len(input))
for i, v := range input {
output[i] = models.MessageRecipient{
PhoneNumber: v.PhoneNumber,
State: models.MessageState(v.State),
}
}
return output
}
func NewMessagesService(messages *repositories.MessagesRepository) *MessagesService {
idgen, _ := nanoid.Standard(21)