Skip to content

Commit 2a125d7

Browse files
committed
rename phone notification service
1 parent 2b8bc57 commit 2a125d7

13 files changed

Lines changed: 133 additions & 86 deletions

api/pkg/di/container.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -544,9 +544,9 @@ func (container *Container) RegisterMessageThreadListeners() {
544544
}
545545
}
546546

547-
// RegisterNotificationListeners registers event listeners for listeners.NotificationListener
547+
// RegisterNotificationListeners registers event listeners for listeners.PhoneNotificationListener
548548
func (container *Container) RegisterNotificationListeners() {
549-
container.logger.Debug(fmt.Sprintf("registering listners for %T", listeners.NotificationListener{}))
549+
container.logger.Debug(fmt.Sprintf("registering listners for %T", listeners.PhoneNotificationListener{}))
550550
_, routes := listeners.NewNotificationListener(
551551
container.Logger(),
552552
container.Tracer(),
@@ -583,8 +583,8 @@ func (container *Container) MessageService() (service *services.MessageService)
583583
)
584584
}
585585

586-
// NotificationService creates a new instance of services.NotificationService
587-
func (container *Container) NotificationService() (service *services.NotificationService) {
586+
// NotificationService creates a new instance of services.PhoneNotificationService
587+
func (container *Container) NotificationService() (service *services.PhoneNotificationService) {
588588
container.logger.Debug(fmt.Sprintf("creating %T", service))
589589
return services.NewNotificationService(
590590
container.Logger(),

api/pkg/entities/heartbeat.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,4 @@ type Heartbeat struct {
1212
Owner string `json:"owner" gorm:"index:idx_heartbeats_owner_timestamp" example:"+18005550199"`
1313
UserID UserID `json:"userID" example:"WB7DRDWrJZRGbYrv2CKGkqbzvqdC"`
1414
Timestamp time.Time `json:"timestamp" gorm:"index:idx_heartbeats_owner_timestamp" example:"2022-06-05T14:26:01.520828+03:00"`
15-
MessageID uuid.UUID `json:"message_id" example:"32343a19-da5e-4b1b-a767-3298a73703cb"`
1615
}

api/pkg/events/message_phone_heartbeat_event.go

Lines changed: 0 additions & 15 deletions
This file was deleted.

api/pkg/handlers/handler.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ func (h *handler) responseOK(c *fiber.Ctx, message string, data interface{}) err
7272
})
7373
}
7474

