Added: support of hashed messages

This commit is contained in:
Aleksandr Soloshenko 2023-12-12 09:19:40 +07:00
parent acfe8a00a8
commit 18a8637d89
5 changed files with 46 additions and 7 deletions

View File

@ -42,12 +42,12 @@ Content-Type: application/json
[
{
"id": "8GHr-tUz6JBRFpTUXDV4w",
"state": "Pending",
"id": "Z4oS32CY5XktsYTCcMWMn",
"state": "Delivered",
"recipients": [
{
"phoneNumber": "79990001234",
"state": "Pending"
"phoneNumber": "79504241345",
"state": "Delivered"
}
]
}

View File

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

View File

@ -51,6 +51,8 @@ type Message struct {
SimNumber *uint8 `gorm:"type:tinyint(1) unsigned"`
WithDeliveryReport bool `gorm:"not null;type:tinyint(1) unsigned"`
IsHashed bool `gorm:"not null;type:tinyint(1) unsigned;default:0"`
Device Device `gorm:"foreignKey:DeviceID;constraint:OnDelete:CASCADE"`
Recipients []MessageRecipient `gorm:"foreignKey:MessageID;constraint:OnDelete:CASCADE"`

View File

@ -2,6 +2,7 @@ package services
import (
"context"
"crypto/sha256"
"errors"
"fmt"
"log"
@ -85,7 +86,7 @@ func (s *MessagesService) UpdateState(deviceID string, message smsgateway.Messag
}
existing.State = models.MessageState(message.State)
existing.Recipients = s.recipientsStateToModel(message.Recipients)
existing.Recipients = s.recipientsStateToModel(message.Recipients, existing.IsHashed)
return s.Messages.UpdateState(&existing)
}
@ -202,12 +203,13 @@ func (s *MessagesService) recipientsToModel(input []string) []models.MessageReci
return output
}
func (s *MessagesService) recipientsStateToModel(input []smsgateway.RecipientState) []models.MessageRecipient {
func (s *MessagesService) recipientsStateToModel(input []smsgateway.RecipientState, hash bool) []models.MessageRecipient {
output := make([]models.MessageRecipient, len(input))
for i, v := range input {
phoneNumber := v.PhoneNumber
if len(phoneNumber) > 0 && phoneNumber[0] != '+' {
// compatibility with Android app before 1.1.1
phoneNumber = "+" + phoneNumber
}
@ -215,6 +217,10 @@ func (s *MessagesService) recipientsStateToModel(input []smsgateway.RecipientSta
v.State = smsgateway.MessageStateProcessed
}
if hash {
phoneNumber = fmt.Sprintf("%x", sha256.Sum256([]byte(phoneNumber)))[:16]
}
output[i] = models.MessageRecipient{
PhoneNumber: phoneNumber,
State: models.MessageState(v.State),

View File

@ -11,6 +11,7 @@ import (
func TestMessagesService_recipientsStateToModel(t *testing.T) {
type args struct {
input []smsgateway.RecipientState
hash bool
}
tests := []struct {
name string
@ -56,6 +57,26 @@ func TestMessagesService_recipientsStateToModel(t *testing.T) {
},
},
},
{
name: "With hashing",
s: &MessagesService{},
args: args{
input: []smsgateway.RecipientState{
{
PhoneNumber: "+79990001234",
State: "",
},
},
hash: true,
},
want: []models.MessageRecipient{
{
MessageID: 0,
PhoneNumber: "62d17792b45c5307",
State: "",
},
},
},
{
name: "Empty phone",
s: &MessagesService{},
@ -78,7 +99,7 @@ func TestMessagesService_recipientsStateToModel(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := tt.s.recipientsStateToModel(tt.args.input); !reflect.DeepEqual(got, tt.want) {
if got := tt.s.recipientsStateToModel(tt.args.input, tt.args.hash); !reflect.DeepEqual(got, tt.want) {
t.Errorf("MessagesService.recipientsStateToModel() = %v, want %v", got, tt.want)
}
})