Skip to content

Commit bab9aaf

Browse files
committed
[push] refactor some code
1 parent faf5974 commit bab9aaf

File tree

7 files changed

+72
-49
lines changed

7 files changed

+72
-49
lines changed

internal/sms-gateway/handlers/upstream.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ func (h *upstreamHandler) postPush(c *fiber.Ctx) error {
6868
return err
6969
}
7070

71-
event := push.Event{
72-
Event: anys.ZeroDefault(v.Event, smsgateway.PushMessageEnqueued),
73-
Data: v.Data,
74-
}
71+
event := push.NewEvent(
72+
anys.ZeroDefault(v.Event, smsgateway.PushMessageEnqueued),
73+
v.Data,
74+
)
7575

76-
if err := h.pushSvc.Enqueue(v.Token, &event); err != nil {
76+
if err := h.pushSvc.Enqueue(v.Token, event); err != nil {
7777
h.Logger.Error("Can't push message", zap.Error(err))
7878
}
7979
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package push
2+
3+
const maxRetries = 3

internal/sms-gateway/modules/push/domain/events.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,30 @@ import (
77
)
88

99
type Event struct {
10-
Event smsgateway.PushEventType
11-
Data map[string]string
10+
event smsgateway.PushEventType
11+
data map[string]string
12+
}
13+
14+
func (e *Event) Event() smsgateway.PushEventType {
15+
return e.event
16+
}
17+
18+
func (e *Event) Data() map[string]string {
19+
return e.data
1220
}
1321

1422
func (e *Event) Map() map[string]string {
15-
json, _ := json.Marshal(e.Data)
23+
json, _ := json.Marshal(e.data)
1624

1725
return map[string]string{
18-
"event": string(e.Event),
26+
"event": string(e.event),
1927
"data": string(json),
2028
}
2129
}
2230

2331
func NewEvent(event smsgateway.PushEventType, data map[string]string) *Event {
2432
return &Event{
25-
Event: event,
26-
Data: data,
33+
event: event,
34+
data: data,
2735
}
2836
}

internal/sms-gateway/modules/push/fcm/client.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ package fcm
22

33
import (
44
"context"
5-
"errors"
65
"fmt"
7-
"maps"
8-
"slices"
96
"sync"
107

118
firebase "firebase.google.com/go/v4"
@@ -71,7 +68,7 @@ func (c *Client) Send(ctx context.Context, messages map[string]domain.Event) (ma
7168
}
7269
}
7370

74-
return errs, errors.Join(slices.Collect(maps.Values(errs))...)
71+
return errs, nil
7572
}
7673

