Skip to content

Commit 9f8925c

Browse files
committed
[mobile] add order param for GET /message endpoint
1 parent 1a1b49f commit 9f8925c

File tree

10 files changed

+231
-103
lines changed

10 files changed

+231
-103
lines changed

internal/sms-gateway/handlers/messages/3rdparty.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ type ThirdPartyController struct {
6060
//
6161
// Enqueue message
6262
func (h *ThirdPartyController) post(user models.User, c *fiber.Ctx) error {
63-
var params postQueryParams
63+
var params thirdPartyPostQueryParams
6464
if err := h.QueryParserValidator(c, &params); err != nil {
6565
return fiber.NewError(fiber.StatusBadRequest, err.Error())
6666
}
@@ -190,7 +190,7 @@ func (h *ThirdPartyController) post(user models.User, c *fiber.Ctx) error {
190190
//
191191
// Get message history
192192
func (h *ThirdPartyController) list(user models.User, c *fiber.Ctx) error {
193-
params := getQueryParams{}
193+
params := thirdPartyGetQueryParams{}
194194
if err := h.QueryParserValidator(c, &params); err != nil {
195195
return fiber.NewError(fiber.StatusBadRequest, err.Error())
196196
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package messages
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
7+
"github.com/android-sms-gateway/client-go/smsgateway"
8+
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/base"
9+
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/converters"
10+
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/deviceauth"
11+
"github.com/android-sms-gateway/server/internal/sms-gateway/models"
12+
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/messages"
13+
"github.com/capcom6/go-helpers/slices"
14+
"github.com/go-playground/validator/v10"
15+
"github.com/gofiber/fiber/v2"
16+
"go.uber.org/fx"
17+
"go.uber.org/zap"
18+
)
19+
20+
type mobileControllerParams struct {
21+
fx.In
22+
23+
MessagesSvc *messages.Service
24+
25+
Validator *validator.Validate
26+
Logger *zap.Logger
27+
}
28+
29+
type MobileController struct {
30+
base.Handler
31+
32+
messagesSvc *messages.Service
33+
}
34+
35+
// @Summary Get messages for sending
36+
// @Description Returns list of pending messages
37+
// @Security MobileToken
38+
// @Tags Device, Messages
39+
// @Accept json
40+
// @Produce json
41+
// @Param order query string false "Message processing order: lifo (default) or fifo" Enums(lifo,fifo) default(lifo)
42+
// @Success 200 {object} smsgateway.MobileGetMessagesResponse "List of pending messages"
43+
// @Failure 400 {object} smsgateway.ErrorResponse "Invalid request"
44+
// @Failure 500 {object} smsgateway.ErrorResponse "Internal server error"
45+
// @Router /mobile/v1/message [get]
46+
//
47+
// Get messages for sending
48+
func (h *MobileController) list(device models.Device, c *fiber.Ctx) error {
49+
// Get and validate order parameter
50+
params := mobileGetQueryParams{}
51+
if err := h.QueryParserValidator(c, &params); err != nil {
52+
return fiber.NewError(fiber.StatusBadRequest, err.Error())
53+
}
54+
55+
msgs, err := h.messagesSvc.SelectPending(device.ID, params.OrderOrDefault())
56+
if err != nil {
57+
return fmt.Errorf("can't get messages: %w", err)
58+
}
59+
60+
return c.JSON(
61+
smsgateway.MobileGetMessagesResponse(
62+
slices.Map(
63+
msgs,
64+
converters.MessageToMobileDTO,
65+
),
66+
),
67+
)
68+
}
69+
70+
// @Summary Update message state
71+
// @Description Updates message state
72+
// @Security MobileToken
73+
// @Tags Device, Messages
74+
// @Accept json
75+
// @Produce json
76+
// @Param request body smsgateway.MobilePatchMessageRequest true "List of message state updates"
77+
// @Success 204 {object} nil "Successfully updated"
78+
// @Failure 400 {object} smsgateway.ErrorResponse "Invalid request"
79+
// @Failure 500 {object} smsgateway.ErrorResponse "Internal server error"
80+
// @Router /mobile/v1/message [patch]
81+
//
82+
// Update message state
83+
func (h *MobileController) patch(device models.Device, c *fiber.Ctx) error {
84+
var req smsgateway.MobilePatchMessageRequest
85+
if err := h.BodyParserValidator(c, &req); err != nil {
86+
return fiber.NewError(fiber.StatusBadRequest, err.Error())
87+
}
88+
89+
for _, v := range req {
90+
messageState := messages.MessageStateIn{
91+
ID: v.ID,
92+
State: messages.ProcessingState(v.State),
93+
Recipients: v.Recipients,
94+
States: v.States,
95+
}
96+
97+
err := h.messagesSvc.UpdateState(device.ID, messageState)
98+
if err != nil && !errors.Is(err, messages.ErrMessageNotFound) {
99+
h.Logger.Error("Can't update message status",
100+
zap.String("message_id", v.ID),
101+
zap.Error(err),
102+
)
103+
}
104+
}
105+
106+
return c.SendStatus(fiber.StatusNoContent)
107+
}
108+
109+
func (h *MobileController) Register(router fiber.Router) {
110+
router.Get("", deviceauth.WithDevice(h.list))
111+
router.Patch("", deviceauth.WithDevice(h.patch))
112+
}
113+
114+
func NewMobileController(params mobileControllerParams) *MobileController {
115+
return &MobileController{
116+
Handler: base.Handler{
117+
Logger: params.Logger.Named("messages"),
118+
Validator: params.Validator,
119+
},
120+
messagesSvc: params.MessagesSvc,
121+
}
122+
}

internal/sms-gateway/handlers/messages/params.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import (
77
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/messages"
88
)
99

10-
type postQueryParams struct {
10+
type thirdPartyPostQueryParams struct {
1111
SkipPhoneValidation bool `query:"skipPhoneValidation"`
1212
DeviceActiveWithin uint `query:"deviceActiveWithin"`
1313
}
1414

15-
type getQueryParams struct {
15+
type thirdPartyGetQueryParams struct {
1616
StartDate string `query:"from" validate:"omitempty,datetime=2006-01-02T15:04:05Z07:00"`
1717
EndDate string `query:"to" validate:"omitempty,datetime=2006-01-02T15:04:05Z07:00"`
1818
State string `query:"state" validate:"omitempty,oneof=Pending Processed Sent Delivered Failed"`
@@ -21,15 +21,15 @@ type getQueryParams struct {
2121
Offset int `query:"offset" validate:"omitempty,min=0"`
2222
}
2323

24-
func (p *getQueryParams) Validate() error {
24+
func (p *thirdPartyGetQueryParams) Validate() error {
2525
if p.StartDate != "" && p.EndDate != "" && p.StartDate > p.EndDate {
2626
return fmt.Errorf("`from` date must be before `to` date")
2727
}
2828

2929
return nil
3030
}
3131

32-
func (p *getQueryParams) ToFilter() messages.MessagesSelectFilter {
32+
func (p *thirdPartyGetQueryParams) ToFilter() messages.MessagesSelectFilter {
3333
filter := messages.MessagesSelectFilter{}
3434

3535
if p.StartDate != "" {
@@ -55,7 +55,7 @@ func (p *getQueryParams) ToFilter() messages.MessagesSelectFilter {
5555
return filter
5656
}
5757

58-
func (p *getQueryParams) ToOptions() messages.MessagesSelectOptions {
58+
func (p *thirdPartyGetQueryParams) ToOptions() messages.MessagesSelectOptions {
5959
options := messages.MessagesSelectOptions{
6060
WithRecipients: true,
6161
WithStates: true,
@@ -73,3 +73,15 @@ func (p *getQueryParams) ToOptions() messages.MessagesSelectOptions {
7373

7474
return options
7575
}
76+
77+
type mobileGetQueryParams struct {
78+
Order messages.MessagesOrder `query:"order" validate:"omitempty,oneof=lifo fifo"`
79+
}
80+
81+
func (p *mobileGetQueryParams) OrderOrDefault() messages.MessagesOrder {
82+
if p.Order != "" {
83+
return p.Order
84+
}
85+
return messages.MessagesOrderLIFO
86+
87+
}

internal/sms-gateway/handlers/mobile.go

Lines changed: 27 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
11
package handlers
22

33
import (
4-
"errors"
54
"fmt"
65
"strings"
76

87
"github.com/android-sms-gateway/client-go/smsgateway"
98
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/base"
109
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/converters"
1110
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/events"
11+
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/messages"
1212
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/deviceauth"
1313
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/userauth"
1414
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/settings"
1515
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/webhooks"
1616
"github.com/android-sms-gateway/server/internal/sms-gateway/models"
1717
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/auth"
1818
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
19-
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/messages"
2019
"github.com/capcom6/go-helpers/anys"
21-
"github.com/capcom6/go-helpers/slices"
2220
"github.com/go-playground/validator/v10"
2321
"github.com/gofiber/fiber/v2"
2422
"github.com/gofiber/fiber/v2/middleware/keyauth"
@@ -27,13 +25,28 @@ import (
2725
"go.uber.org/zap"
2826
)
2927

28+
type mobileHandlerParams struct {
29+
fx.In
30+
31+
Logger *zap.Logger
32+
Validator *validator.Validate
33+
34+
AuthSvc *auth.Service
35+
DevicesSvc *devices.Service
36+
37+
MessagesCtrl *messages.MobileController
38+
WebhooksCtrl *webhooks.MobileController
39+
SettingsCtrl *settings.MobileController
40+
EventsCtrl *events.MobileController
41+
}
42+
3043
type mobileHandler struct {
3144
base.Handler
3245

33-
authSvc *auth.Service
34-
devicesSvc *devices.Service
35-
messagesSvc *messages.Service
46+
authSvc *auth.Service
47+
devicesSvc *devices.Service
3648

49+
messagesCtrl *messages.MobileController
3750
webhooksCtrl *webhooks.MobileController
3851
settingsCtrl *settings.MobileController
3952
eventsCtrl *events.MobileController
@@ -151,69 +164,6 @@ func (h *mobileHandler) patchDevice(device models.Device, c *fiber.Ctx) error {
151164
return c.SendStatus(fiber.StatusNoContent)
152165
}
153166

154-
// @Summary Get messages for sending
155-
// @Description Returns list of pending messages
156-
// @Security MobileToken
157-
// @Tags Device, Messages
158-
// @Accept json
159-
// @Produce json
160-
// @Success 200 {object} smsgateway.MobileGetMessagesResponse "List of pending messages"
161-
// @Failure 500 {object} smsgateway.ErrorResponse "Internal server error"
162-
// @Router /mobile/v1/message [get]
163-
//
164-
// Get messages for sending
165-
func (h *mobileHandler) getMessage(device models.Device, c *fiber.Ctx) error {
166-
msgs, err := h.messagesSvc.SelectPending(device.ID)
167-
if err != nil {
168-
return fmt.Errorf("can't get messages: %w", err)
169-
}
170-
171-
return c.JSON(
172-
smsgateway.MobileGetMessagesResponse(
173-
slices.Map(
174-
msgs,
175-
converters.MessageToMobileDTO,
176-
),
177-
),
178-
)
179-
}
180-
181-
// @Summary Update message state
182-
// @Description Updates message state
183-
// @Security MobileToken
184-
// @Tags Device, Messages
185-
// @Accept json
186-
// @Produce json
187-
// @Param request body smsgateway.MobilePatchMessageRequest true "List of message state updates"
188-
// @Success 204 {object} nil "Successfully updated"
189-
// @Failure 400 {object} smsgateway.ErrorResponse "Invalid request"
190-
// @Failure 500 {object} smsgateway.ErrorResponse "Internal server error"
191-
// @Router /mobile/v1/message [patch]
192-
//
193-
// Update message state
194-
func (h *mobileHandler) patchMessage(device models.Device, c *fiber.Ctx) error {
195-
var req smsgateway.MobilePatchMessageRequest
196-
if err := c.BodyParser(&req); err != nil {
197-
return fiber.NewError(fiber.StatusBadRequest, err.Error())
198-
}
199-
200-
for _, v := range req {
201-
messageState := messages.MessageStateIn{
202-
ID: v.ID,
203-
State: messages.ProcessingState(v.State),
204-
Recipients: v.Recipients,
205-
States: v.States,
206-
}
207-
208-
err := h.messagesSvc.UpdateState(device.ID, messageState)
209-
if err != nil && !errors.Is(err, messages.ErrMessageNotFound) {
210-
h.Logger.Error("Can't update message status", zap.Error(err))
211-
}
212-
}
213-
214-
return c.SendStatus(fiber.StatusNoContent)
215-
}
216-
217167
// @Summary Get one-time code for device registration
218168
// @Description Returns one-time code for device registration
219169
// @Security ApiAuth
@@ -303,43 +253,29 @@ func (h *mobileHandler) Register(router fiber.Router) {
303253

304254
router.Patch("/device", deviceauth.WithDevice(h.patchDevice))
305255

306-
router.Get("/message", deviceauth.WithDevice(h.getMessage))
307-
router.Patch("/message", deviceauth.WithDevice(h.patchMessage))
308-
309256
// Should be under `userauth.NewBasic` protection instead of `deviceauth`
310257
router.Patch("/user/password", deviceauth.WithDevice(h.changePassword))
311258

259+
h.messagesCtrl.Register(router.Group("/message"))
260+
h.messagesCtrl.Register(router.Group("/messages"))
312261
h.webhooksCtrl.Register(router.Group("/webhooks"))
313262
h.settingsCtrl.Register(router.Group("/settings"))
314263
h.eventsCtrl.Register(router.Group("/events"))
315264
}
316265

317-
type mobileHandlerParams struct {
318-
fx.In
319-
320-
Logger *zap.Logger
321-
Validator *validator.Validate
322-
323-
AuthSvc *auth.Service
324-
DevicesSvc *devices.Service
325-
MessagesSvc *messages.Service
326-
327-
WebhooksCtrl *webhooks.MobileController
328-
SettingsCtrl *settings.MobileController
329-
EventsCtrl *events.MobileController
330-
}
331-
332266
func newMobileHandler(params mobileHandlerParams) *mobileHandler {
333267
idGen, _ := nanoid.Standard(21)
334268

335269
return &mobileHandler{
336-
Handler: base.Handler{Logger: params.Logger, Validator: params.Validator},
337-
authSvc: params.AuthSvc,
270+
Handler: base.Handler{Logger: params.Logger, Validator: params.Validator},
271+
authSvc: params.AuthSvc,
272+
273+
messagesCtrl: params.MessagesCtrl,
338274
devicesSvc: params.DevicesSvc,
339-
messagesSvc: params.MessagesSvc,
340275
webhooksCtrl: params.WebhooksCtrl,
341276
settingsCtrl: params.SettingsCtrl,
342277
eventsCtrl: params.EventsCtrl,
343-
idGen: idGen,
278+
279+
idGen: idGen,
344280
}
345281
}

internal/sms-gateway/handlers/module.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ var Module = fx.Module(
2626
fx.Provide(
2727
newHealthHandler,
2828
messages.NewThirdPartyController,
29+
messages.NewMobileController,
2930
webhooks.NewThirdPartyController,
3031
webhooks.NewMobileController,
3132
devices.NewThirdPartyController,

0 commit comments

Comments
 (0)