Skip to content

Commit f9f7ea2

Browse files
committed
[devices] SIM cards info support
1 parent 528e901 commit f9f7ea2

31 files changed

Lines changed: 513 additions & 289 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.25.0
44

55
require (
66
firebase.google.com/go/v4 v4.19.0
7-
github.com/android-sms-gateway/client-go v1.12.9-0.20260519005959-eae21b02f80f
7+
github.com/android-sms-gateway/client-go v1.12.10-0.20260524050942-22cc236032cd
88
github.com/ansrivas/fiberprometheus/v2 v2.6.1
99
github.com/capcom6/go-helpers v0.3.0
1010
github.com/capcom6/go-infra-fx v0.5.2

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV
5252
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
5353
github.com/android-sms-gateway/client-go v1.12.9-0.20260519005959-eae21b02f80f h1:NdX7nE17ObbkQcVyJPeAsZ9kvVtCbHu0hdB4/12UkqM=
5454
github.com/android-sms-gateway/client-go v1.12.9-0.20260519005959-eae21b02f80f/go.mod h1:DQsReciU1xcaVW3T5Z2bqslNdsAwCFCtghawmA6g6L4=
55+
github.com/android-sms-gateway/client-go v1.12.10-0.20260524050942-22cc236032cd h1:SmQFhgS3gOcCjkVBaslbxxgISlyvPIN9RVpMTT3Mv/A=
56+
github.com/android-sms-gateway/client-go v1.12.10-0.20260524050942-22cc236032cd/go.mod h1:DQsReciU1xcaVW3T5Z2bqslNdsAwCFCtghawmA6g6L4=
5557
github.com/andybalholm/brotli v1.2.1 h1:R+f5xP285VArJDRgowrfb9DqL18yVK0gKAW/F+eTWro=
5658
github.com/andybalholm/brotli v1.2.1/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
5759
github.com/ansrivas/fiberprometheus/v2 v2.6.1 h1:wac3pXaE6BYYTF04AC6K0ktk6vCD+MnDOJZ3SK66kXM=

internal/sms-gateway/handlers/converters/devices.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,35 @@ package converters
22

33
import (
44
"github.com/android-sms-gateway/client-go/smsgateway"
5-
"github.com/android-sms-gateway/server/internal/sms-gateway/models"
5+
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
66
"github.com/capcom6/go-helpers/anys"
7+
"github.com/samber/lo"
78
)
89

9-
func DeviceToDTO(device models.Device) smsgateway.Device {
10+
func DeviceToDTO(device devices.Device) smsgateway.Device {
1011
return smsgateway.Device{
1112
ID: device.ID,
1213
Name: anys.OrDefault(device.Name, ""),
1314
CreatedAt: device.CreatedAt,
1415
UpdatedAt: device.UpdatedAt,
1516
DeletedAt: device.DeletedAt,
1617
LastSeen: device.LastSeen,
18+
SimCards: mapSimCards(device.SimCards),
1719
}
1820
}
21+
22+
func mapSimCards(simCards []devices.SimCard) []smsgateway.SimCard {
23+
if simCards == nil {
24+
return nil
25+
}
26+
27+
return lo.Map(simCards, func(sc devices.SimCard, _ int) smsgateway.SimCard {
28+
return smsgateway.SimCard{
29+
SlotIndex: sc.SlotIndex,
30+
SimNumber: sc.SimNumber,
31+
PhoneNumber: sc.PhoneNumber,
32+
CarrierName: sc.CarrierName,
33+
ICCID: sc.ICCID,
34+
}
35+
})
36+
}

internal/sms-gateway/handlers/converters/devices_test.go

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import (
66

77
"github.com/android-sms-gateway/client-go/smsgateway"
88
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/converters"
9-
"github.com/android-sms-gateway/server/internal/sms-gateway/models"
10-
"github.com/capcom6/go-helpers/anys"
9+
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
1110
"github.com/go-playground/assert/v2"
11+
"github.com/samber/lo"
1212
)
1313

1414
func TestDeviceToDTO(t *testing.T) {
@@ -18,26 +18,27 @@ func TestDeviceToDTO(t *testing.T) {
1818

1919
tests := []struct {
2020
name string
21-
device models.Device
21+
device devices.Device
2222
expected smsgateway.Device
2323
}{
2424
{
2525
name: "empty device",
26-
device: models.Device{},
26+
device: devices.Device{},
2727
expected: smsgateway.Device{},
2828
},
2929
{
3030
name: "non-empty device",
31-
device: models.Device{
32-
ID: "test-id",
33-
Name: anys.AsPointer("test-name"),
34-
LastSeen: lastSeenAt,
35-
SoftDeletableModel: models.SoftDeletableModel{
36-
TimedModel: models.TimedModel{
37-
CreatedAt: createdAt,
38-
UpdatedAt: updatedAt,
31+
device: devices.Device{
32+
DeviceInput: devices.DeviceInput{
33+
DeviceInfo: devices.DeviceInfo{
34+
DeviceUpdate: devices.DeviceUpdate{},
35+
Name: lo.ToPtr("test-name"),
3936
},
37+
ID: "test-id",
4038
},
39+
LastSeen: lastSeenAt,
40+
CreatedAt: createdAt,
41+
UpdatedAt: updatedAt,
4142
},
4243
expected: smsgateway.Device{
4344
ID: "test-id",
@@ -49,15 +50,52 @@ func TestDeviceToDTO(t *testing.T) {
4950
},
5051
{
5152
name: "device with nil name",
52-
device: models.Device{
53-
ID: "test-id",
54-
Name: nil,
53+
device: devices.Device{
54+
DeviceInput: devices.DeviceInput{
55+
DeviceInfo: devices.DeviceInfo{
56+
Name: nil,
57+
},
58+
ID: "test-id",
59+
},
5560
},
5661
expected: smsgateway.Device{
5762
ID: "test-id",
5863
Name: "",
5964
},
6065
},
66+
{
67+
name: "device with sim cards",
68+
device: devices.Device{
69+
DeviceInput: devices.DeviceInput{
70+
DeviceInfo: devices.DeviceInfo{
71+
DeviceUpdate: devices.DeviceUpdate{
72+
SimCards: []devices.SimCard{
73+
{
74+
SlotIndex: 0,
75+
SimNumber: 1,
76+
PhoneNumber: lo.ToPtr("+79990001234"),
77+
CarrierName: lo.ToPtr("Carrier"),
78+
ICCID: lo.ToPtr("8901260000000000000"),
79+
},
80+
},
81+
},
82+
},
83+
ID: "test-id",
84+
},
85+
},
86+
expected: smsgateway.Device{
87+
ID: "test-id",
88+
SimCards: []smsgateway.SimCard{
89+
{
90+
SlotIndex: 0,
91+
SimNumber: 1,
92+
PhoneNumber: lo.ToPtr("+79990001234"),
93+
CarrierName: lo.ToPtr("Carrier"),
94+
ICCID: lo.ToPtr("8901260000000000000"),
95+
},
96+
},
97+
},
98+
},
6199
}
62100

63101
for _, test := range tests {

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ import (
44
"errors"
55
"fmt"
66

7+
"github.com/android-sms-gateway/client-go/smsgateway"
78
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/base"
89
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/converters"
910
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/permissions"
1011
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/userauth"
1112
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
12-
"github.com/capcom6/go-helpers/slices"
1313
"github.com/go-playground/validator/v10"
1414
"github.com/gofiber/fiber/v2"
15+
"github.com/samber/lo"
1516
"go.uber.org/zap"
1617
)
1718

@@ -50,14 +51,17 @@ func NewThirdPartyController(
5051
//
5152
// List devices.
5253
func (h *ThirdPartyController) get(userID string, c *fiber.Ctx) error {
53-
devices, err := h.devicesSvc.Select(userID)
54+
items, err := h.devicesSvc.Select(c.Context(), userID)
5455
if err != nil {
5556
return fmt.Errorf("failed to select devices: %w", err)
5657
}
5758

58-
response := slices.Map(devices, converters.DeviceToDTO)
59-
60-
return c.JSON(response)
59+
return c.JSON(lo.Map(
60+
items,
61+
func(device devices.Device, _ int) smsgateway.Device {
62+
return converters.DeviceToDTO(device)
63+
},
64+
))
6165
}
6266

6367
// @Summary Remove device
@@ -79,7 +83,7 @@ func (h *ThirdPartyController) get(userID string, c *fiber.Ctx) error {
7983
func (h *ThirdPartyController) remove(userID string, c *fiber.Ctx) error {
8084
id := c.Params("id")
8185

82-
err := h.devicesSvc.Remove(userID, devices.WithID(id))
86+
err := h.devicesSvc.Remove(c.Context(), userID, devices.WithID(id))
8387
if errors.Is(err, devices.ErrNotFound) {
8488
return fiber.NewError(fiber.StatusNotFound, err.Error())
8589
}

internal/sms-gateway/handlers/events/mobile.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package events
33
import (
44
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/base"
55
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/deviceauth"
6-
"github.com/android-sms-gateway/server/internal/sms-gateway/models"
6+
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
77
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/sse"
88
"github.com/go-playground/validator/v10"
99
"github.com/gofiber/fiber/v2"
@@ -42,7 +42,7 @@ func NewMobileController(sseService *sse.Service, validator *validator.Validate,
4242
// @Router /mobile/v1/events [get]
4343
//
4444
// Get events.
45-
func (h *MobileController) get(device models.Device, c *fiber.Ctx) error {
45+
func (h *MobileController) get(device devices.Device, c *fiber.Ctx) error {
4646
return h.sseSvc.Handler(device.ID, c) //nolint:wrapcheck //wrapped internally
4747
}
4848

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ func (h *ThirdPartyController) post(userID string, c *fiber.Ctx) error {
9191
}
9292

9393
device, err := h.devicesSvc.GetAny(
94+
c.Context(),
9495
userID,
9596
req.DeviceID,
9697
time.Duration(params.DeviceActiveWithin)*time.Hour,
@@ -249,14 +250,14 @@ func (h *ThirdPartyController) get(userID string, c *fiber.Ctx) error {
249250
//
250251
// Deprecated: use /3rdparty/v1/inbox/refresh instead.
251252
func (h *ThirdPartyController) postInboxExport(userID string, c *fiber.Ctx) error {
252-
req := new(smsgateway.MessagesExportRequest)
253+
req := new(smsgateway.InboxRefreshRequest)
253254
if err := h.BodyParserValidator(c, req); err != nil {
254255
return fiber.NewError(fiber.StatusBadRequest, err.Error())
255256
}
256257

257258
if err := h.inboxSvc.Refresh(
258259
userID,
259-
&req.DeviceID,
260+
req.DeviceID,
260261
req.Since,
261262
req.Until,
262263
[]smsgateway.IncomingMessageType{smsgateway.IncomingMessageTypeSMS},

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/base"
99
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/converters"
1010
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/deviceauth"
11-
"github.com/android-sms-gateway/server/internal/sms-gateway/models"
11+
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
1212
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/messages"
1313
"github.com/capcom6/go-helpers/slices"
1414
"github.com/go-playground/validator/v10"
@@ -55,7 +55,7 @@ func NewMobileController(params mobileControllerParams) *MobileController {
5555
// @Router /mobile/v1/message [get]
5656
//
5757
// Get messages for sending.
58-
func (h *MobileController) list(device models.Device, c *fiber.Ctx) error {
58+
func (h *MobileController) list(device devices.Device, c *fiber.Ctx) error {
5959
// Get and validate order parameter
6060
params := new(mobileGetQueryParams)
6161
if err := h.QueryParserValidator(c, params); err != nil {
@@ -90,7 +90,7 @@ func (h *MobileController) list(device models.Device, c *fiber.Ctx) error {
9090
// @Router /mobile/v1/message [patch]
9191
//
9292
// Update message state.
93-
func (h *MobileController) patch(device models.Device, c *fiber.Ctx) error {
93+
func (h *MobileController) patch(device devices.Device, c *fiber.Ctx) error {
9494
req := smsgateway.MobilePatchMessageRequest{}
9595
if err := h.BodyParserValidator(c, &req); err != nil {
9696
return fiber.NewError(fiber.StatusBadRequest, err.Error())

internal/sms-gateway/handlers/middlewares/deviceauth/deviceauth.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"errors"
55
"strings"
66

7-
"github.com/android-sms-gateway/server/internal/sms-gateway/models"
87
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/auth"
98
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
109
"github.com/gofiber/fiber/v2"
@@ -29,15 +28,15 @@ func New(authSvc *auth.Service) fiber.Handler {
2928
// Get the token
3029
token := auth[7:]
3130

32-
device, err := authSvc.AuthorizeDevice(token)
31+
device, err := authSvc.AuthorizeDevice(c.Context(), token)
3332
if errors.Is(err, devices.ErrNotFound) {
3433
return c.Next()
3534
}
3635
if err != nil {
3736
return fiber.NewError(fiber.StatusUnauthorized, err.Error())
3837
}
3938

40-
c.Locals(LocalsDevice, device)
39+
c.Locals(LocalsDevice, *device)
4140

4241
return c.Next()
4342
}
@@ -52,10 +51,10 @@ func HasDevice(c *fiber.Ctx) bool {
5251

5352
// GetDevice returns the device stored in the Locals under the key LocalsDevice.
5453
// If the Locals do not contain a device, it returns an empty device.
55-
func GetDevice(c *fiber.Ctx) models.Device {
56-
device, ok := c.Locals(LocalsDevice).(models.Device)
54+
func GetDevice(c *fiber.Ctx) devices.Device {
55+
device, ok := c.Locals(LocalsDevice).(devices.Device)
5756
if !ok {
58-
return models.Device{}
57+
return devices.Device{}
5958
}
6059

6160
return device
@@ -80,7 +79,7 @@ func DeviceRequired() fiber.Handler {
8079
//
8180
// It is a convenience function that wraps the call to GetDevice and calls the
8281
// handler with the device as the first argument.
83-
func WithDevice(handler func(models.Device, *fiber.Ctx) error) fiber.Handler {
82+
func WithDevice(handler func(devices.Device, *fiber.Ctx) error) fiber.Handler {
8483
return func(c *fiber.Ctx) error {
8584
return handler(GetDevice(c), c)
8685
}

0 commit comments

Comments
 (0)