Skip to content

Commit 90c48d0

Browse files
committed
Fixed attempt count
1 parent a4556ad commit 90c48d0

8 files changed

Lines changed: 112 additions & 37 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://0819-145-14-19-43.ngrok.io")
18+
private val baseURL = URI("https://49b1-145-14-19-43.ngrok.io")
1919
// private val baseURL = URI("https://api.httpsms.com")
2020
private val jsonMediaType = "application/json; charset=utf-8".toMediaType()
2121
private val client = OkHttpClient()

api/pkg/entities/message.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ func (message *Message) Sent(timestamp time.Time) *Message {
132132
message.Status = MessageStatusSent
133133
message.updateOrderTimestamp(timestamp)
134134
message.SendDuration = &sendDuration
135+
135136
return message
136137
}
137138

@@ -152,21 +153,30 @@ func (message *Message) Delivered(timestamp time.Time) *Message {
152153
return message
153154
}
154155

156+
// AddSendAttemptCount increments the send attempt count of a message
157+
func (message *Message) AddSendAttemptCount() *Message {
158+
message.SendAttemptCount++
159+
return message
160+
}
161+
155162
// Expired registers a message as expired
156163
func (message *Message) Expired(timestamp time.Time) *Message {
157164
message.ExpiredAt = &timestamp
158165
message.Status = MessageStatusExpired
159166
message.CanBePolled = true
160-
message.SendAttemptCount++
161167
message.updateOrderTimestamp(timestamp)
162168
return message
163169
}
164170

165171
// NotificationScheduled registers a message as scheduled
166172
func (message *Message) NotificationScheduled(timestamp time.Time) *Message {
167173
message.NotificationScheduledAt = &timestamp
168-
message.Status = MessageStatusScheduled
174+
175+
if message.IsExpired() || message.IsPending() {
176+
message.Status = MessageStatusScheduled
177+
}
169178
message.updateOrderTimestamp(timestamp)
179+
170180
return message
171181
}
172182

api/pkg/handlers/message_handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func (h *MessageHandler) GetOutstanding(c *fiber.Ctx) error {
127127
return h.responseUnprocessableEntity(c, errors, "validation errors while fetching outstanding messages")
128128
}
129129

130-
message, err := h.service.GetOutstanding(ctx, request.ToGetOutstandingParams(c.OriginalURL(), h.userIDFomContext(c), timestamp))
130+
message, err := h.service.GetOutstanding(ctx, request.ToGetOutstandingParams(c.Path(), h.userIDFomContext(c), timestamp))
131131
if err != nil {
132132
msg := fmt.Sprintf("cannot get outstnading messgage with ID [%s]", request.MessageID)
133133
ctxLogger.Error(stacktrace.Propagate(err, msg))

api/pkg/listeners/message_listener.go

Lines changed: 51 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,17 @@ func NewMessageListener(
3838
}
3939

4040
return l, map[string]events.EventListener{
41-
events.EventTypeMessageAPISent: l.OnMessageAPISent,
42-
events.EventTypeMessagePhoneSending: l.OnMessagePhoneSending,
43-
events.EventTypeMessagePhoneSent: l.OnMessagePhoneSent,
44-
events.EventTypeMessagePhoneDelivered: l.OnMessagePhoneDelivered,
45-
events.EventTypeMessageSendFailed: l.OnMessagePhoneFailed,
46-
events.EventTypeMessagePhoneReceived: l.OnMessagePhoneReceived,
47-
events.EventTypeMessageNotificationSent: l.onMessageNotificationSent,
48-
events.EventTypeMessageNotificationFailed: l.onMessageNotificationFailed,
49-
events.EventTypeMessageSendExpiredCheck: l.onMessageSendExpiredCheck,
50-
events.EventTypeMessageSendExpired: l.onMessageSendExpired,
41+
events.EventTypeMessageAPISent: l.OnMessageAPISent,
42+
events.EventTypeMessagePhoneSending: l.OnMessagePhoneSending,
43+
events.EventTypeMessagePhoneSent: l.OnMessagePhoneSent,
44+
events.EventTypeMessagePhoneDelivered: l.OnMessagePhoneDelivered,
45+
events.EventTypeMessageSendFailed: l.OnMessagePhoneFailed,
46+
events.EventTypeMessagePhoneReceived: l.OnMessagePhoneReceived,
47+
events.EventTypeMessageNotificationSent: l.onMessageNotificationSent,
48+
events.EventTypeMessageNotificationFailed: l.onMessageNotificationFailed,
49+
events.EventTypeMessageSendExpiredCheck: l.onMessageSendExpiredCheck,
50+
events.EventTypeMessageSendExpired: l.onMessageSendExpired,
51+
events.EventTypeMessageNotificationScheduled: l.onMessageNotificationScheduled,
5152
}
5253
}
5354

@@ -318,23 +319,34 @@ func (listener *MessageListener) onMessageNotificationSent(ctx context.Context,
318319
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
319320
}
320321

