Skip to content

Commit cc41bfe

Browse files
authored
Merge pull request #30 from capcom6/feature/push-debounce
Added: push notifications debounce
2 parents eabcd3f + 9de01a9 commit cc41bfe

File tree

16 files changed

+246
-31
lines changed

16 files changed

+246
-31
lines changed

api/requests.http

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ Content-Type: application/json
3333
Authorization: Basic {{credentials}}
3434

3535
{
36-
"message": "17wc9/ZRf1l84LHkEK3hgA==.aH1XrMHAeMyF4PeiavV3dk8o2fP0nSo92IqseLQfg14=",
36+
"message": "$aes-256-cbc/pbkdf2-sha1$i=75000$pb+tpPcF0nabV46wDeDMig==$ucdVkMrRYLQ0LAeoXQsWhrD36I9nnop8rRIh3dNmBhvg7Wc4Cwu3h9Petvp1dN3x",
3737
"ttl": 600,
3838
"phoneNumbers": [
39-
"xkQeXzSDFj2xP6JBUMK0pA==.PfUHEa9QZv8h7JnUoBlmWw=="
39+
"$aes-256-cbc/pbkdf2-sha1$i=75000$ZWdiSMvGWJo/jixYGk+s+w==$tfP6sEeC4r/ux/JAglincQ=="
4040
],
4141
"simNumber": 1,
4242
"withDeliveryReport": true,

api/swagger.json

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,16 @@
9797
}
9898
],
9999
"responses": {
100-
"201": {
100+
"202": {
101101
"description": "Сообщение поставлено в очередь",
102102
"schema": {
103103
"$ref": "#/definitions/smsgateway.MessageState"
104+
},
105+
"headers": {
106+
"Location": {
107+
"type": "string",
108+
"description": "URL для получения состояния сообщения"
109+
}
104110
}
105111
},
106112
"400": {
@@ -340,6 +346,11 @@
340346
"maxLength": 36,
341347
"example": "PyDmBQZZXYmyxMwED8Fzy"
342348
},
349+
"isEncrypted": {
350+
"description": "Зашифровано",
351+
"type": "boolean",
352+
"example": true
353+
},
343354
"message": {
344355
"description": "Текст сообщения",
345356
"type": "string",
@@ -390,6 +401,11 @@
390401
"maxLength": 36,
391402
"example": "PyDmBQZZXYmyxMwED8Fzy"
392403
},
404+
"isEncrypted": {
405+
"description": "Зашифровано",
406+
"type": "boolean",
407+
"example": false
408+
},
393409
"isHashed": {
394410
"description": "Хэшировано",
395411
"type": "boolean",
@@ -511,6 +527,7 @@
511527
"phoneNumber": {
512528
"description": "Номер телефона или первые 16 символов SHA256",
513529
"type": "string",
530+
"maxLength": 128,
514531
"minLength": 10,
515532
"example": "79990001234"
516533
},

api/swagger.yaml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ definitions:
1919
example: PyDmBQZZXYmyxMwED8Fzy
2020
maxLength: 36
2121
type: string
22+
isEncrypted:
23+
description: Зашифровано
24+
example: true
25+
type: boolean
2226
message:
2327
description: Текст сообщения
2428
example: Hello World!
@@ -58,6 +62,10 @@ definitions:
5862
example: PyDmBQZZXYmyxMwED8Fzy
5963
maxLength: 36
6064
type: string
65+
isEncrypted:
66+
description: Зашифровано
67+
example: false
68+
type: boolean
6169
isHashed:
6270
description: Хэшировано
6371
example: false
@@ -150,6 +158,7 @@ definitions:
150158
phoneNumber:
151159
description: Номер телефона или первые 16 символов SHA256
152160
example: "79990001234"
161+
maxLength: 128
153162
minLength: 10
154163
type: string
155164
state:
@@ -219,8 +228,12 @@ paths:
219228
produces:
220229
- application/json
221230
responses:
222-
"201":
231+
"202":
223232
description: Сообщение поставлено в очередь
233+
headers:
234+
Location:
235+
description: URL для получения состояния сообщения
236+
type: string
224237
schema:
225238
$ref: '#/definitions/smsgateway.MessageState'
226239
"400":

configs/config.example.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ fcm:
1414
{
1515
...
1616
}
17+
timeout_seconds: 1
18+
debounce_seconds: 1
1719
tasks:
1820
hashing:
1921
interval_seconds: 15

internal/config/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ type Database struct {
2323

2424
type FCMConfig struct {
2525
CredentialsJSON string `yaml:"credentials_json"`
26+
DebounceSeconds uint16 `yaml:"debounce_seconds"`
27+
TimeoutSeconds uint16 `yaml:"timeout_seconds"`
2628
}
2729

2830
type Tasks struct {

internal/config/module.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ var Module = fx.Module(
4242
fx.Provide(func(cfg Config) services.PushServiceConfig {
4343
return services.PushServiceConfig{
4444
CredentialsJSON: cfg.FCM.CredentialsJSON,
45+
Debounce: time.Duration(cfg.FCM.DebounceSeconds) * time.Second,
46+
Timeout: time.Duration(cfg.FCM.TimeoutSeconds) * time.Second,
4547
}
4648
}),
4749
fx.Provide(func(cfg Config) tasks.HashingTaskConfig {

internal/sms-gateway/app.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"github.com/capcom6/go-infra-fx/validator"
1212
appconfig "github.com/capcom6/sms-gateway/internal/config"
1313
"github.com/capcom6/sms-gateway/internal/sms-gateway/handlers"
14-
"github.com/capcom6/sms-gateway/internal/sms-gateway/models"
1514
"github.com/capcom6/sms-gateway/internal/sms-gateway/repositories"
1615
"github.com/capcom6/sms-gateway/internal/sms-gateway/services"
1716
"github.com/capcom6/sms-gateway/internal/sms-gateway/tasks"
@@ -30,7 +29,6 @@ var Module = fx.Module(
3029
handlers.Module,
3130
services.Module,
3231
repositories.Module,
33-
models.Module,
3432
db.Module,
3533
tasks.Module,
3634
)
@@ -57,6 +55,7 @@ type StartParams struct {
5755

5856
Server *http.Server
5957
HashingTask *tasks.HashingTask
58+
PushService *services.PushService
6059
}
6160

6261
func Start(p StartParams) error {
@@ -65,12 +64,17 @@ func Start(p StartParams) error {
6564
p.LC.Append(fx.Hook{
6665
OnStart: func(_ context.Context) error {
6766
wg.Add(1)
68-
6967
go func() {
7068
defer wg.Done()
7169
p.HashingTask.Run(ctx)
7270
}()
7371

72+
wg.Add(1)
73+
go func() {
74+
defer wg.Done()
75+
p.PushService.Run(ctx)
76+
}()
77+
7478
wg.Add(1)
7579
go func() {
7680
defer wg.Done()

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

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ import (
1313
"go.uber.org/zap"
1414
)
1515

16+
const (
17+
route3rdPartyGetMessage = "3rdparty.get.message"
18+
)
19+
1620
type thirdPartyHandler struct {
1721
Handler
1822

@@ -27,10 +31,11 @@ type thirdPartyHandler struct {
2731
// @Accept json
2832
// @Produce json
2933
// @Param request body smsgateway.Message true "Сообщение"
30-
// @Success 201 {object} smsgateway.MessageState "Сообщение поставлено в очередь"
34+
// @Success 202 {object} smsgateway.MessageState "Сообщение поставлено в очередь"
3135
// @Failure 401 {object} smsgateway.ErrorResponse "Ошибка авторизации"
3236
// @Failure 400 {object} smsgateway.ErrorResponse "Некорректный запрос"
3337
// @Failure 500 {object} smsgateway.ErrorResponse "Внутренняя ошибка сервера"
38+
// @Header 202 {string} Location "URL для получения состояния сообщения"
3439
// @Router /3rdparty/v1/message [post]
3540
//
3641
// Поставить сообщение в очередь
@@ -55,7 +60,16 @@ func (h *thirdPartyHandler) postMessage(user models.User, c *fiber.Ctx) error {
5560
return err
5661
}
5762

58-
return c.Status(fiber.StatusCreated).JSON(state)
63+
location, err := c.GetRouteURL(route3rdPartyGetMessage, fiber.Map{
64+
"id": state.ID,
65+
})
66+
if err != nil {
67+
h.Logger.Error("Failed to get route URL", zap.String("route", route3rdPartyGetMessage), zap.Error(err))
68+
} else {
69+
c.Location(location)
70+
}
71+
72+
return c.Status(fiber.StatusAccepted).JSON(state)
5973
}
6074

6175
// @Summary Получить состояние сообщения
@@ -111,7 +125,7 @@ func (h *thirdPartyHandler) Register(router fiber.Router) {
111125
}))
112126

113127
router.Post("/message", h.authorize(h.postMessage))
114-
router.Get("/message/:id", h.authorize(h.getMessage))
128+
router.Get("/message/:id", h.authorize(h.getMessage)).Name(route3rdPartyGetMessage)
115129
}
116130

117131
func newThirdPartyHandler(logger *zap.Logger, validator *validator.Validate, authSvc *services.AuthService, messagesSvc *services.MessagesService) *thirdPartyHandler {

internal/sms-gateway/handlers/module.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ package handlers
33
import (
44
"github.com/capcom6/go-infra-fx/http"
55
"go.uber.org/fx"
6+
"go.uber.org/zap"
67
)
78

89
var Module = fx.Module(
910
"handlers",
11+
fx.Decorate(func(log *zap.Logger) *zap.Logger {
12+
return log.Named("handlers")
13+
}),
1014
fx.Provide(
1115
http.AsRootHandler(newRootHandler),
1216
http.AsApiHandler(newThirdPartyHandler),

internal/sms-gateway/models/module.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,6 @@ package models
22

33
import (
44
"github.com/capcom6/go-infra-fx/db"
5-
"go.uber.org/fx"
6-
)
7-
8-
var Module = fx.Module(
9-
"models",
105
)
116

127
func init() {

0 commit comments

Comments
 (0)