Skip to content

Commit 02870d1

Browse files
committed
Fix time.duration to seconds
1 parent b15d3ad commit 02870d1

9 files changed

Lines changed: 64 additions & 52 deletions

File tree

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ sending and receiving SMS messages.
4848
In-order not to abuse the SMS API on android, you can send a rate limit e.g 3 messages per minute. Such that even if you
4949
call the API to send messages to 100 people, It will only send the messages at a rate of 3 messages per minute.
5050

51+
### Message Expiration
52+
53+
Sometimes it happens that the phone doesn't get the push notification in time and I can't send the SMS message. It is
54+
possible to set a timeout for which a message is valid and if a message becomes expired after the timeout elapses, you
55+
will be notified.
56+
5157
## API Clients
5258

5359
- Go: https://github.com/NdoleStudio/httpsms-go

api/pkg/entities/phone.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,14 @@ 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 duration in nanoseconds after sending a message when it is considered to be expired.
18-
MessageExpirationTimeout time.Duration `json:"message_expiration_timeout"`
17+
// MessageExpirationSeconds is the duration in seconds after sending a message when it is considered to be expired.
18+
MessageExpirationSeconds uint `json:"message_expiration_seconds"`
1919

2020
CreatedAt time.Time `json:"created_at" example:"2022-06-05T14:26:02.302718+03:00"`
2121
UpdatedAt time.Time `json:"updated_at" example:"2022-06-05T14:26:10.303278+03:00"`
2222
}
23+
24+
// MessageExpirationDuration returns the message expiration as time.Duration
25+
func (phone *Phone) MessageExpirationDuration() time.Duration {
26+
return time.Duration(phone.MessageExpirationSeconds) * time.Second
27+
}

api/pkg/events/message_notification_sent_event.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ const EventTypeMessageNotificationSent = "message.notification.sent"
1313

1414
// MessageNotificationSentPayload is the payload of the EventTypeMessageNotificationSent event
1515
type MessageNotificationSentPayload struct {
16-
MessageID uuid.UUID `json:"message_id"`
17-
UserID entities.UserID `json:"user_id"`
18-
PhoneID uuid.UUID `json:"phone_id"`
19-
ScheduledAt time.Time `json:"scheduled_at"`
20-
FcmMessageID string `json:"fcm_message_id"`
21-
MessageExpirationTimeout time.Duration `json:"message_expiration_timeout"`
22-
NotificationSentAt time.Time `json:"notification_sent_at"`
23-
NotificationID uuid.UUID `json:"notification_id"`
16+
MessageID uuid.UUID `json:"message_id"`
17+
UserID entities.UserID `json:"user_id"`
18+
PhoneID uuid.UUID `json:"phone_id"`
19+
ScheduledAt time.Time `json:"scheduled_at"`
20+
FcmMessageID string `json:"fcm_message_id"`
21+
MessageExpirationDuration time.Duration `json:"message_expiration_duration"`
22+
NotificationSentAt time.Time `json:"notification_sent_at"`
23+
NotificationID uuid.UUID `json:"notification_id"`
2424
}

api/pkg/listeners/message_listener.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -317,12 +317,12 @@ func (listener *MessageListener) onMessageNotificationSent(ctx context.Context,
317317
}
318318

