Skip to content

Commit 875a612

Browse files
committed
Fix monitor to store queueID
1 parent eefa2f5 commit 875a612

9 files changed

Lines changed: 58 additions & 11 deletions

api/pkg/entities/heartbeat_monitor.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ type HeartbeatMonitor struct {
99
ID uuid.UUID `json:"id" gorm:"primaryKey;type:uuid;" example:"32343a19-da5e-4b1b-a767-3298a73703cb"`
1010
PhoneID uuid.UUID `json:"phone_id" example:"32343a19-da5e-4b1b-a767-3298a73703cb"`
1111
UserID UserID `json:"user_id" example:"WB7DRDWrJZRGbYrv2CKGkqbzvqdC"`
12+
QueueID string `json:"queue_id" example:"0360259236613675274"`
1213
Owner string `json:"owner" example:"+18005550199"`
1314
}

api/pkg/repositories/gorm_heartbeat_monitor_repository.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"context"
55
"fmt"
66

7+
"github.com/google/uuid"
8+
79
"github.com/pkg/errors"
810

911
"github.com/NdoleStudio/httpsms/pkg/entities"
@@ -19,6 +21,23 @@ type gormHeartbeatMonitorRepository struct {
1921
db *gorm.DB
2022
}
2123

24+
// UpdateQueueID updates the queueID of a monitor
25+
func (repository *gormHeartbeatMonitorRepository) UpdateQueueID(ctx context.Context, monitorID uuid.UUID, queueID string) error {
26+
ctx, span := repository.tracer.Start(ctx)
27+
defer span.End()
28+
29+
err := repository.db.
30+
Model(&entities.HeartbeatMonitor{}).
31+
Where("id = ?", monitorID).
32+
UpdateColumn("queue_id", queueID).
33+
Error
34+
if err != nil {
35+
msg := fmt.Sprintf("cannot update heartbeat monitor ID [%s]", monitorID)
36+
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
37+
}
38+
return nil
39+
}
40+
2241
func (repository *gormHeartbeatMonitorRepository) Delete(ctx context.Context, userID entities.UserID, owner string) error {
2342
ctx, span := repository.tracer.Start(ctx)
2443
defer span.End()

api/pkg/repositories/heartbeat_monitor_repository.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package repositories
33
import (
44
"context"
55

6+
"github.com/google/uuid"
7+
68
"github.com/NdoleStudio/httpsms/pkg/entities"
79
)
810

@@ -17,6 +19,9 @@ type HeartbeatMonitorRepository interface {
1719
// Exists checks if a heartbeat monitor exists for a phone number
1820
Exists(ctx context.Context, userID entities.UserID, phoneNumber string) (bool, error)
1921

22+
// UpdateQueueID updates the queueID of a monitor
23+
UpdateQueueID(ctx context.Context, monitorID uuid.UUID, queueID string) error
24+
2025
// Delete an entities.HeartbeatMonitor
2126
Delete(ctx context.Context, userID entities.UserID, phoneNumber string) error
2227
}

api/pkg/requests/message_send_request.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func (input *MessageSend) Sanitize() MessageSend {
2626
}
2727

2828
// ToMessageSendParams converts MessageSend to services.MessageSendParams
29-
func (input MessageSend) ToMessageSendParams(userID entities.UserID, source string) services.MessageSendParams {
29+
func (input *MessageSend) ToMessageSendParams(userID entities.UserID, source string) services.MessageSendParams {
3030
from, _ := phonenumbers.Parse(input.From, phonenumbers.UNKNOWN_REGION)
3131
to, _ := phonenumbers.Parse(input.To, phonenumbers.UNKNOWN_REGION)
3232

api/pkg/requests/request.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package requests
33
import (
44
"strconv"
55
"strings"
6+
"unicode"
67

78
"github.com/nyaruka/phonenumbers"
89
)
@@ -16,6 +17,10 @@ func (input *request) sanitizeAddress(value string) string {
1617
value = strings.Replace(value, " ", "+", 1)
1718
}
1819

20+
if !strings.HasPrefix(value, "+") && input.isDigits(value) && len(value) > 9 {
21+
value = "+" + value
22+
}
23+
1924
if number, err := phonenumbers.Parse(value, phonenumbers.UNKNOWN_REGION); err == nil {
2025
value = phonenumbers.Format(number, phonenumbers.E164)
2126
}
@@ -50,3 +55,12 @@ func (input *request) getInt(value string) int {
5055
val, _ := strconv.Atoi(value)
5156
return val
5257
}
58+
59+
func (input *request) isDigits(value string) bool {
60+
for _, c := range value {
61+
if !unicode.IsDigit(c) {
62+
return false
63+
}
64+
}
65+
return true
66+
}

api/pkg/services/event_dispatcher_service.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,34 +63,35 @@ func (dispatcher *EventDispatcher) DispatchSync(ctx context.Context, event cloud
6363
}
6464

6565
// DispatchWithTimeout dispatches an event with a timeout
66-
func (dispatcher *EventDispatcher) DispatchWithTimeout(ctx context.Context, event cloudevents.Event, timeout time.Duration) error {
66+
func (dispatcher *EventDispatcher) DispatchWithTimeout(ctx context.Context, event cloudevents.Event, timeout time.Duration) (queueID string, err error) {
6767
ctx, span := dispatcher.tracer.Start(ctx)
6868
defer span.End()
6969

7070
if err := event.Validate(); err != nil {
7171
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))
72+
return queueID, dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
7373
}
7474

7575
task, err := dispatcher.createCloudTask(event)
7676
if err != nil {
7777
msg := fmt.Sprintf("cannot create cloud task for event [%s] with id [%s]", event.Type(), event.ID())
78-
return dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
78+
return queueID, dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
7979
}
8080

8181
if _, err = dispatcher.queue.Enqueue(ctx, task, timeout); err != nil {
8282
msg := fmt.Sprintf("cannot enqueue event with ID [%s] and type [%s]", event.ID(), event.Type())
83-
return dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
83+
return queueID, dispatcher.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
8484
}
8585

86-
return nil
86+
return queueID, nil
8787
}
8888

8989
// Dispatch a new event by adding it to the queue to be processed async
9090
func (dispatcher *EventDispatcher) Dispatch(ctx context.Context, event cloudevents.Event) error {
9191
ctx, span := dispatcher.tracer.Start(ctx)
9292
defer span.End()
93-
return dispatcher.DispatchWithTimeout(ctx, event, time.Nanosecond*-1)
93+
_, err := dispatcher.DispatchWithTimeout(ctx, event, time.Nanosecond*-1)
94+
return err
9495
}
9596

9697
// Subscribe a listener to an event

api/pkg/services/heartbeat_service.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ func (service *HeartbeatService) handleFailedMonitor(ctx context.Context, lastTi
233233
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
234234
}
235235

236-
if err = service.dispatcher.DispatchWithTimeout(ctx, event, heartbeatCheckInterval); err != nil {
236+
if _, err = service.dispatcher.DispatchWithTimeout(ctx, event, heartbeatCheckInterval); err != nil {
237237
msg := fmt.Sprintf("cannot dispatch event [%s] for heartbeat monitor with phone id [%s]", event.Type(), params.PhoneID)
238238
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
239239
}
@@ -257,10 +257,17 @@ func (service *HeartbeatService) scheduleHeartbeatCheck(ctx context.Context, las
257257
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
258258
}
259259

260-
if err = service.dispatcher.DispatchWithTimeout(ctx, event, heartbeatCheckInterval); err != nil {
260+
queueID, err := service.dispatcher.DispatchWithTimeout(ctx, event, heartbeatCheckInterval)
261+
if err != nil {
261262
msg := fmt.Sprintf("cannot dispatch event [%s] for heartbeat monitor with phone id [%s]", event.Type(), params.PhoneID)
262263
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
263264
}
265+
266+
if err = service.monitorRepository.UpdateQueueID(ctx, params.MonitorID, queueID); err != nil {
267+
msg := fmt.Sprintf("cannot update monitor with id [%s] with queue with ID [%s]", params.MonitorID, queueID)
268+
service.logger.Error(stacktrace.Propagate(err, msg))
269+
}
270+
264271
return nil
265272
}
266273

api/pkg/services/message_service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ func (service *MessageService) ScheduleExpirationCheck(ctx context.Context, para
617617
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
618618
}
619619

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

api/pkg/services/phone_notification_service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ func (service *PhoneNotificationService) dispatchMessageNotificationSend(ctx con
152152
return stacktrace.Propagate(err, fmt.Sprintf("cannot create [%s] event for notification [%s]", events.EventTypeMessageNotificationSend, notification.ID))
153153
}
154154

155-
if err = service.eventDispatcher.DispatchWithTimeout(ctx, event, notification.ScheduledAt.Sub(time.Now())); err != nil {
155+
if _, err = service.eventDispatcher.DispatchWithTimeout(ctx, event, notification.ScheduledAt.Sub(time.Now())); err != nil {
156156
return stacktrace.Propagate(err, fmt.Sprintf("cannot dispatch event [%s] for notification [%s]", event.Type(), notification.ID))
157157
}
158158
return nil

0 commit comments

Comments
 (0)