7774
func (c *Client) Close(ctx context.Context) error {

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

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/android-sms-gateway/server/internal/sms-gateway/modules/push/domain"
99
"github.com/capcom6/go-helpers/cache"
10+
"github.com/capcom6/go-helpers/maps"
1011

1112
"github.com/prometheus/client_golang/prometheus"
1213
"github.com/prometheus/client_golang/prometheus/promauto"
@@ -99,15 +100,15 @@ func (s *Service) Run(ctx context.Context) {
99100
func (s *Service) Enqueue(token string, event *domain.Event) error {
100101
wrapper := eventWrapper{
101102
token: token,
102-
event: *event,
103+
event: event,
103104
retries: 0,
104105
}
105106

106107
if err := s.cache.Set(token, wrapper); err != nil {
107108
return fmt.Errorf("can't add message to cache: %w", err)
108109
}
109110

110-
s.enqueuedCounter.WithLabelValues(string(event.Event)).Inc()
111+
s.enqueuedCounter.WithLabelValues(string(event.Event())).Inc()
111112

112113
return nil
113114
}
@@ -119,36 +120,41 @@ func (s *Service) sendAll(ctx context.Context) {
119120
return
120121
}
121122

122-
messages := make(map[string]domain.Event, len(targets))
123-
for _, w := range targets {
124-
if w.retries >= 3 {
125-
s.retriesCounter.WithLabelValues("max_attempts").Inc()
126-
s.logger.Warn("Retries exceeded", zap.String("token", w.token))
127-
continue
128-
}
123+
messages := maps.MapValues(targets, func(w eventWrapper) domain.Event {
124+
return *w.event
125+
})
126+
127+
s.logger.Info("Sending messages", zap.Int("count", len(messages)))
128+
ctx, cancel := context.WithTimeout(ctx, s.config.Timeout)
129+
defer cancel()
129130

130-
messages[w.token] = w.event
131+
errs, err := s.client.Send(ctx, messages)
132+
if len(errs) == 0 && err == nil {
133+
s.logger.Info("Messages sent successfully", zap.Int("count", len(messages)))
134+
return
131135
}
132136

133-
if len(messages) == 0 {
137+
if err != nil {
138+
s.logger.Error("Can't send messages", zap.Error(err))
134139
return
135140
}
136141

137-
s.logger.Info("Sending messages", zap.Int("count", len(messages)))
138-
ctx, cancel := context.WithTimeout(ctx, s.config.Timeout)
139-
if errs, err := s.client.Send(ctx, messages); err != nil {
140-
for token := range errs {
141-
wrapper := targets[token]
142-
wrapper.retries++
143-
if s.cache.SetOrFail(token, wrapper) != nil {
144-
s.logger.Info("Can't set message to cache", zap.Error(err))
145-
} else {
146-
s.logger.Info("Retrying message", zap.String("token", token))
147-
}
148-
s.retriesCounter.WithLabelValues("retried").Inc()
142+
for token, sendErr := range errs {
143+
s.logger.Error("Can't send message", zap.Error(sendErr), zap.String("token", token))
144+
145+
wrapper := targets[token]
146+
wrapper.retries++
147+
148+
if wrapper.retries >= maxRetries {
149+
s.retriesCounter.WithLabelValues(string(RetryOutcomeMaxAttempts)).Inc()
150+
s.logger.Warn("Retries exceeded", zap.String("token", token))
151+
continue
149152
}
150153

151-
s.logger.Error("Can't send messages", zap.Error(err))
154+
if setErr := s.cache.SetOrFail(token, wrapper); setErr != nil {
155+
s.logger.Info("Can't set message to cache", zap.Error(setErr))
156+
}
157+
158+
s.retriesCounter.WithLabelValues(string(RetryOutcomeRetried)).Inc()
152159
}
153-
cancel()
154160
}

internal/sms-gateway/modules/push/types.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
type Mode string
1212
type Event = domain.Event
1313

14+
var NewEvent = domain.NewEvent
15+
1416
const (
1517
ModeFCM Mode = "fcm"
1618
ModeUpstream Mode = "upstream"
@@ -22,9 +24,16 @@ type client interface {
2224
Close(ctx context.Context) error
2325
}
2426

27+
type RetryOutcome string
28+
29+
const (
30+
RetryOutcomeMaxAttempts RetryOutcome = "max_attempts"
31+
RetryOutcomeRetried RetryOutcome = "retried"
32+
)
33+
2534
type eventWrapper struct {
2635
token string
27-
event domain.Event
36+
event *domain.Event
2837
retries int
2938
}
3039

internal/sms-gateway/modules/push/upstream/client.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,28 +48,28 @@ func (c *Client) Send(ctx context.Context, messages map[string]domain.Event) (ma
4848
for address, data := range messages {
4949
payload = append(payload, smsgateway.PushNotification{
5050
Token: address,
51-
Event: data.Event,
52-
Data: data.Data,
51+
Event: data.Event(),
52+
Data: data.Data(),
5353
})
5454
}
5555

5656
payloadBytes, err := json.Marshal(payload)
5757

5858
if err != nil {
59-
return c.sendError(messages, fmt.Errorf("can't marshal payload: %w", err))
59+
return nil, fmt.Errorf("can't marshal payload: %w", err)
6060
}
6161

6262
req, err := http.NewRequestWithContext(ctx, http.MethodPost, BASE_URL+"/push", bytes.NewReader(payloadBytes))
6363
if err != nil {
64-
return c.sendError(messages, fmt.Errorf("can't create request: %w", err))
64+
return nil, fmt.Errorf("can't create request: %w", err)
6565
}
6666

6767
req.Header.Set("Content-Type", "application/json")
6868
req.Header.Set("User-Agent", "android-sms-gateway/1.x (server; golang)")
6969

7070
resp, err := c.client.Do(req)
7171
if err != nil {
72-
return c.sendError(messages, fmt.Errorf("can't send request: %w", err))
72+
return c.mapErrors(messages, fmt.Errorf("can't send request: %w", err)), nil
7373
}
7474

7575
defer func() {
@@ -78,16 +78,16 @@ func (c *Client) Send(ctx context.Context, messages map[string]domain.Event) (ma
7878
}()
7979

8080
if resp.StatusCode >= 400 {
81-
return c.sendError(messages, fmt.Errorf("unexpected status code: %d", resp.StatusCode))
81+
return c.mapErrors(messages, fmt.Errorf("unexpected status code: %d", resp.StatusCode)), nil
8282
}
8383

8484
return nil, nil
8585
}
8686

87-
func (c *Client) sendError(messages map[string]domain.Event, err error) (map[string]error, error) {
87+
func (c *Client) mapErrors(messages map[string]domain.Event, err error) map[string]error {
8888
return maps.MapValues(messages, func(e domain.Event) error {
8989
return err
90-
}), err
90+
})
9191
}
9292

9393
func (c *Client) Close(ctx context.Context) error {

0 commit comments

Comments
 (0)