Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.25.0

require (
firebase.google.com/go/v4 v4.19.0
github.com/android-sms-gateway/client-go v1.12.5
github.com/android-sms-gateway/client-go v1.12.7-0.20260506065831-72a3c7972539
github.com/ansrivas/fiberprometheus/v2 v2.6.1
github.com/capcom6/go-helpers v0.3.0
github.com/capcom6/go-infra-fx v0.5.2
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tN
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/android-sms-gateway/client-go v1.12.5 h1:LcfTIvtRxOujPxmtFfCjHuFiX5wFyjN9yqGE+82jZdw=
github.com/android-sms-gateway/client-go v1.12.5/go.mod h1:DQsReciU1xcaVW3T5Z2bqslNdsAwCFCtghawmA6g6L4=
github.com/android-sms-gateway/client-go v1.12.7-0.20260506065831-72a3c7972539 h1:TbYUr0uHTkQZe7wqX93fWjnVb+f6fHnYShdu1VeZ+dM=
github.com/android-sms-gateway/client-go v1.12.7-0.20260506065831-72a3c7972539/go.mod h1:DQsReciU1xcaVW3T5Z2bqslNdsAwCFCtghawmA6g6L4=
github.com/andybalholm/brotli v1.2.1 h1:R+f5xP285VArJDRgowrfb9DqL18yVK0gKAW/F+eTWro=
github.com/andybalholm/brotli v1.2.1/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
github.com/ansrivas/fiberprometheus/v2 v2.6.1 h1:wac3pXaE6BYYTF04AC6K0ktk6vCD+MnDOJZ3SK66kXM=
Expand Down
22 changes: 20 additions & 2 deletions internal/sms-gateway/handlers/converters/devices.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,35 @@ package converters

import (
"github.com/android-sms-gateway/client-go/smsgateway"
"github.com/android-sms-gateway/server/internal/sms-gateway/models"
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
"github.com/capcom6/go-helpers/anys"
"github.com/samber/lo"
)

func DeviceToDTO(device models.Device) smsgateway.Device {
func DeviceToDTO(device devices.Device) smsgateway.Device {
return smsgateway.Device{
ID: device.ID,
Name: anys.OrDefault(device.Name, ""),
CreatedAt: device.CreatedAt,
UpdatedAt: device.UpdatedAt,
DeletedAt: device.DeletedAt,
LastSeen: device.LastSeen,
SimCards: mapSimCards(device.SimCards),
}
}

func mapSimCards(simCards []devices.SimCard) []smsgateway.SimCard {
if simCards == nil {
return nil
}

return lo.Map(simCards, func(sc devices.SimCard, _ int) smsgateway.SimCard {
return smsgateway.SimCard{
SlotIndex: sc.SlotIndex,
SimNumber: sc.SimNumber,
PhoneNumber: sc.PhoneNumber,
CarrierName: sc.CarrierName,
ICCID: sc.ICCID,
}
})
}
68 changes: 53 additions & 15 deletions internal/sms-gateway/handlers/converters/devices_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import (

"github.com/android-sms-gateway/client-go/smsgateway"
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/converters"
"github.com/android-sms-gateway/server/internal/sms-gateway/models"
"github.com/capcom6/go-helpers/anys"
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
"github.com/go-playground/assert/v2"
"github.com/samber/lo"
)

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

tests := []struct {
name string
device models.Device
device devices.Device
expected smsgateway.Device
}{
{
name: "empty device",
device: models.Device{},
device: devices.Device{},
expected: smsgateway.Device{},
},
{
name: "non-empty device",
device: models.Device{
ID: "test-id",
Name: anys.AsPointer("test-name"),
LastSeen: lastSeenAt,
SoftDeletableModel: models.SoftDeletableModel{
TimedModel: models.TimedModel{
CreatedAt: createdAt,
UpdatedAt: updatedAt,
device: devices.Device{
DeviceInput: devices.DeviceInput{
DeviceInfo: devices.DeviceInfo{
DeviceUpdate: devices.DeviceUpdate{},
Name: lo.ToPtr("test-name"),
},
ID: "test-id",
},
LastSeen: lastSeenAt,
CreatedAt: createdAt,
UpdatedAt: updatedAt,
},
expected: smsgateway.Device{
ID: "test-id",
Expand All @@ -49,15 +50,52 @@ func TestDeviceToDTO(t *testing.T) {
},
{
name: "device with nil name",
device: models.Device{
ID: "test-id",
Name: nil,
device: devices.Device{
DeviceInput: devices.DeviceInput{
DeviceInfo: devices.DeviceInfo{
Name: nil,
},
ID: "test-id",
},
},
expected: smsgateway.Device{
ID: "test-id",
Name: "",
},
},
{
name: "device with sim cards",
device: devices.Device{
DeviceInput: devices.DeviceInput{
DeviceInfo: devices.DeviceInfo{
DeviceUpdate: devices.DeviceUpdate{
SimCards: []devices.SimCard{
{
SlotIndex: 0,
SimNumber: 1,
PhoneNumber: lo.ToPtr("+79990001234"),
CarrierName: lo.ToPtr("Carrier"),
ICCID: lo.ToPtr("8901260000000000000"),
},
},
},
},
ID: "test-id",
},
},
expected: smsgateway.Device{
ID: "test-id",
SimCards: []smsgateway.SimCard{
{
SlotIndex: 0,
SimNumber: 1,
PhoneNumber: lo.ToPtr("+79990001234"),
CarrierName: lo.ToPtr("Carrier"),
ICCID: lo.ToPtr("8901260000000000000"),
},
},
},
},
}

for _, test := range tests {
Expand Down
16 changes: 10 additions & 6 deletions internal/sms-gateway/handlers/devices/3rdparty.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@ import (
"errors"
"fmt"

"github.com/android-sms-gateway/client-go/smsgateway"
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/base"
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/converters"
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/permissions"
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/userauth"
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
"github.com/capcom6/go-helpers/slices"
"github.com/go-playground/validator/v10"
"github.com/gofiber/fiber/v2"
"github.com/samber/lo"
"go.uber.org/zap"
)

Expand Down Expand Up @@ -50,14 +51,17 @@ func NewThirdPartyController(
//
// List devices.
func (h *ThirdPartyController) get(userID string, c *fiber.Ctx) error {
devices, err := h.devicesSvc.Select(userID)
items, err := h.devicesSvc.Select(c.Context(), userID)
if err != nil {
return fmt.Errorf("failed to select devices: %w", err)
}

response := slices.Map(devices, converters.DeviceToDTO)

return c.JSON(response)
return c.JSON(lo.Map(
items,
func(device devices.Device, _ int) smsgateway.Device {
return converters.DeviceToDTO(device)
},
))
}

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

err := h.devicesSvc.Remove(userID, devices.WithID(id))
err := h.devicesSvc.Remove(c.Context(), userID, devices.WithID(id))
if errors.Is(err, devices.ErrNotFound) {
return fiber.NewError(fiber.StatusNotFound, err.Error())
}
Expand Down
4 changes: 2 additions & 2 deletions internal/sms-gateway/handlers/events/mobile.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package events
import (
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/base"
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/deviceauth"
"github.com/android-sms-gateway/server/internal/sms-gateway/models"
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/sse"
"github.com/go-playground/validator/v10"
"github.com/gofiber/fiber/v2"
Expand Down Expand Up @@ -42,7 +42,7 @@ func NewMobileController(sseService *sse.Service, validator *validator.Validate,
// @Router /mobile/v1/events [get]
//
// Get events.
func (h *MobileController) get(device models.Device, c *fiber.Ctx) error {
func (h *MobileController) get(device devices.Device, c *fiber.Ctx) error {
return h.sseSvc.Handler(device.ID, c) //nolint:wrapcheck //wrapped internally
}

Expand Down
15 changes: 8 additions & 7 deletions internal/sms-gateway/handlers/messages/3rdparty.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ func (h *ThirdPartyController) post(userID string, c *fiber.Ctx) error {
}

device, err := h.devicesSvc.GetAny(
c.Context(),
userID,
req.DeviceID,
time.Duration(params.DeviceActiveWithin)*time.Hour,
Expand Down Expand Up @@ -251,17 +252,17 @@ func (h *ThirdPartyController) get(userID string, c *fiber.Ctx) error {
// @Tags User, Messages
// @Accept json
// @Produce json
// @Param request body smsgateway.MessagesExportRequest true "Export inbox request"
// @Success 202 {object} object "Inbox export request accepted"
// @Failure 400 {object} smsgateway.ErrorResponse "Invalid request"
// @Failure 401 {object} smsgateway.ErrorResponse "Unauthorized"
// @Failure 403 {object} smsgateway.ErrorResponse "Forbidden"
// @Failure 500 {object} smsgateway.ErrorResponse "Internal server error"
// @Param request body smsgateway.InboxRefreshRequest true "Export inbox request"
// @Success 202 {object} object "Inbox export request accepted"
// @Failure 400 {object} smsgateway.ErrorResponse "Invalid request"
// @Failure 401 {object} smsgateway.ErrorResponse "Unauthorized"
// @Failure 403 {object} smsgateway.ErrorResponse "Forbidden"
// @Failure 500 {object} smsgateway.ErrorResponse "Internal server error"
// @Router /3rdparty/v1/messages/inbox/export [post]
//
// Export inbox.
func (h *ThirdPartyController) postInboxExport(userID string, c *fiber.Ctx) error {
req := new(smsgateway.MessagesExportRequest)
req := new(smsgateway.InboxRefreshRequest)
if err := h.BodyParserValidator(c, req); err != nil {
return fiber.NewError(fiber.StatusBadRequest, err.Error())
}
Expand Down
6 changes: 3 additions & 3 deletions internal/sms-gateway/handlers/messages/mobile.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/base"
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/converters"
"github.com/android-sms-gateway/server/internal/sms-gateway/handlers/middlewares/deviceauth"
"github.com/android-sms-gateway/server/internal/sms-gateway/models"
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/devices"
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/messages"
"github.com/capcom6/go-helpers/slices"
"github.com/go-playground/validator/v10"
Expand Down Expand Up @@ -55,7 +55,7 @@ func NewMobileController(params mobileControllerParams) *MobileController {
// @Router /mobile/v1/message [get]
//
// Get messages for sending.
func (h *MobileController) list(device models.Device, c *fiber.Ctx) error {
func (h *MobileController) list(device devices.Device, c *fiber.Ctx) error {
// Get and validate order parameter
params := new(mobileGetQueryParams)
if err := h.QueryParserValidator(c, params); err != nil {
Expand Down Expand Up @@ -90,7 +90,7 @@ func (h *MobileController) list(device models.Device, c *fiber.Ctx) error {
// @Router /mobile/v1/message [patch]
//
// Update message state.
func (h *MobileController) patch(device models.Device, c *fiber.Ctx) error {
func (h *MobileController) patch(device devices.Device, c *fiber.Ctx) error {
req := smsgateway.MobilePatchMessageRequest{}
if err := h.BodyParserValidator(c, &req); err != nil {
return fiber.NewError(fiber.StatusBadRequest, err.Error())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"errors"
"strings"

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

device, err := authSvc.AuthorizeDevice(token)
device, err := authSvc.AuthorizeDevice(c.Context(), token)
if errors.Is(err, devices.ErrNotFound) {
return c.Next()
}
if err != nil {
return fiber.NewError(fiber.StatusUnauthorized, err.Error())
}

c.Locals(LocalsDevice, device)
c.Locals(LocalsDevice, *device)

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

// GetDevice returns the device stored in the Locals under the key LocalsDevice.
// If the Locals do not contain a device, it returns an empty device.
func GetDevice(c *fiber.Ctx) models.Device {
device, ok := c.Locals(LocalsDevice).(models.Device)
func GetDevice(c *fiber.Ctx) devices.Device {
device, ok := c.Locals(LocalsDevice).(devices.Device)
if !ok {
return models.Device{}
return devices.Device{}
}

return device
Expand All @@ -80,7 +79,7 @@ func DeviceRequired() fiber.Handler {
//
// It is a convenience function that wraps the call to GetDevice and calls the
// handler with the device as the first argument.
func WithDevice(handler func(models.Device, *fiber.Ctx) error) fiber.Handler {
func WithDevice(handler func(devices.Device, *fiber.Ctx) error) fiber.Handler {
return func(c *fiber.Ctx) error {
return handler(GetDevice(c), c)
}
Expand Down
Loading
Loading