321-
storeParams := services.MessageScheduleExpirationParams{
322+
checkParams := services.MessageScheduleExpirationParams{
322323
MessageID: payload.MessageID,
323324
UserID: payload.UserID,
324325
NotificationSentAt: payload.NotificationSentAt,
325326
PhoneID: payload.PhoneID,
326327
Source: event.Source(),
327328
MessageExpirationDuration: payload.MessageExpirationDuration,
328329
}
329-
if err := listener.service.ScheduleExpirationCheck(ctx, storeParams); err != nil {
330-
msg := fmt.Sprintf("cannot exchedule expiration check for ID [%s] and userID [%s]", storeParams.MessageID, storeParams.UserID)
330+
if err := listener.service.ScheduleExpirationCheck(ctx, checkParams); err != nil {
331+
msg := fmt.Sprintf("cannot exchedule expiration check for ID [%s] and userID [%s]", checkParams.MessageID, checkParams.UserID)
332+
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
333+
}
334+
335+
handleParams := services.HandleMessageParams{
336+
ID: payload.MessageID,
337+
UserID: payload.UserID,
338+
Source: event.Source(),
339+
Timestamp: payload.NotificationSentAt,
340+
}
341+
if err := listener.service.HandleMessageNotificationSent(ctx, handleParams); err != nil {
342+
msg := fmt.Sprintf("cannot handle event [%s] for message [%s] and userID [%s]", event.Type(), checkParams.MessageID, checkParams.UserID)
331343
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
332344
}
333345

334346
return nil
335347
}
336348

337-
// onMessageNotificationSent handles the events.EventTypeMessageSendExpiredCheck event
349+
// onMessageSendExpiredCheck handles the events.EventTypeMessageSendExpiredCheck event
338350
func (listener *MessageListener) onMessageSendExpiredCheck(ctx context.Context, event cloudevents.Event) error {
339351
ctx, span := listener.tracer.Start(ctx)
340352
defer span.End()
@@ -383,6 +395,31 @@ func (listener *MessageListener) onMessageSendExpired(ctx context.Context, event
383395
return nil
384396
}
385397

398+
// onMessageNotificationScheduled handles the events.EventTypeMessageSendExpired event
399+
func (listener *MessageListener) onMessageNotificationScheduled(ctx context.Context, event cloudevents.Event) error {
400+
ctx, span := listener.tracer.Start(ctx)
401+
defer span.End()
402+
403+
var payload events.MessageNotificationScheduledPayload
404+
if err := event.DataAs(&payload); err != nil {
405+
msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
406+
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
407+
}
408+
409+
expiredParams := services.HandleMessageParams{
410+
ID: payload.MessageID,
411+
UserID: payload.UserID,
412+
Source: event.Source(),
413+
Timestamp: payload.ScheduledAt,
414+
}
415+
if err := listener.service.HandleMessageNotificationScheduled(ctx, expiredParams); err != nil {
416+
msg := fmt.Sprintf("cannot handle event [%s] for ID [%s] and userID [%s]", event.Type(), expiredParams.ID, expiredParams.UserID)
417+
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
418+
}
419+
420+
return nil
421+
}
422+
386423
func (listener *MessageListener) signature(event cloudevents.Event) string {
387424
return listener.handlerSignature(listener, event)
388425
}

api/pkg/repositories/gorm_event_repository.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@ import (
1616

1717
// GormEvent is a serialized version of cloudevents.Event
1818
type GormEvent struct {
19-
ID uuid.UUID `json:"id" gorm:"primaryKey;type:uuid;"`
20-
Time time.Time
21-
Source string
22-
Type string
23-
Data datatypes.JSON
19+
ID uuid.UUID `json:"id" gorm:"primaryKey;type:uuid;"`
20+
Time time.Time
21+
CreatedAt time.Time
22+
Source string
23+
Type string
24+
Data datatypes.JSON
2425
}
2526

2627
// TableName overrides the table name used by GormEvent to `events`
@@ -81,11 +82,12 @@ func (repository *gormEventRepository) Save(ctx context.Context, event cloudeven
8182
}
8283

8384
gormEvent := GormEvent{
84-
ID: uuid.MustParse(event.ID()),
85-
Time: event.Time(),
86-
Source: event.Source(),
87-
Type: event.Type(),
88-
Data: datatypes.JSON(data),
85+
ID: uuid.MustParse(event.ID()),
86+
Time: event.Time(),
87+
Source: event.Source(),
88+
CreatedAt: time.Now().UTC(),
89+
Type: event.Type(),
90+
Data: datatypes.JSON(data),
8991
}
9092

9193
if err = repository.db.WithContext(ctx).Create(gormEvent).Error; err != nil {

api/pkg/services/event_dispatcher_service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func (dispatcher *EventDispatcher) DispatchWithTimeout(ctx context.Context, even
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)
93+
return dispatcher.DispatchWithTimeout(ctx, event, time.Nanosecond*-1)
9494
}
9595

9696
// Subscribe a listener to an event

api/pkg/services/message_service.go

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -342,11 +342,11 @@ func (service *MessageService) SendMessage(ctx context.Context, params MessageSe
342342

343343
message, err := service.repository.Load(ctx, eventPayload.UserID, eventPayload.ID)
344344
if err != nil {
345-
msg := fmt.Sprintf("cannot load message with ID [%s] in the userRepository", eventPayload.ID)
345+
msg := fmt.Sprintf("cannot load message with ID [%s]", eventPayload.ID)
346346
return nil, service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
347347
}
348348

349-
ctxLogger.Info(fmt.Sprintf("fetched message with id [%s] from the userRepository", message.ID))
349+
ctxLogger.Info(fmt.Sprintf("fetched message with id [%s]", message.ID))
350350

351351
return message, nil
352352
}
@@ -408,7 +408,7 @@ func (service *MessageService) StoreSentMessage(ctx context.Context, params Mess
408408
return nil, service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
409409
}
410410

411-
ctxLogger.Info(fmt.Sprintf("message saved with id [%s] in the userRepository", message.ID))
411+
ctxLogger.Info(fmt.Sprintf("message saved with id [%s]", message.ID))
412412
return message, nil
413413
}
414414

@@ -439,7 +439,7 @@ func (service *MessageService) StoreReceivedMessage(ctx context.Context, params
439439
return nil, service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
440440
}
441441

442-
ctxLogger.Info(fmt.Sprintf("message saved with id [%s] in the userRepository", message.ID))
442+
ctxLogger.Info(fmt.Sprintf("message saved with id [%s]", message.ID))
443443
return message, nil
444444
}
445445

@@ -474,7 +474,7 @@ func (service *MessageService) HandleMessageSending(ctx context.Context, params
474474
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
475475
}
476476

477-
ctxLogger.Info(fmt.Sprintf("message with id [%s] in the userRepository after adding send attempt", message.ID))
477+
ctxLogger.Info(fmt.Sprintf("message with id [%s] in after adding send attempt", message.ID))
478478
return nil
479479
}
480480