75+
func (h *handler) responseCreated(c *fiber.Ctx, message string, data interface{}) error {
76+
return c.Status(fiber.StatusCreated).JSON(fiber.Map{
77+
"status": "success",
78+
"message": message,
79+
"data": data,
80+
})
81+
}
82+
7583
func (h *handler) pluralize(value string, count int) string {
7684
if count == 1 {
7785
return value

api/pkg/handlers/heartbeat_handler.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,46 @@ func (h *HeartbeatHandler) Index(c *fiber.Ctx) error {
8686

8787
return h.responseOK(c, fmt.Sprintf("fetched %d %s", len(*heartbeats), h.pluralize("heartbeat", len(*heartbeats))), heartbeats)
8888
}
89+
90+
// Store the heartbeat of a phone number
91+
// @Summary Register heartbeat of an owner phone number
92+
// @Description Store the heartbeat to make notify that a phone number is still active
93+
// @Security ApiKeyAuth
94+
// @Tags Heartbeats
95+
// @Accept json
96+
// @Produce json
97+
// @Param payload body requests.HeartbeatStore true "Payload of the heartbeat request"
98+
// @Success 200 {object} responses.HeartbeatResponse
99+
// @Failure 400 {object} responses.BadRequest
100+
// @Failure 401 {object} responses.Unauthorized
101+
// @Failure 422 {object} responses.UnprocessableEntity
102+
// @Failure 500 {object} responses.InternalServerError
103+
// @Router /heartbeats [post]
104+
func (h *HeartbeatHandler) Store(c *fiber.Ctx) error {
105+
ctx, span := h.tracer.StartFromFiberCtx(c)
106+
defer span.End()
107+
108+
ctxLogger := h.tracer.CtxLogger(h.logger, span)
109+
110+
var request requests.HeartbeatStore
111+
if err := c.QueryParser(&request); err != nil {
112+
msg := fmt.Sprintf("cannot marshall params [%s] into %T", c.OriginalURL(), request)
113+
ctxLogger.Warn(stacktrace.Propagate(err, msg))
114+
return h.responseBadRequest(c, err)
115+
}
116+
117+
if errors := h.validator.ValidateStore(ctx, request.Sanitize()); len(errors) != 0 {
118+
msg := fmt.Sprintf("validation errors [%s], while storing heartbeat [%+#v]", spew.Sdump(errors), request)
119+
ctxLogger.Warn(stacktrace.NewError(msg))
120+
return h.responseUnprocessableEntity(c, errors, "validation errors while storing heartbeat")
121+
}
122+
123+
heartbeat, err := h.service.Store(ctx, request.ToStoreParams(h.userFromContext(c)))
124+
if err != nil {
125+
msg := fmt.Sprintf("cannot store heartbeat with params [%+#v]", request)
126+
ctxLogger.Error(stacktrace.Propagate(err, msg))
127+
return h.responseInternalServerError(c)
128+
}
129+
130+
return h.responseCreated(c, "heartbeat created successfully", heartbeat)
131+
}
Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package listeners
22

33
import (
4-
"context"
54
"fmt"
65

76
"github.com/NdoleStudio/httpsms/pkg/events"
87
"github.com/NdoleStudio/httpsms/pkg/services"
98
"github.com/NdoleStudio/httpsms/pkg/telemetry"
10-
cloudevents "github.com/cloudevents/sdk-go/v2"
11-
"github.com/palantir/stacktrace"
129
)
1310

1411
// HeartbeatListener handles cloud events which need to register entities.Heartbeat
@@ -30,33 +27,5 @@ func NewHeartbeatListener(
3027
service: service,
3128
}
3229

33-
return l, map[string]events.EventListener{
34-
events.EventTypeMessagePhoneSending: l.onMessagePhoneSending,
35-
}
36-
}
37-
38-
// onMessagePhoneSending handles the events.EventTypeMessagePhoneSending event
39-
func (listener *HeartbeatListener) onMessagePhoneSending(ctx context.Context, event cloudevents.Event) error {
40-
ctx, span := listener.tracer.Start(ctx)
41-
defer span.End()
42-
43-
var payload events.MessagePhoneSendingPayload
44-
if err := event.DataAs(&payload); err != nil {
45-
msg := fmt.Sprintf("cannot decode [%s] into [%T]", event.Data(), payload)
46-
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
47-
}
48-
49-
storeParams := services.HeartbeatStoreParams{
50-
Owner: payload.Owner,
51-
Timestamp: payload.Timestamp,
52-
UserID: payload.UserID,
53-
MessageID: payload.ID,
54-
}
55-
56-
if _, err := listener.service.Store(ctx, storeParams); err != nil {
57-
msg := fmt.Sprintf("cannot store heartbeat with params [%+#v] for event with ID [%s]", storeParams, event.ID())
58-
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
59-
}
60-
61-
return nil
30+
return l, map[string]events.EventListener{}
6231
}

api/pkg/listeners/notification_listener.go renamed to api/pkg/listeners/phone_notification_listener.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,20 @@ import (
1313
"github.com/palantir/stacktrace"
1414
)
1515

16-
// NotificationListener handles cloud events which sends notifications
17-
type NotificationListener struct {
16+
// PhoneNotificationListener handles cloud events which sends notifications
17+
type PhoneNotificationListener struct {
1818
logger telemetry.Logger
1919
tracer telemetry.Tracer
20-
service *services.NotificationService
20+
service *services.PhoneNotificationService
2121
}
2222

23-
// NewNotificationListener creates a new instance of NotificationListener
23+
// NewNotificationListener creates a new instance of PhoneNotificationListener
2424
func NewNotificationListener(
2525
logger telemetry.Logger,
2626
tracer telemetry.Tracer,
27-
service *services.NotificationService,
28-
) (l *NotificationListener, routes map[string]events.EventListener) {
29-
l = &NotificationListener{
27+
service *services.PhoneNotificationService,
28+
) (l *PhoneNotificationListener, routes map[string]events.EventListener) {
29+
l = &PhoneNotificationListener{
3030
logger: logger.WithService(fmt.Sprintf("%T", l)),
3131
tracer: tracer,
3232
service: service,
@@ -39,7 +39,7 @@ func NewNotificationListener(
3939
}
4040

4141
// onMessageAPISent handles the events.EventTypeMessageAPISent event
42-
func (listener *NotificationListener) onMessageAPISent(ctx context.Context, event cloudevents.Event) error {
42+
func (listener *PhoneNotificationListener) onMessageAPISent(ctx context.Context, event cloudevents.Event) error {
4343
ctx, span := listener.tracer.Start(ctx)
4444
defer span.End()
4545

@@ -49,7 +49,7 @@ func (listener *NotificationListener) onMessageAPISent(ctx context.Context, even
4949
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
5050
}
5151

52-
sendParams := &services.NotificationScheduleParams{
52+
sendParams := &services.PhoneNotificationScheduleParams{
5353
UserID: payload.UserID,
5454
Owner: payload.Owner,
5555
Source: event.Source(),
@@ -65,7 +65,7 @@ func (listener *NotificationListener) onMessageAPISent(ctx context.Context, even
6565
}
6666

6767
// onMessageNotificationScheduled handles the events.EventTypeMessageNotificationScheduled event
68-
func (listener *NotificationListener) onMessageNotificationScheduled(ctx context.Context, event cloudevents.Event) error {
68+
func (listener *PhoneNotificationListener) onMessageNotificationScheduled(ctx context.Context, event cloudevents.Event) error {
6969
ctx, span := listener.tracer.Start(ctx)
7070
defer span.End()
7171

@@ -75,7 +75,7 @@ func (listener *NotificationListener) onMessageNotificationScheduled(ctx context
7575
return listener.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
7676
}
7777

78-
scheduleParams := &services.NotificationSendParams{
78+
scheduleParams := &services.PhoneNotificationSendParams{
7979
UserID: payload.UserID,
8080
PhoneID: payload.PhoneID,
8181
Source: event.Source(),
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package requests
2+
3+
import (
4+
"time"
5+
6+
"github.com/NdoleStudio/httpsms/pkg/entities"
7+
"github.com/NdoleStudio/httpsms/pkg/services"
8+
)
9+
10+
// HeartbeatStore is the payload for fetching entities.Heartbeat of a phone number
11+
type HeartbeatStore struct {
12+
request
13+
Owner string `json:"owner"`
14+
}
15+
16+
// Sanitize sets defaults to MessageOutstanding
17+
func (input *HeartbeatStore) Sanitize() HeartbeatStore {
18+
input.Owner = input.sanitizeAddress(input.Owner)
19+
return *input
20+
}
21+
22+
// ToStoreParams converts HeartbeatIndex to repositories.IndexParams
23+
func (input *HeartbeatStore) ToStoreParams(user entities.AuthUser) services.HeartbeatStoreParams {
24+
return services.HeartbeatStoreParams{
25+
Owner: input.Owner,
26+
Timestamp: time.Now().UTC(),
27+
UserID: user.ID,
28+
}
29+
}

api/pkg/responses/heartbeat_responses.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,9 @@ type HeartbeatsResponse struct {
77
response
88
Data []entities.Heartbeat `json:"data"`
99
}
10+
11+
// HeartbeatResponse is the payload containing entities.Heartbeat
12+
type HeartbeatResponse struct {
13+
response
14+
Data entities.Heartbeat `json:"data"`
15+
}

api/pkg/services/heartbeat_service.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ type HeartbeatStoreParams struct {
5656
Owner string
5757
Timestamp time.Time
5858
UserID entities.UserID
59-
MessageID uuid.UUID
6059
}
6160

6261
// Store a new entities.Heartbeat
@@ -70,7 +69,6 @@ func (service *HeartbeatService) Store(ctx context.Context, params HeartbeatStor
7069
ID: uuid.New(),
7170
Owner: params.Owner,
7271
Timestamp: params.Timestamp,
73-
MessageID: params.MessageID,
7472
UserID: params.UserID,
7573
}
7674

0 commit comments

Comments
 (0)