diff --git a/api/requests.http b/api/requests.http index 24bfad5..83a82d9 100644 --- a/api/requests.http +++ b/api/requests.http @@ -42,7 +42,7 @@ Content-Type: application/json [ { - "id": "Z4oS32CY5XktsYTCcMWMn", + "id": "ZoK8jU8y74cZRnZH1xNIH", "state": "Delivered", "recipients": [ { diff --git a/internal/sms-gateway/app.go b/internal/sms-gateway/app.go index 0b42c6a..b434f25 100644 --- a/internal/sms-gateway/app.go +++ b/internal/sms-gateway/app.go @@ -40,5 +40,16 @@ func Run() { logOption.UseLogLevel(zapcore.DebugLevel) return &logOption }), + // fx.Invoke( + // func(lc fx.Lifecycle, logger *zap.Logger, messagesSvc *services.MessagesService) { + // lc.Append( + // fx.Hook{ + // OnStart: func(ctx context.Context) error { + // return messagesSvc.HashProcessed() + // }, + // }, + // ) + // }, + // ), ).Run() } diff --git a/internal/sms-gateway/models/migrations/mysql/20231208173729_hashed_messages.sql b/internal/sms-gateway/models/migrations/mysql/20231208173729_hashed_messages.sql index 716c6ed..3e88dcc 100644 --- a/internal/sms-gateway/models/migrations/mysql/20231208173729_hashed_messages.sql +++ b/internal/sms-gateway/models/migrations/mysql/20231208173729_hashed_messages.sql @@ -3,6 +3,9 @@ ALTER TABLE `messages` ADD `is_hashed` tinyint(1) unsigned NOT NULL DEFAULT false; -- +goose StatementEnd +-- +goose StatementBegin +CREATE INDEX `idx_messages_is_hashed` USING HASH ON `messages` (`is_hashed`); +-- +goose StatementEnd --- -- +goose Down -- +goose StatementBegin diff --git a/internal/sms-gateway/repositories/messages.go b/internal/sms-gateway/repositories/messages.go index 3d0b159..404a37d 100644 --- a/internal/sms-gateway/repositories/messages.go +++ b/internal/sms-gateway/repositories/messages.go @@ -66,6 +66,23 @@ func (r *MessagesRepository) UpdateState(message *models.Message) error { }) } +func (r *MessagesRepository) HashProcessed() error { + return r.db.Transaction(func(tx *gorm.DB) error { + err := tx.Model(&models.MessageRecipient{}). + Where("message_id IN (?)", tx.Model(&models.Message{}).Select("id").Where("is_hashed = ? AND state <> ?", false, models.MessageStatePending)). + Update("phone_number", gorm.Expr("LEFT(SHA2(phone_number, 256), 16)")). + Error + if err != nil { + return err + } + + return tx.Model(&models.Message{}). + Where("is_hashed = ? AND state <> ?", false, models.MessageStatePending). + Updates(map[string]interface{}{"is_hashed": true, "message": gorm.Expr("SHA2(message, 256)")}). + Error + }) +} + func NewMessagesRepository(db *gorm.DB) *MessagesRepository { return &MessagesRepository{ db: db, diff --git a/internal/sms-gateway/services/messages.go b/internal/sms-gateway/services/messages.go index 49b7e69..3b80237 100644 --- a/internal/sms-gateway/services/messages.go +++ b/internal/sms-gateway/services/messages.go @@ -164,6 +164,10 @@ func (s *MessagesService) Enqeue(device models.Device, message smsgateway.Messag return state, nil } +func (s *MessagesService) HashProcessed() error { + return s.Messages.HashProcessed() +} + func (s *MessagesService) filterTimeouted(messages []models.Message) []models.Message { result := make([]models.Message, 0, len(messages)) for _, v := range messages { diff --git a/internal/sms-gateway/tasks/hashing.go b/internal/sms-gateway/tasks/hashing.go new file mode 100644 index 0000000..9b29ce4 --- /dev/null +++ b/internal/sms-gateway/tasks/hashing.go @@ -0,0 +1 @@ +package tasks