@@ -580,6 +580,10 @@ func (service *MessageService) HandleMessageNotificationScheduled(ctx context.Co
580580
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
581581
}
582582

583+
if !message.IsPending() && !message.IsExpired() {
584+
ctxLogger.Warn(stacktrace.NewError(fmt.Sprintf("received scheduled event for message with id [%s] message has status [%s]", message.ID, message.Status)))
585+
}
586+
583587
if err = service.repository.Update(ctx, message.NotificationScheduled(params.Timestamp)); err != nil {
584588
msg := fmt.Sprintf("cannot update message with id [%s] as expired", message.ID)
585589
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
@@ -589,6 +593,28 @@ func (service *MessageService) HandleMessageNotificationScheduled(ctx context.Co
589593
return nil
590594
}
591595

596+
// HandleMessageNotificationSent handles the event when the notification of a message has been sent
597+
func (service *MessageService) HandleMessageNotificationSent(ctx context.Context, params HandleMessageParams) error {
598+
ctx, span := service.tracer.Start(ctx)
599+
defer span.End()
600+
601+
ctxLogger := service.tracer.CtxLogger(service.logger, span)
602+
603+
message, err := service.repository.Load(ctx, params.UserID, params.ID)
604+
if err != nil {
605+
msg := fmt.Sprintf("cannot find message with id [%s]", params.ID)
606+
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
607+
}
608+
609+
if err = service.repository.Update(ctx, message.AddSendAttemptCount()); err != nil {
610+
msg := fmt.Sprintf("cannot update message with id [%s] as expired", message.ID)
611+
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
612+
}
613+
614+
ctxLogger.Info(fmt.Sprintf("notification for message with id [%s] has been sent at [%s]", message.ID, params.Timestamp.String()))
615+
return nil
616+
}
617+
592618
// HandleMessageExpired handles when a message is has been expired
593619
func (service *MessageService) HandleMessageExpired(ctx context.Context, params HandleMessageParams) error {
594620
ctx, span := service.tracer.Start(ctx)

api/pkg/services/phone_notification_service.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,11 @@ func (service *PhoneNotificationService) Schedule(ctx context.Context, params *P
124124
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
125125
}
126126

127-
if err = service.dispatchMessageNotificationSend(ctx, params.Source, notification); err != nil {
128-
return service.tracer.WrapErrorSpan(span, err)
127+
if err = service.dispatchMessageNotificationScheduled(ctx, params, notification); err != nil {
128+
ctxLogger.Error(err)
129129
}
130130

131-
if err = service.dispatchMessageNotificationScheduled(ctx, params, notification); err != nil {
131+
if err = service.dispatchMessageNotificationSend(ctx, params.Source, notification); err != nil {
132132
return service.tracer.WrapErrorSpan(span, err)
133133
}
134134

0 commit comments

Comments
 (0)