319319
storeParams := services.MessageScheduleExpirationParams{
320-
MessageID: payload.MessageID,
321-
UserID: payload.UserID,
322-
NotificationSentAt: payload.NotificationSentAt,
323-
PhoneID: payload.PhoneID,
324-
Source: event.Source(),
325-
MessageExpirationTimeout: payload.MessageExpirationTimeout,
320+
MessageID: payload.MessageID,
321+
UserID: payload.UserID,
322+
NotificationSentAt: payload.NotificationSentAt,
323+
PhoneID: payload.PhoneID,
324+
Source: event.Source(),
325+
MessageExpirationDuration: payload.MessageExpirationDuration,
326326
}
327327
if err := listener.service.ScheduleExpirationCheck(ctx, storeParams); err != nil {
328328
msg := fmt.Sprintf("cannot exchedule expiration check for MessageID [%s] and userID [%s]", storeParams.MessageID, storeParams.UserID)

api/pkg/requests/phone_update_request.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ type PhoneUpsert struct {
1616
MessagesPerMinute uint `json:"messages_per_minute" example:"1"`
1717
PhoneNumber string `json:"phone_number" example:"+18005550199"`
1818

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"`
19+
// MessageExpirationSeconds is the duration in seconds after sending a message when it is considered to be expired.
20+
MessageExpirationSeconds uint `json:"message_expiration_seconds" example:"12345"`
2121

2222
FcmToken string `json:"fcm_token" example:"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzd....."`
2323
}
@@ -47,15 +47,16 @@ func (input *PhoneUpsert) ToUpsertParams(user entities.AuthUser) services.PhoneU
4747

4848
// ignore default
4949
var timeout *time.Duration
50-
if input.MessageExpirationTimeout != 0 {
51-
timeout = &input.MessageExpirationTimeout
50+
if input.MessageExpirationSeconds != 0 {
51+
duration := time.Duration(input.MessageExpirationSeconds) * time.Second
52+
timeout = &duration
5253
}
5354

5455
return services.PhoneUpsertParams{
55-
PhoneNumber: *phone,
56-
MessagesPerMinute: messagesPerMinute,
57-
MessageExpirationTimeout: timeout,
58-
FcmToken: fcmToken,
59-
UserID: user.ID,
56+
PhoneNumber: *phone,
57+
MessagesPerMinute: messagesPerMinute,
58+
MessageExpirationDuration: timeout,
59+
FcmToken: fcmToken,
60+
UserID: user.ID,
6061
}
6162
}

api/pkg/services/message_service.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -574,12 +574,12 @@ func (service *MessageService) HandleMessageExpired(ctx context.Context, params
574574

575575
// MessageScheduleExpirationParams are parameters for scheduling the expiration of a message event
576576
type MessageScheduleExpirationParams struct {
577-
MessageID uuid.UUID
578-
UserID entities.UserID
579-
NotificationSentAt time.Time
580-
PhoneID uuid.UUID
581-
MessageExpirationTimeout time.Duration
582-
Source string
577+
MessageID uuid.UUID
578+
UserID entities.UserID
579+
NotificationSentAt time.Time
580+
PhoneID uuid.UUID
581+
MessageExpirationDuration time.Duration
582+
Source string
583583
}
584584

585585
// ScheduleExpirationCheck schedules an event to check if a message is expired
@@ -589,27 +589,27 @@ func (service *MessageService) ScheduleExpirationCheck(ctx context.Context, para
589589

590590
ctxLogger := service.tracer.CtxLogger(service.logger, span)
591591

592-
if params.MessageExpirationTimeout == 0 {
592+
if params.MessageExpirationDuration == 0 {
593593
ctxLogger.Info(fmt.Sprintf("message expiration duration not set for message [%s] using phone [%s]", params.MessageID, params.PhoneID))
594594
return nil
595595
}
596596

597597
event, err := service.createMessageSendExpiredCheckEvent(params.Source, events.MessageSendExpiredCheckPayload{
598598
MessageID: params.MessageID,
599-
ScheduledAt: params.NotificationSentAt.Add(params.MessageExpirationTimeout),
599+
ScheduledAt: params.NotificationSentAt.Add(params.MessageExpirationDuration),
600600
UserID: params.UserID,
601601
})
602602
if err != nil {
603603
msg := fmt.Sprintf("cannot create event [%s] for message with id [%s]", events.EventTypeMessageSendExpiredCheck, params.MessageID)
604604
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
605605
}
606606

607-
if err = service.eventDispatcher.DispatchWithTimeout(ctx, event, params.MessageExpirationTimeout); err != nil {
607+
if err = service.eventDispatcher.DispatchWithTimeout(ctx, event, params.MessageExpirationDuration); err != nil {
608608
msg := fmt.Sprintf("cannot dispatch event [%s] for message with ID [%s]", event.Type(), params.MessageID)
609609
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
610610
}
611611

612-
ctxLogger.Info(fmt.Sprintf("scheduled message id [%s] to expire at [%s]", params.MessageID, params.NotificationSentAt.Add(params.MessageExpirationTimeout)))
612+
ctxLogger.Info(fmt.Sprintf("scheduled message id [%s] to expire at [%s]", params.MessageID, params.NotificationSentAt.Add(params.MessageExpirationDuration)))
613613
return nil
614614
}
615615

api/pkg/services/notification_service.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -210,14 +210,14 @@ func (service *NotificationService) createMessageNotificationSentEvent(source st
210210
event.SetID(uuid.New().String())
211211

212212
payload := events.MessageNotificationSentPayload{
213-
MessageID: params.MessageID,
214-
UserID: params.UserID,
215-
PhoneID: params.PhoneID,
216-
ScheduledAt: params.ScheduledAt,
217-
MessageExpirationTimeout: phone.MessageExpirationTimeout,
218-
FcmMessageID: fcmMessageID,
219-
NotificationSentAt: time.Now().UTC(),
220-
NotificationID: params.PhoneNotificationID,
213+
MessageID: params.MessageID,
214+
UserID: params.UserID,
215+
PhoneID: params.PhoneID,
216+
ScheduledAt: params.ScheduledAt,
217+
MessageExpirationDuration: phone.MessageExpirationDuration(),
218+
FcmMessageID: fcmMessageID,
219+
NotificationSentAt: time.Now().UTC(),
220+
NotificationID: params.PhoneNotificationID,
221221
}
222222

223223
if err := event.SetData(cloudevents.ApplicationJSON, payload); err != nil {

api/pkg/services/phone_service.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +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-
MessageExpirationTimeout *time.Duration
61-
UserID entities.UserID
57+
PhoneNumber phonenumbers.PhoneNumber
58+
FcmToken *string
59+
MessagesPerMinute *uint
60+
MessageExpirationDuration *time.Duration
61+
UserID entities.UserID
6262
}
6363

6464
// Upsert a new entities.Phone
@@ -95,8 +95,8 @@ func (service *PhoneService) update(phone *entities.Phone, params PhoneUpsertPar
9595
phone.MessagesPerMinute = *params.MessagesPerMinute
9696
}
9797

98-
if params.MessageExpirationTimeout != nil {
99-
phone.MessageExpirationTimeout = *params.MessageExpirationTimeout
98+
if params.MessageExpirationDuration != nil {
99+
phone.MessageExpirationSeconds = uint(params.MessageExpirationDuration.Seconds())
100100
}
101101
return phone
102102
}
@@ -128,7 +128,7 @@ func (service *PhoneService) createPhone(ctx context.Context, params PhoneUpsert
128128
UserID: params.UserID,
129129
FcmToken: params.FcmToken,
130130
MessagesPerMinute: 0,
131-
MessageExpirationTimeout: 0,
131+
MessageExpirationSeconds: 0,
132132
PhoneNumber: phonenumbers.Format(&params.PhoneNumber, phonenumbers.E164),
133133
CreatedAt: time.Now().UTC(),
134134
UpdatedAt: time.Now().UTC(),

web/pages/settings/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@
167167
outlined
168168
type="number"
169169
dense
170-
label="Message Expiration (nanoseconds)"
170+
label="Message Expiration (seconds)"
171171
>
172172
</v-text-field>
173173
<v-text-field

0 commit comments

Comments
 (0)