Skip to content

Commit 96cd2b1

Browse files
committed
[lint] minor fixes
1 parent 671b0cc commit 96cd2b1

File tree

16 files changed

+154
-110
lines changed

16 files changed

+154
-110
lines changed

cmd/sms-gateway/main.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import (
77
"github.com/android-sms-gateway/server/internal/worker"
88
)
99

10+
const (
11+
cmdWorker = "worker"
12+
)
13+
1014
// @securitydefinitions.basic ApiAuth
1115
// @description User authentication
1216

@@ -36,15 +40,15 @@ import (
3640
// @host api.sms-gate.app
3741
// @schemes https
3842
//
39-
// SMSGate Backend
43+
// SMSGate Backend.
4044
func main() {
4145
args := os.Args[1:]
4246
cmd := "start"
43-
if len(args) > 0 && args[0] == "worker" {
44-
cmd = "worker"
47+
if len(args) > 0 && args[0] == cmdWorker {
48+
cmd = cmdWorker
4549
}
4650

47-
if cmd == "worker" {
51+
if cmd == cmdWorker {
4852
worker.Run()
4953
} else {
5054
smsgateway.Run()

go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ require (
2525
go.uber.org/fx v1.24.0
2626
go.uber.org/zap v1.27.0
2727
golang.org/x/crypto v0.42.0
28-
golang.org/x/exp v0.0.0-20240525044651-4c93da0ed11d
2928
google.golang.org/api v0.148.0
3029
gopkg.in/yaml.v3 v3.0.1
3130
gorm.io/gorm v1.25.7-0.20240204074919-46816ad31dde

go.sum

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,8 +343,6 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
343343
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
344344
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
345345
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
346-
golang.org/x/exp v0.0.0-20240525044651-4c93da0ed11d h1:N0hmiNbwsSNwHBAvR3QB5w25pUwH4tK0Y/RltD1j1h4=
347-
golang.org/x/exp v0.0.0-20240525044651-4c93da0ed11d/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
348346
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
349347
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
350348
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=

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

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

33
import (
44
"errors"
5-
"fmt"
65
"strconv"
76
"time"
87

@@ -144,7 +143,14 @@ func (h *ThirdPartyController) post(user models.User, c *fiber.Ctx) error {
144143
return fiber.NewError(fiber.StatusConflict, err.Error())
145144
}
146145

147-
return fmt.Errorf("failed to enqueue message: %w", err)
146+
h.Logger.Error(
147+
"failed to enqueue message",
148+
zap.Error(err),
149+
zap.String("user_id", user.ID),
150+
zap.String("device_id", req.DeviceID),
151+
)
152+
153+
return fiber.NewError(fiber.StatusInternalServerError, "Failed to enqueue message. Please contact support")
148154
}
149155

150156
location, err := c.GetRouteURL(route3rdPartyGetMessage, fiber.Map{

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,16 +177,16 @@ func (s *Service) Remove(userID string, filter ...SelectFilter) error {
177177
}
178178

179179
for _, device := range devices {
180-
if err := s.cache.DeleteByID(device.ID); err != nil {
180+
if cacheErr := s.cache.DeleteByID(device.ID); cacheErr != nil {
181181
s.logger.Error("failed to invalidate cache",
182182
zap.String("device_id", device.ID),
183-
zap.Error(err),
183+
zap.Error(cacheErr),
184184
)
185185
}
186186
}
187187

188-
if err := s.devices.Remove(filter...); err != nil {
189-
return err
188+
if rmErr := s.devices.Remove(filter...); rmErr != nil {
189+
return rmErr
190190
}
191191

192192
return nil

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

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"time"
77

88
"github.com/android-sms-gateway/server/internal/sms-gateway/models"
9+
"github.com/samber/lo"
910
"gorm.io/gorm"
1011
)
1112

@@ -54,6 +55,33 @@ type Message struct {
5455
States []MessageState `gorm:"foreignKey:MessageID;constraint:OnDelete:CASCADE"`
5556
}
5657

58+
func NewMessage(
59+
extID string,
60+
deviceID string,
61+
phoneNumbers []string,
62+
priority int8,
63+
simNumber *uint8,
64+
validUntil *time.Time,
65+
withDeliveryReport bool,
66+
isEncrypted bool,
67+
) *Message {
68+
//nolint:exhaustruct // partial constructor
69+
return &Message{
70+
ExtID: extID,
71+
DeviceID: deviceID,
72+
Recipients: lo.Map(phoneNumbers, func(item string, _ int) MessageRecipient {
73+
return MessageRecipient{PhoneNumber: item, State: ProcessingStatePending}
74+
}),
75+
Priority: priority,
76+
SimNumber: simNumber,
77+
ValidUntil: validUntil,
78+
WithDeliveryReport: withDeliveryReport,
79+
IsEncrypted: isEncrypted,
80+
81+
State: ProcessingStatePending,
82+
}
83+
}
84+
5785
func (m *Message) SetTextContent(content TextMessageContent) error {
5886
contentJSON, err := json.Marshal(content)
5987
if err != nil {
@@ -73,7 +101,7 @@ func (m *Message) GetTextContent() (*TextMessageContent, error) {
73101

74102
content := new(TextMessageContent)
75103

76-
err := json.Unmarshal([]byte(m.Content), &content)
104+
err := json.Unmarshal([]byte(m.Content), content)
77105
if err != nil {
78106
return nil, fmt.Errorf("failed to unmarshal text content: %w", err)
79107
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ func (r *Repository) UpdateState(message *Message) error {
155155
}
156156

157157
for _, v := range message.Recipients {
158-
if err := tx.Model(&MessageRecipient{}).
158+
if err := tx.Model((*MessageRecipient)(nil)).
159159
Where("message_id = ? AND phone_number = ?", message.ID, v.PhoneNumber).
160160
Select("state", "error").
161161
Updates(map[string]any{"state": v.State, "error": v.Error}).Error; err != nil {

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

Lines changed: 65 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -173,91 +173,102 @@ func (s *Service) GetState(user models.User, id string) (*MessageStateOut, error
173173
return dto, nil
174174
}
175175

176-
func (s *Service) Enqueue(device models.Device, message MessageIn, opts EnqueueOptions) (MessageStateOut, error) {
177-
state := MessageStateOut{
176+
func (s *Service) Enqueue(device models.Device, message MessageIn, opts EnqueueOptions) (*MessageStateOut, error) {
177+
msg, err := s.prepareMessage(device, message, opts)
178+
if err != nil {
179+
return nil, err
180+
}
181+
182+
state := &MessageStateOut{
178183
DeviceID: device.ID,
179184
MessageStateIn: MessageStateIn{
180-
State: ProcessingStatePending,
181-
Recipients: make([]smsgateway.RecipientState, len(message.PhoneNumbers)),
185+
ID: msg.ExtID,
186+
State: ProcessingStatePending,
187+
Recipients: lo.Map(
188+
msg.Recipients,
189+
func(item MessageRecipient, _ int) smsgateway.RecipientState { return modelToRecipientState(item) },
190+
),
191+
States: map[string]time.Time{},
182192
},
193+
IsHashed: false,
194+
IsEncrypted: msg.IsEncrypted,
195+
}
196+
197+
if insErr := s.messages.Insert(msg); insErr != nil {
198+
return state, insErr
183199
}
184200

201+
if cacheErr := s.cache.Set(context.Background(), device.UserID, msg.ExtID, anys.AsPointer(modelToMessageState(*msg))); cacheErr != nil {
202+
s.logger.Warn("failed to cache message", zap.String("id", msg.ExtID), zap.Error(cacheErr))
203+
}
204+
s.metrics.IncTotal(string(msg.State))
205+
206+
go func(userID, deviceID string) {
207+
if ntfErr := s.eventsSvc.Notify(userID, &deviceID, events.NewMessageEnqueuedEvent()); ntfErr != nil {
208+
s.logger.Error(
209+
"failed to notify device",
210+
zap.Error(ntfErr),
211+
zap.String("user_id", userID),
212+
zap.String("device_id", deviceID),
213+
)
214+
}
215+
}(device.UserID, device.ID)
216+
217+
return state, nil
218+
}
219+
220+
func (s *Service) prepareMessage(device models.Device, message MessageIn, opts EnqueueOptions) (*Message, error) {
185221
var phone string
186222
var err error
187223
for i, v := range message.PhoneNumbers {
188224
if message.IsEncrypted || opts.SkipPhoneValidation {
189225
phone = v
190226
} else {
191227
if phone, err = cleanPhoneNumber(v); err != nil {
192-
return state, fmt.Errorf("failed to use phone in row %d: %w", i+1, err)
228+
return nil, fmt.Errorf("failed to use phone in row %d: %w", i+1, err)
193229
}
194230
}
195231

196232
message.PhoneNumbers[i] = phone
197-
198-
state.Recipients[i] = smsgateway.RecipientState{
199-
PhoneNumber: phone,
200-
State: smsgateway.ProcessingStatePending,
201-
}
202233
}
203234

204235
validUntil := message.ValidUntil
205236
if message.TTL != nil && *message.TTL > 0 {
206-
validUntil = anys.AsPointer(time.Now().Add(time.Duration(*message.TTL) * time.Second))
237+
//nolint:gosec // not a problem
238+
validUntil = anys.AsPointer(
239+
time.Now().Add(time.Duration(*message.TTL) * time.Second),
240+
)
207241
}
208242

209-
msg := Message{
210-
ExtID: message.ID,
211-
Recipients: s.recipientsToModel(message.PhoneNumbers),
212-
IsEncrypted: message.IsEncrypted,
213-
214-
DeviceID: device.ID,
215-
216-
SimNumber: message.SimNumber,
217-
WithDeliveryReport: anys.OrDefault(message.WithDeliveryReport, true),
218-
219-
Priority: int8(message.Priority),
220-
ValidUntil: validUntil,
221-
}
243+
msg := NewMessage(
244+
message.ID,
245+
device.ID,
246+
message.PhoneNumbers,
247+
int8(message.Priority),
248+
message.SimNumber,
249+
validUntil,
250+
anys.OrDefault(message.WithDeliveryReport, true),
251+
message.IsEncrypted,
252+
)
222253

223-
if message.TextContent != nil {
224-
if err := msg.SetTextContent(*message.TextContent); err != nil {
225-
return state, fmt.Errorf("failed to set text content: %w", err)
254+
switch {
255+
case message.TextContent != nil:
256+
if setErr := msg.SetTextContent(*message.TextContent); setErr != nil {
257+
return nil, fmt.Errorf("failed to set text content: %w", setErr)
226258
}
227-
} else if message.DataContent != nil {
228-
if err := msg.SetDataContent(*message.DataContent); err != nil {
229-
return state, fmt.Errorf("failed to set data content: %w", err)
259+
case message.DataContent != nil:
260+
if setErr := msg.SetDataContent(*message.DataContent); setErr != nil {
261+
return nil, fmt.Errorf("failed to set data content: %w", setErr)
230262
}
231-
} else {
232-
return state, ErrNoContent
263+
default:
264+
return nil, ErrNoContent
233265
}
234266

235267
if msg.ExtID == "" {
236268
msg.ExtID = s.idgen()
237269
}
238-
state.ID = msg.ExtID
239270

240-
if err := s.messages.Insert(&msg); err != nil {
241-
return state, err
242-
}
243-
244-
if err := s.cache.Set(context.Background(), device.UserID, msg.ExtID, anys.AsPointer(modelToMessageState(msg))); err != nil {
245-
s.logger.Warn("failed to cache message", zap.String("id", msg.ExtID), zap.Error(err))
246-
}
247-
s.metrics.IncTotal(string(msg.State))
248-
249-
go func(userID, deviceID string) {
250-
if err := s.eventsSvc.Notify(userID, &deviceID, events.NewMessageEnqueuedEvent()); err != nil {
251-
s.logger.Error(
252-
"failed to notify device",
253-
zap.Error(err),
254-
zap.String("user_id", userID),
255-
zap.String("device_id", deviceID),
256-
)
257-
}
258-
}(device.UserID, device.ID)
259-
260-
return state, nil
271+
return msg, nil
261272
}
262273

263274
func (s *Service) ExportInbox(device models.Device, since, until time.Time) error {
@@ -272,15 +283,6 @@ func (s *Service) ExportInbox(device models.Device, since, until time.Time) erro
272283

273284
///////////////////////////////////////////////////////////////////////////////
274285

275-
func (s *Service) recipientsToModel(input []string) []MessageRecipient {
276-
return lo.Map(
277-
input,
278-
func(item string, _ int) MessageRecipient {
279-
return newMessageRecipient(item, ProcessingStatePending, nil)
280-
},
281-
)
282-
}
283-
284286
func (s *Service) recipientsStateToModel(input []smsgateway.RecipientState, hash bool) []MessageRecipient {
285287
output := make([]MessageRecipient, len(input))
286288

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package messages
22

33
import (
44
"context"
5+
"slices"
56
"sync"
67
"time"
78

9+
"maps"
10+
811
"go.uber.org/zap"
9-
"golang.org/x/exp/maps"
1012
)
1113

1214
type hashingWorker struct {
@@ -27,6 +29,7 @@ func newHashingWorker(config Config, messages *Repository, logger *zap.Logger) *
2729
logger: logger,
2830

2931
queue: map[uint64]struct{}{},
32+
mux: sync.Mutex{},
3033
}
3134
}
3235

@@ -46,7 +49,7 @@ func (t *hashingWorker) Run(ctx context.Context) {
4649
}
4750
}
4851

49-
// Enqueue adds a message ID to the processing queue to be hashed in the next batch
52+
// Enqueue adds a message ID to the processing queue to be hashed in the next batch.
5053
func (t *hashingWorker) Enqueue(id uint64) {
5154
t.mux.Lock()
5255
t.queue[id] = struct{}{}
@@ -56,8 +59,8 @@ func (t *hashingWorker) Enqueue(id uint64) {
5659
func (t *hashingWorker) process(ctx context.Context) {
5760
t.mux.Lock()
5861

59-
ids := maps.Keys(t.queue)
60-
maps.Clear(t.queue)
62+
ids := slices.AppendSeq(make([]uint64, 0, len(t.queue)), maps.Keys(t.queue))
63+
clear(t.queue)
6164

6265
t.mux.Unlock()
6366

0 commit comments

Comments
 (0)