Skip to content

Commit dfb21a5

Browse files
committed
[mobile] initial implementation of processing order param
1 parent 6017b10 commit dfb21a5

File tree

6 files changed

+48
-12
lines changed

6 files changed

+48
-12
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
}

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

Lines changed: 5 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,

internal/sms-gateway/handlers/mobile.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,13 +157,31 @@ func (h *mobileHandler) patchDevice(device models.Device, c *fiber.Ctx) error {
157157
// @Tags Device, Messages
158158
// @Accept json
159159
// @Produce json
160+
// @Param order query string false "Message processing order: lifo (default) or fifo" Enums(lifo,fifo)
160161
// @Success 200 {object} smsgateway.MobileGetMessagesResponse "List of pending messages"
162+
// @Failure 400 {object} smsgateway.ErrorResponse "Bad request"
161163
// @Failure 500 {object} smsgateway.ErrorResponse "Internal server error"
162164
// @Router /mobile/v1/message [get]
163165
//
164166
// Get messages for sending
165167
func (h *mobileHandler) getMessage(device models.Device, c *fiber.Ctx) error {
166-
msgs, err := h.messagesSvc.SelectPending(device.ID)
168+
// Get and validate order parameter
169+
orderParam := c.Query("order")
170+
order := "lifo" // Default to LIFO
171+
172+
if orderParam != "" {
173+
orderParam = strings.ToLower(orderParam)
174+
switch orderParam {
175+
case "lifo":
176+
order = "lifo"
177+
case "fifo":
178+
order = "fifo"
179+
default:
180+
return fiber.NewError(fiber.StatusBadRequest, "Invalid order parameter. Must be 'lifo' or 'fifo'")
181+
}
182+
}
183+
184+
msgs, err := h.messagesSvc.SelectPending(device.ID, messages.MessagesOrder(order))
167185
if err != nil {
168186
return fmt.Errorf("can't get messages: %w", err)
169187
}

internal/sms-gateway/modules/messages/repository.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,11 @@ func (r *repository) Select(filter MessagesSelectFilter, options MessagesSelectO
7070
}
7171

7272
// Apply ordering
73-
query = query.Order("messages.priority DESC, messages.id DESC")
73+
if options.OrderBy == MessagesOrderFIFO {
74+
query = query.Order("messages.priority DESC, messages.id ASC")
75+
} else {
76+
query = query.Order("messages.priority DESC, messages.id DESC")
77+
}
7478

7579
// Preload related data
7680
if options.WithRecipients {
@@ -91,13 +95,14 @@ func (r *repository) Select(filter MessagesSelectFilter, options MessagesSelectO
9195
return messages, total, nil
9296
}
9397

94-
func (r *repository) SelectPending(deviceID string) ([]Message, error) {
98+
func (r *repository) SelectPending(deviceID string, order MessagesOrder) ([]Message, error) {
9599
messages, _, err := r.Select(MessagesSelectFilter{
96100
DeviceID: deviceID,
97101
State: ProcessingStatePending,
98102
}, MessagesSelectOptions{
99103
WithRecipients: true,
100104
Limit: 100,
105+
OrderBy: order,
101106
})
102107

103108
return messages, err

internal/sms-gateway/modules/messages/repository_filter.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@ package messages
22

33
import "time"
44

5+
type MessagesOrder string
6+
7+
const (
8+
MessagesOrderLIFO MessagesOrder = "lifo"
9+
MessagesOrderFIFO MessagesOrder = "fifo"
10+
)
11+
512
type MessagesSelectFilter struct {
613
ExtID string
714
UserID string
@@ -16,6 +23,8 @@ type MessagesSelectOptions struct {
1623
WithDevice bool
1724
WithStates bool
1825

26+
OrderBy MessagesOrder
27+
1928
Limit int
2029
Offset int
2130
}

internal/sms-gateway/modules/messages/service.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,12 @@ func (s *Service) RunBackgroundTasks(ctx context.Context, wg *sync.WaitGroup) {
9292
}()
9393
}
9494

95-
func (s *Service) SelectPending(deviceID string) ([]MessageOut, error) {
96-
messages, err := s.messages.SelectPending(deviceID)
95+
func (s *Service) SelectPending(deviceID string, order MessagesOrder) ([]MessageOut, error) {
96+
if order == "" {
97+
order = MessagesOrderLIFO
98+
}
99+
100+
messages, err := s.messages.SelectPending(deviceID, order)
97101
if err != nil {
98102
return nil, err
99103
}

0 commit comments

Comments
 (0)