Skip to content

Commit a7da64a

Browse files
committed
Add validator to events
1 parent 5ef16d9 commit a7da64a

11 files changed

Lines changed: 67 additions & 25 deletions

File tree

android/app/src/main/java/com/httpsms/HttpSmsApiService.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import java.util.logging.Logger.getLogger
1515

1616
class HttpSmsApiService(private val apiKey: String) {
1717
private val apiKeyHeader = "x-api-key"
18-
private val baseURL = URI("https://api.httpsms.com")
18+
private val baseURL = URI("https://269a-145-14-19-211.ngrok.io")
1919
private val jsonMediaType = "application/json; charset=utf-8".toMediaType()
2020

2121
init {

api/pkg/entities/phone.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ type Phone struct {
1414
PhoneNumber string `json:"phone_number" example:"+18005550199"`
1515
MessagesPerMinute uint `json:"messages_per_minute" example:"1"`
1616

17-
// MessageExpirationTimeout is the time after sending a message when it is considered to be expired
17+
// MessageExpirationTimeout is the duration in nanoseconds after sending a message when it is considered to be expired.
1818
MessageExpirationTimeout time.Duration `json:"message_expiration_timeout"`
1919

2020
CreatedAt time.Time `json:"created_at" example:"2022-06-05T14:26:02.302718+03:00"`

api/pkg/listeners/message_listener.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ func (listener *MessageListener) onMessageNotificationSent(ctx context.Context,
321321
UserID: payload.UserID,
322322
NotificationSentAt: payload.NotificationSentAt,
323323
PhoneID: payload.PhoneID,
324+
Source: event.Source(),
324325
MessageExpirationTimeout: payload.MessageExpirationTimeout,
325326
}
326327
if err := listener.service.ScheduleExpirationCheck(ctx, storeParams); err != nil {
@@ -345,6 +346,7 @@ func (listener *MessageListener) onMessageSendExpiredCheck(ctx context.Context,
345346
checkParams := services.MessageCheckExpired{
346347
MessageID: payload.MessageID,
347348
UserID: payload.UserID,
349+
Source: event.Source(),
348350
}
349351
if err := listener.service.CheckExpired(ctx, checkParams); err != nil {
350352
msg := fmt.Sprintf("cannot check expiration for MessageID [%s] and userID [%s]", checkParams.MessageID, checkParams.UserID)

api/pkg/requests/phone_update_request.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package requests
22

33
import (
44
"strings"
5+
"time"
56

67
"github.com/nyaruka/phonenumbers"
78

@@ -14,7 +15,11 @@ type PhoneUpsert struct {
1415
request
1516
MessagesPerMinute uint `json:"messages_per_minute" example:"1"`
1617
PhoneNumber string `json:"phone_number" example:"+18005550199"`
17-
FcmToken string `json:"fcm_token" example:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzd....."`
18+
19+
// MessageExpirationTimeout is the duration in nanoseconds after sending a message when it is considered to be expired.
20+
MessageExpirationTimeout time.Duration `json:"message_expiration_timeout" example:"12345"`
21+
22+
FcmToken string `json:"fcm_token" example:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzd....."`
1823
}
1924

2025
// Sanitize sets defaults to MessageOutstanding
@@ -40,10 +45,17 @@ func (input *PhoneUpsert) ToUpsertParams(user entities.AuthUser) services.PhoneU
4045
fcmToken = &input.FcmToken
4146
}
4247

48+
// ignore default
49+
var timeout *time.Duration
50+
if input.MessageExpirationTimeout != 0 {
51+
timeout = &input.MessageExpirationTimeout
52+
}
53+
4354
return services.PhoneUpsertParams{
44-
PhoneNumber: *phone,
45-
MessagesPerMinute: messagesPerMinute,
46-
FcmToken: fcmToken,
47-
UserID: user.ID,
55+
PhoneNumber: *phone,
56+
MessagesPerMinute: messagesPerMinute,
57+
MessageExpirationTimeout: timeout,
58+
FcmToken: fcmToken,
59+
UserID: user.ID,
4860
}
4961
}

api/pkg/services/event_dispatcher_service.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ func (dispatcher *EventDispatcher) Dispatch(ctx context.Context, event cloudeven
4848
ctx, span := dispatcher.tracer.Start(ctx)
4949
defer span.End()
5050

51+
if err := event.Validate(); err != nil {
52+
msg := fmt.Sprintf("cannot dispatch event with ID [%s] and type [%s] because it is invalid", event.ID(), event.Type())
53+
return dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
54+
}
55+
5156
if err := dispatcher.repository.Save(ctx, event); err != nil {
5257
msg := fmt.Sprintf("cannot save event with ID [%s] and type [%s]", event.ID(), event.Type())
5358
return dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
@@ -62,6 +67,11 @@ func (dispatcher *EventDispatcher) DispatchWithTimeout(ctx context.Context, even
6267
ctx, span := dispatcher.tracer.Start(ctx)
6368
defer span.End()
6469

70+
if err := event.Validate(); err != nil {
71+
msg := fmt.Sprintf("cannot dispatch event with ID [%s] and type [%s] because it is invalid", event.ID(), event.Type())
72+
return dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
73+
}
74+
6575
task, err := dispatcher.createCloudTask(event)
6676
if err != nil {
6777
msg := fmt.Sprintf("cannot create cloud task for event [%s] with id [%s]", event.Type(), event.ID())

api/pkg/services/message_service.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ type MessageScheduleExpirationParams struct {
579579
NotificationSentAt time.Time
580580
PhoneID uuid.UUID
581581
MessageExpirationTimeout time.Duration
582-
source string
582+
Source string
583583
}
584584

585585
// ScheduleExpirationCheck schedules an event to check if a message is expired
@@ -594,7 +594,7 @@ func (service *MessageService) ScheduleExpirationCheck(ctx context.Context, para
594594
return nil
595595
}
596596

597-
event, err := service.createMessageSendExpiredCheckEvent(params.source, events.MessageSendExpiredCheckPayload{
597+
event, err := service.createMessageSendExpiredCheckEvent(params.Source, events.MessageSendExpiredCheckPayload{
598598
MessageID: params.MessageID,
599599
ScheduledAt: params.NotificationSentAt.Add(params.MessageExpirationTimeout),
600600
UserID: params.UserID,
@@ -617,7 +617,7 @@ func (service *MessageService) ScheduleExpirationCheck(ctx context.Context, para
617617
type MessageCheckExpired struct {
618618
MessageID uuid.UUID
619619
UserID entities.UserID
620-
source string
620+
Source string
621621
}
622622

623623
// CheckExpired checks if a message has expired
@@ -638,7 +638,7 @@ func (service *MessageService) CheckExpired(ctx context.Context, params MessageC
638638
return nil
639639
}
640640

641-
event, err := service.createMessageSendExpiredEvent(params.source, events.MessageSendExpiredPayload{
641+
event, err := service.createMessageSendExpiredEvent(params.Source, events.MessageSendExpiredPayload{
642642
MessageID: message.ID,
643643
Owner: message.Owner,
644644
Contact: message.Contact,

api/pkg/services/phone_service.go

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,11 @@ func (service *PhoneService) Index(ctx context.Context, authUser entities.AuthUs
5454

5555
// PhoneUpsertParams are parameters for creating a new entities.Phone
5656
type PhoneUpsertParams struct {
57-
PhoneNumber phonenumbers.PhoneNumber
58-
FcmToken *string
59-
MessagesPerMinute *uint
60-
UserID entities.UserID
57+
PhoneNumber phonenumbers.PhoneNumber
58+
FcmToken *string
59+
MessagesPerMinute *uint
60+
MessageExpirationTimeout *time.Duration
61+
UserID entities.UserID
6162
}
6263

6364
// Upsert a new entities.Phone
@@ -93,6 +94,10 @@ func (service *PhoneService) update(phone *entities.Phone, params PhoneUpsertPar
9394
if params.MessagesPerMinute != nil {
9495
phone.MessagesPerMinute = *params.MessagesPerMinute
9596
}
97+
98+
if params.MessageExpirationTimeout != nil {
99+
phone.MessageExpirationTimeout = *params.MessageExpirationTimeout
100+
}
96101
return phone
97102
}
98103

@@ -119,13 +124,14 @@ func (service *PhoneService) createPhone(ctx context.Context, params PhoneUpsert
119124
defer span.End()
120125

121126
phone := &entities.Phone{
122-
ID: uuid.New(),
123-
UserID: params.UserID,
124-
FcmToken: params.FcmToken,
125-
MessagesPerMinute: 0,
126-
PhoneNumber: phonenumbers.Format(&params.PhoneNumber, phonenumbers.E164),
127-
CreatedAt: time.Now().UTC(),
128-
UpdatedAt: time.Now().UTC(),
127+
ID: uuid.New(),
128+
UserID: params.UserID,
129+
FcmToken: params.FcmToken,
130+
MessagesPerMinute: 0,
131+
MessageExpirationTimeout: 0,
132+
PhoneNumber: phonenumbers.Format(&params.PhoneNumber, phonenumbers.E164),
133+
CreatedAt: time.Now().UTC(),
134+
UpdatedAt: time.Now().UTC(),
129135
}
130136

131137
if err := service.repository.Save(ctx, phone); err != nil {

api/pkg/validators/message_handler_validator.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,9 @@ func (validator MessageHandlerValidator) ValidateMessageEvent(_ context.Context,
132132
"event_name": []string{
133133
"required",
134134
"in:" + strings.Join([]string{
135-
entities.MessageEventNameSent,
136-
entities.MessageEventNameFailed,
137-
entities.MessageEventNameDelivered,
135+
string(entities.MessageEventNameSent),
136+
string(entities.MessageEventNameFailed),
137+
string(entities.MessageEventNameDelivered),
138138
}, ","),
139139
},
140140
"messageID": []string{

web/models/phone.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ export interface Phone {
55
phone_number: string
66
created_at: string
77
updated_at: string
8+
message_expiration_timeout: number
89
messages_per_minute: number
910
}

web/pages/settings/index.vue

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,14 @@
162162
:value="activePhone.fcm_token"
163163
>
164164
</v-textarea>
165+
<v-text-field
166+
v-model="activePhone.message_expiration_timeout"
167+
outlined
168+
type="number"
169+
dense
170+
label="Message Expiration (nanoseconds)"
171+
>
172+
</v-text-field>
165173
<v-text-field
166174
v-model="activePhone.messages_per_minute"
167175
outlined

0 commit comments

Comments
 (0)