generated from PenaSide/GolangTemplate
Dev
This commit is contained in:
parent
298e079f0f
commit
c0bb6e4ca4
@ -44,7 +44,7 @@ linters:
|
|||||||
- revive
|
- revive
|
||||||
- rowserrcheck
|
- rowserrcheck
|
||||||
- staticcheck
|
- staticcheck
|
||||||
- stylecheck
|
# - stylecheck
|
||||||
- thelper
|
- thelper
|
||||||
- typecheck
|
- typecheck
|
||||||
- unconvert
|
- unconvert
|
||||||
|
@ -573,6 +573,19 @@ paths:
|
|||||||
schema:
|
schema:
|
||||||
$ref: '#/components/schemas/Error'
|
$ref: '#/components/schemas/Error'
|
||||||
|
|
||||||
|
/recent:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- history
|
||||||
|
summary: Получение недавних тарифов
|
||||||
|
description: Возвращает список уникальных тарифов из истории. Айди аккаунта получается из заголовка.
|
||||||
|
operationId: getRecentTariffs
|
||||||
|
security:
|
||||||
|
- Bearer: []
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Успешный запрос
|
||||||
|
|
||||||
components:
|
components:
|
||||||
schemas:
|
schemas:
|
||||||
|
|
||||||
@ -747,4 +760,3 @@ components:
|
|||||||
bearerFormat: JWT
|
bearerFormat: JWT
|
||||||
description: >-
|
description: >-
|
||||||
Enter the token with the `Bearer: ` prefix, e.g. "Bearer abcde12345".
|
Enter the token with the `Bearer: ` prefix, e.g. "Bearer abcde12345".
|
||||||
|
|
||||||
|
4
deployments/local/.env.test
Normal file
4
deployments/local/.env.test
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# JWT settings
|
||||||
|
JWT_ISSUER="pena-auth-service"
|
||||||
|
JWT_AUDIENCE="pena"
|
||||||
|
JWT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHgnvr7O2tiApjJfid1orFnIGm69\n80fZp+Lpbjo+NC/0whMFga2Biw5b1G2Q/B2u0tpO1Fs/E8z7Lv1nYfr5jx2S8x6B\ndA4TS2kB9Kf0wn0+7wSlyikHoKhbtzwXHZl17GsyEi6wHnsqNBSauyIWhpha8i+Y\n+3GyaOY536H47qyXAgMBAAE=\n-----END PUBLIC KEY-----"
|
9
deployments/local/auth.env.test
Normal file
9
deployments/local/auth.env.test
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
DB_HOST=test-pena-auth-db
|
||||||
|
DB_PORT=27017
|
||||||
|
ENVIRONMENT=staging
|
||||||
|
HTTP_HOST=0.0.0.0
|
||||||
|
HTTP_PORT=8000
|
||||||
|
DB_USERNAME=test
|
||||||
|
DB_PASSWORD=test
|
||||||
|
DB_NAME=admin
|
||||||
|
DB_AUTH=admin
|
217
deployments/local/docker-compose.yaml
Normal file
217
deployments/local/docker-compose.yaml
Normal file
@ -0,0 +1,217 @@
|
|||||||
|
version: "3"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
redpanda: null
|
||||||
|
test-mongodb: null
|
||||||
|
test-mongoconfdb: null
|
||||||
|
|
||||||
|
services:
|
||||||
|
customer-service:
|
||||||
|
container_name: customer-service
|
||||||
|
build:
|
||||||
|
context: ../../.
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
target: test
|
||||||
|
env_file:
|
||||||
|
- .env.test
|
||||||
|
environment:
|
||||||
|
- HTTP_HOST=0.0.0.0
|
||||||
|
- HTTP_PORT=8000
|
||||||
|
|
||||||
|
- GRPC_HOST=0.0.0.0
|
||||||
|
- GRPC_PORT=9000
|
||||||
|
- GRPC_DOMEN=customer-service:9000
|
||||||
|
|
||||||
|
- MONGO_HOST=customer-db
|
||||||
|
- MONGO_PORT=27017
|
||||||
|
- MONGO_USER=test
|
||||||
|
- MONGO_PASSWORD=test
|
||||||
|
- MONGO_DB_NAME=admin
|
||||||
|
- MONGO_AUTH=admin
|
||||||
|
|
||||||
|
- KAFKA_BROKERS=customer-redpanda:9092
|
||||||
|
- KAFKA_TOPIC_TARIFF=tariffs
|
||||||
|
|
||||||
|
- AUTH_MICROSERVICE_USER_URL=http://pena-auth-service:8000/user
|
||||||
|
- HUBADMIN_MICROSERVICE_TARIFF_URL=http://hub-admin-backend-service:8000/tariff
|
||||||
|
- CURRENCY_MICROSERVICE_TRANSLATE_URL=http://cbrfworker-service:8000/change
|
||||||
|
- DISCOUNT_MICROSERVICE_GRPC_HOST=discount-service:9000
|
||||||
|
- PAYMENT_MICROSERVICE_GRPC_HOST=treasurer-service:9085
|
||||||
|
ports:
|
||||||
|
- 8082:8000
|
||||||
|
- 9092:9000
|
||||||
|
depends_on:
|
||||||
|
- customer-db
|
||||||
|
- customer-migration
|
||||||
|
- redpanda
|
||||||
|
- test-pena-auth-service
|
||||||
|
networks:
|
||||||
|
- test
|
||||||
|
|
||||||
|
customer-migration:
|
||||||
|
container_name: customer-migration
|
||||||
|
build:
|
||||||
|
context: ../../.
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
target: test
|
||||||
|
command:
|
||||||
|
[
|
||||||
|
"sh",
|
||||||
|
"-c",
|
||||||
|
'migrate -source file://migrations -database "mongodb://test:test@customer-db:27017/admin?authSource=admin" up',
|
||||||
|
]
|
||||||
|
depends_on:
|
||||||
|
- customer-db
|
||||||
|
networks:
|
||||||
|
- test
|
||||||
|
|
||||||
|
customer-db:
|
||||||
|
container_name: customer-db
|
||||||
|
image: "mongo:6.0.3"
|
||||||
|
environment:
|
||||||
|
MONGO_INITDB_ROOT_USERNAME: test
|
||||||
|
MONGO_INITDB_ROOT_PASSWORD: test
|
||||||
|
ports:
|
||||||
|
- "27024:27017"
|
||||||
|
networks:
|
||||||
|
- test
|
||||||
|
|
||||||
|
redpanda:
|
||||||
|
container_name: customer-redpanda
|
||||||
|
tty: true
|
||||||
|
image: docker.redpanda.com/redpandadata/redpanda:v23.1.13
|
||||||
|
command:
|
||||||
|
- redpanda start
|
||||||
|
- --smp 1
|
||||||
|
- --overprovisioned
|
||||||
|
- --kafka-addr internal://0.0.0.0:9092,external://0.0.0.0:19092
|
||||||
|
# Address the broker advertises to clients that connect to the Kafka API.
|
||||||
|
# Use the internal addresses to connect to the Redpanda brokers
|
||||||
|
# from inside the same Docker network.
|
||||||
|
# Use the external addresses to connect to the Redpanda brokers
|
||||||
|
# from outside the Docker network.
|
||||||
|
- --advertise-kafka-addr internal://redpanda:9092,external://localhost:19092
|
||||||
|
- --pandaproxy-addr internal://0.0.0.0:8082,external://0.0.0.0:18082
|
||||||
|
# Address the broker advertises to clients that connect to the HTTP Proxy.
|
||||||
|
- --advertise-pandaproxy-addr internal://redpanda:8082,external://localhost:18082
|
||||||
|
- --schema-registry-addr internal://0.0.0.0:8081,external://0.0.0.0:18081
|
||||||
|
# Redpanda brokers use the RPC API to communicate with each other internally.
|
||||||
|
- --rpc-addr redpanda:33145
|
||||||
|
- --advertise-rpc-addr redpanda:33145
|
||||||
|
ports:
|
||||||
|
- 18081:18081
|
||||||
|
- 18082:18082
|
||||||
|
- 19092:19092
|
||||||
|
- 19644:9644
|
||||||
|
volumes:
|
||||||
|
- redpanda:/var/lib/redpanda/data
|
||||||
|
networks:
|
||||||
|
- test
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "rpk cluster health | grep -E 'Healthy:.+true' || exit 1"]
|
||||||
|
interval: 15s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 5
|
||||||
|
start_period: 5s
|
||||||
|
|
||||||
|
console:
|
||||||
|
tty: true
|
||||||
|
image: docker.redpanda.com/redpandadata/console:v2.2.4
|
||||||
|
entrypoint: /bin/sh
|
||||||
|
command: -c "echo \"$$CONSOLE_CONFIG_FILE\" > /tmp/config.yml; /app/console"
|
||||||
|
environment:
|
||||||
|
CONFIG_FILEPATH: /tmp/config.yml
|
||||||
|
CONSOLE_CONFIG_FILE: |
|
||||||
|
kafka:
|
||||||
|
brokers: ["redpanda:9092"]
|
||||||
|
schemaRegistry:
|
||||||
|
enabled: true
|
||||||
|
urls: ["http://redpanda:8081"]
|
||||||
|
redpanda:
|
||||||
|
adminApi:
|
||||||
|
enabled: true
|
||||||
|
urls: ["http://redpanda:9644"]
|
||||||
|
connect:
|
||||||
|
enabled: true
|
||||||
|
clusters:
|
||||||
|
- name: local-connect-cluster
|
||||||
|
url: http://connect:8083
|
||||||
|
ports:
|
||||||
|
- 8080:8080
|
||||||
|
networks:
|
||||||
|
- test
|
||||||
|
depends_on:
|
||||||
|
- redpanda
|
||||||
|
|
||||||
|
connect:
|
||||||
|
tty: true
|
||||||
|
image: docker.redpanda.com/redpandadata/connectors:latest
|
||||||
|
hostname: connect
|
||||||
|
container_name: connect
|
||||||
|
networks:
|
||||||
|
- test
|
||||||
|
# platform: 'linux/amd64'
|
||||||
|
depends_on:
|
||||||
|
- redpanda
|
||||||
|
ports:
|
||||||
|
- "8083:8083"
|
||||||
|
environment:
|
||||||
|
CONNECT_CONFIGURATION: |
|
||||||
|
key.converter=org.apache.kafka.connect.converters.ByteArrayConverter
|
||||||
|
value.converter=org.apache.kafka.connect.converters.ByteArrayConverter
|
||||||
|
group.id=connectors-cluster
|
||||||
|
offset.storage.topic=_internal_connectors_offsets
|
||||||
|
config.storage.topic=_internal_connectors_configs
|
||||||
|
status.storage.topic=_internal_connectors_status
|
||||||
|
config.storage.replication.factor=-1
|
||||||
|
offset.storage.replication.factor=-1
|
||||||
|
status.storage.replication.factor=-1
|
||||||
|
offset.flush.interval.ms=1000
|
||||||
|
producer.linger.ms=50
|
||||||
|
producer.batch.size=131072
|
||||||
|
CONNECT_BOOTSTRAP_SERVERS: redpanda:9092
|
||||||
|
CONNECT_GC_LOG_ENABLED: "false"
|
||||||
|
CONNECT_HEAP_OPTS: -Xms512M -Xmx512M
|
||||||
|
CONNECT_LOG_LEVEL: info
|
||||||
|
|
||||||
|
test-pena-auth-db:
|
||||||
|
container_name: test-pena-auth-db
|
||||||
|
init: true
|
||||||
|
image: "mongo:6.0.3"
|
||||||
|
command: mongod --quiet --logpath /dev/null
|
||||||
|
volumes:
|
||||||
|
- test-mongodb:/data/db
|
||||||
|
- test-mongoconfdb:/data/configdb
|
||||||
|
environment:
|
||||||
|
MONGO_INITDB_ROOT_USERNAME: test
|
||||||
|
MONGO_INITDB_ROOT_PASSWORD: test
|
||||||
|
networks:
|
||||||
|
- test
|
||||||
|
|
||||||
|
test-pena-auth-service:
|
||||||
|
image: penahub.gitlab.yandexcloud.net:5050/pena-services/pena-auth-service:staging.872
|
||||||
|
container_name: test-pena-auth-service
|
||||||
|
init: true
|
||||||
|
env_file: auth.env.test
|
||||||
|
healthcheck:
|
||||||
|
test: wget -T1 --spider http://localhost:8000/user
|
||||||
|
interval: 2s
|
||||||
|
timeout: 2s
|
||||||
|
retries: 5
|
||||||
|
environment:
|
||||||
|
- DB_HOST=test-pena-auth-db
|
||||||
|
- DB_PORT=27017
|
||||||
|
- ENVIRONMENT=staging
|
||||||
|
- HTTP_HOST=0.0.0.0
|
||||||
|
- HTTP_PORT=8000
|
||||||
|
- DB_USERNAME=test
|
||||||
|
- DB_PASSWORD=test
|
||||||
|
- DB_NAME=admin
|
||||||
|
- DB_AUTH=admin
|
||||||
|
depends_on:
|
||||||
|
- test-pena-auth-db
|
||||||
|
networks:
|
||||||
|
- test
|
||||||
|
|
||||||
|
networks:
|
||||||
|
test:
|
@ -16,6 +16,7 @@ import (
|
|||||||
|
|
||||||
type historyService interface {
|
type historyService interface {
|
||||||
GetHistoryList(context.Context, *dto.GetHistories) (*models.PaginationResponse[models.History], errors.Error)
|
GetHistoryList(context.Context, *dto.GetHistories) (*models.PaginationResponse[models.History], errors.Error)
|
||||||
|
GetRecentTariffs(context.Context, string) ([]models.TariffID, errors.Error) // new
|
||||||
}
|
}
|
||||||
|
|
||||||
type Deps struct {
|
type Deps struct {
|
||||||
@ -69,3 +70,26 @@ func (receiver *Controller) GetHistoryList(ctx echo.Context, params swagger.GetH
|
|||||||
|
|
||||||
return ctx.JSON(http.StatusOK, histories)
|
return ctx.JSON(http.StatusOK, histories)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO:tests.
|
||||||
|
func (receiver *Controller) GetRecentTariffs(ctx echo.Context) error {
|
||||||
|
userID, ok := ctx.Get(models.AuthJWTDecodedUserIDKey).(string)
|
||||||
|
if !ok {
|
||||||
|
receiver.logger.Error("failed to convert jwt payload to string on <GetRecentTariffs> of <HistoryController>")
|
||||||
|
return errors.HTTP(ctx, errors.New(
|
||||||
|
fmt.Errorf("failed to convert jwt payload to string: %s", userID),
|
||||||
|
errors.ErrInvalidArgs,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
|
tariffs, err := receiver.historyService.GetRecentTariffs(ctx.Request().Context(), userID)
|
||||||
|
if err != nil {
|
||||||
|
receiver.logger.Error("failed to get recent tariffs on <GetRecentTariffs> of <HistoryController>",
|
||||||
|
zap.String("userId", userID),
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
|
return errors.HTTP(ctx, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ctx.JSON(http.StatusOK, tariffs)
|
||||||
|
}
|
||||||
|
@ -12,6 +12,7 @@ import (
|
|||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/dto"
|
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/dto"
|
||||||
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/errors"
|
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/errors"
|
||||||
|
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/fields"
|
||||||
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
|
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
|
||||||
mongoWrapper "penahub.gitlab.yandexcloud.net/pena-services/customer/pkg/mongo"
|
mongoWrapper "penahub.gitlab.yandexcloud.net/pena-services/customer/pkg/mongo"
|
||||||
)
|
)
|
||||||
@ -107,3 +108,51 @@ func (receiver *HistoryRepository) CountAll(ctx context.Context, dto *dto.GetHis
|
|||||||
|
|
||||||
return count, nil
|
return count, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO:tests
|
||||||
|
// GetRecentTariffs method for processing a user request with data aggregation with a limit of 100 sorted in descending order.
|
||||||
|
func (receiver *HistoryRepository) GetRecentTariffs(ctx context.Context, userID string) ([]models.TariffID, errors.Error) {
|
||||||
|
matchStage := bson.D{
|
||||||
|
{Key: "$match", Value: bson.D{
|
||||||
|
{Key: fields.History.UserID, Value: userID},
|
||||||
|
{Key: fields.History.IsDeleted, Value: false},
|
||||||
|
{Key: fields.History.Type, Value: models.CustomerHistoryKeyPayCart},
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
|
||||||
|
sortStage := bson.D{
|
||||||
|
{Key: "$sort", Value: bson.D{
|
||||||
|
{Key: "createdAt", Value: -1},
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
|
||||||
|
limitStage := bson.D{
|
||||||
|
{Key: "$limit", Value: 100},
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor, err := receiver.mongoDB.Aggregate(ctx, mongo.Pipeline{matchStage, sortStage, limitStage})
|
||||||
|
if err != nil {
|
||||||
|
receiver.logger.Error("failed to get recent tariffs on <GetRecentTariffs> of <HistoryRepository>",
|
||||||
|
zap.String("userId", userID),
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
|
return nil, errors.New(
|
||||||
|
fmt.Errorf("failed to get recent tariffs on <GetRecentTariffs> of <HistoryRepository>: %w", err),
|
||||||
|
errors.ErrInternalError,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
var result []models.TariffID
|
||||||
|
if err := cursor.All(ctx, &result); err != nil {
|
||||||
|
receiver.logger.Error("failed to decode recent tariffs on <GetRecentTariffs> of <HistoryRepository>",
|
||||||
|
zap.String("userId", userID),
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
|
return nil, errors.New(
|
||||||
|
fmt.Errorf("failed to decode recent tariffs on <GetRecentTariffs> of <HistoryRepository>: %w", err),
|
||||||
|
errors.ErrInternalError,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Package swagger provides primitives to interact with the openapi HTTP API.
|
// Package swagger provides primitives to interact with the openapi HTTP API.
|
||||||
//
|
//
|
||||||
// Code generated by github.com/deepmap/oapi-codegen version v1.15.0 DO NOT EDIT.
|
// Code generated by github.com/deepmap/oapi-codegen/v2 version v2.0.0 DO NOT EDIT.
|
||||||
package swagger
|
package swagger
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -62,6 +62,9 @@ type ServerInterface interface {
|
|||||||
// Получение лога событий связанных с аккаунтом
|
// Получение лога событий связанных с аккаунтом
|
||||||
// (GET /history)
|
// (GET /history)
|
||||||
GetHistory(ctx echo.Context, params GetHistoryParams) error
|
GetHistory(ctx echo.Context, params GetHistoryParams) error
|
||||||
|
// Получение недавних тарифов
|
||||||
|
// (GET /recent)
|
||||||
|
GetRecentTariffs(ctx echo.Context) error
|
||||||
// Изменить валюту кошелька
|
// Изменить валюту кошелька
|
||||||
// (PATCH /wallet)
|
// (PATCH /wallet)
|
||||||
ChangeCurrency(ctx echo.Context) error
|
ChangeCurrency(ctx echo.Context) error
|
||||||
@ -303,6 +306,17 @@ func (w *ServerInterfaceWrapper) GetHistory(ctx echo.Context) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetRecentTariffs converts echo context to params.
|
||||||
|
func (w *ServerInterfaceWrapper) GetRecentTariffs(ctx echo.Context) error {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
ctx.Set(BearerScopes, []string{})
|
||||||
|
|
||||||
|
// Invoke the callback with all the unmarshaled arguments
|
||||||
|
err = w.Handler.GetRecentTariffs(ctx)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// ChangeCurrency converts echo context to params.
|
// ChangeCurrency converts echo context to params.
|
||||||
func (w *ServerInterfaceWrapper) ChangeCurrency(ctx echo.Context) error {
|
func (w *ServerInterfaceWrapper) ChangeCurrency(ctx echo.Context) error {
|
||||||
var err error
|
var err error
|
||||||
@ -367,6 +381,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
|
|||||||
router.GET(baseURL+"/currencies", wrapper.GetCurrencies)
|
router.GET(baseURL+"/currencies", wrapper.GetCurrencies)
|
||||||
router.PUT(baseURL+"/currencies", wrapper.UpdateCurrencies)
|
router.PUT(baseURL+"/currencies", wrapper.UpdateCurrencies)
|
||||||
router.GET(baseURL+"/history", wrapper.GetHistory)
|
router.GET(baseURL+"/history", wrapper.GetHistory)
|
||||||
|
router.GET(baseURL+"/recent", wrapper.GetRecentTariffs)
|
||||||
router.PATCH(baseURL+"/wallet", wrapper.ChangeCurrency)
|
router.PATCH(baseURL+"/wallet", wrapper.ChangeCurrency)
|
||||||
router.POST(baseURL+"/wallet", wrapper.RequestMoney)
|
router.POST(baseURL+"/wallet", wrapper.RequestMoney)
|
||||||
|
|
||||||
@ -375,71 +390,73 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
|
|||||||
// Base64 encoded, gzipped, json marshaled Swagger object
|
// Base64 encoded, gzipped, json marshaled Swagger object
|
||||||
var swaggerSpec = []string{
|
var swaggerSpec = []string{
|
||||||
|
|
||||||
"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",
|
||||||
|
"SAAA",
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSwagger returns the content of the embedded swagger specification file
|
// GetSwagger returns the content of the embedded swagger specification file
|
||||||
|
@ -35,6 +35,7 @@ type walletController interface {
|
|||||||
|
|
||||||
type historyController interface {
|
type historyController interface {
|
||||||
GetHistoryList(ctx echo.Context, params GetHistoryParams) error
|
GetHistoryList(ctx echo.Context, params GetHistoryParams) error
|
||||||
|
GetRecentTariffs(ctx echo.Context) error
|
||||||
}
|
}
|
||||||
|
|
||||||
type Deps struct {
|
type Deps struct {
|
||||||
@ -147,6 +148,10 @@ func (receiver *API) GetHistory(ctx echo.Context, params GetHistoryParams) error
|
|||||||
return receiver.historyController.GetHistoryList(ctx, params)
|
return receiver.historyController.GetHistoryList(ctx, params)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (receiver *API) GetRecentTariffs(ctx echo.Context) error {
|
||||||
|
return receiver.historyController.GetRecentTariffs(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
// Wallet
|
// Wallet
|
||||||
|
|
||||||
func (receiver *API) RequestMoney(ctx echo.Context) error {
|
func (receiver *API) RequestMoney(ctx echo.Context) error {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Package swagger provides primitives to interact with the openapi HTTP API.
|
// Package swagger provides primitives to interact with the openapi HTTP API.
|
||||||
//
|
//
|
||||||
// Code generated by github.com/deepmap/oapi-codegen version v1.15.0 DO NOT EDIT.
|
// Code generated by github.com/deepmap/oapi-codegen/v2 version v2.0.0 DO NOT EDIT.
|
||||||
package swagger
|
package swagger
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -14,6 +14,10 @@ type History struct {
|
|||||||
DeletedAt *time.Time `json:"deletedAt,omitempty" bson:"deletedAt,omitempty"`
|
DeletedAt *time.Time `json:"deletedAt,omitempty" bson:"deletedAt,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TariffID struct {
|
||||||
|
ID string `json:"id" bson:"_id"`
|
||||||
|
}
|
||||||
|
|
||||||
func (receiver *History) Sanitize() *History {
|
func (receiver *History) Sanitize() *History {
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ type historyRepository interface {
|
|||||||
CountAll(context.Context, *dto.GetHistories) (int64, errors.Error)
|
CountAll(context.Context, *dto.GetHistories) (int64, errors.Error)
|
||||||
FindMany(context.Context, *dto.GetHistories) ([]models.History, errors.Error)
|
FindMany(context.Context, *dto.GetHistories) ([]models.History, errors.Error)
|
||||||
Insert(context.Context, *models.History) (*models.History, errors.Error)
|
Insert(context.Context, *models.History) (*models.History, errors.Error)
|
||||||
|
GetRecentTariffs(context.Context, string) ([]models.TariffID, errors.Error) // new
|
||||||
}
|
}
|
||||||
|
|
||||||
type Deps struct {
|
type Deps struct {
|
||||||
@ -90,3 +91,26 @@ func (receiver *Service) CreateHistory(ctx context.Context, history *models.Hist
|
|||||||
|
|
||||||
return createdHistory, nil
|
return createdHistory, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO:tests.
|
||||||
|
func (receiver *Service) GetRecentTariffs(ctx context.Context, userID string) ([]models.TariffID, errors.Error) {
|
||||||
|
if userID == "" {
|
||||||
|
receiver.logger.Error("user id is missing in <GetRecentTariffs> of <HistoryService>")
|
||||||
|
return nil, errors.New(
|
||||||
|
fmt.Errorf("user id is missing: %w", errors.ErrInvalidArgs),
|
||||||
|
errors.ErrInvalidArgs,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
tariffs, err := receiver.repository.GetRecentTariffs(ctx, userID)
|
||||||
|
if err != nil {
|
||||||
|
receiver.logger.Error(
|
||||||
|
"failed to get recent tariffs in <GetRecentTariffs> of <HistoryService>",
|
||||||
|
zap.String("userId", userID),
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return tariffs, nil
|
||||||
|
}
|
||||||
|
@ -45,4 +45,4 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
Loading…
Reference in New Issue
Block a user