This commit is contained in:
Mikhail 2023-11-25 11:44:11 +00:00
parent 298e079f0f
commit c0bb6e4ca4
13 changed files with 435 additions and 70 deletions

@ -44,7 +44,7 @@ linters:
- revive
- rowserrcheck
- staticcheck
- stylecheck
# - stylecheck
- thelper
- typecheck
- unconvert

@ -573,6 +573,19 @@ paths:
schema:
$ref: '#/components/schemas/Error'
/recent:
get:
tags:
- history
summary: Получение недавних тарифов
description: Возвращает список уникальных тарифов из истории. Айди аккаунта получается из заголовка.
operationId: getRecentTariffs
security:
- Bearer: []
responses:
'200':
description: Успешный запрос
components:
schemas:
@ -747,4 +760,3 @@ components:
bearerFormat: JWT
description: >-
Enter the token with the `Bearer: ` prefix, e.g. "Bearer abcde12345".

@ -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-----"

@ -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

@ -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 {
GetHistoryList(context.Context, *dto.GetHistories) (*models.PaginationResponse[models.History], errors.Error)
GetRecentTariffs(context.Context, string) ([]models.TariffID, errors.Error) // new
}
type Deps struct {
@ -69,3 +70,26 @@ func (receiver *Controller) GetHistoryList(ctx echo.Context, params swagger.GetH
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"
"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/fields"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
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
}
// 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.
//
// 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
import (
@ -62,6 +62,9 @@ type ServerInterface interface {
// Получение лога событий связанных с аккаунтом
// (GET /history)
GetHistory(ctx echo.Context, params GetHistoryParams) error
// Получение недавних тарифов
// (GET /recent)
GetRecentTariffs(ctx echo.Context) error
// Изменить валюту кошелька
// (PATCH /wallet)
ChangeCurrency(ctx echo.Context) error
@ -303,6 +306,17 @@ func (w *ServerInterfaceWrapper) GetHistory(ctx echo.Context) error {
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.
func (w *ServerInterfaceWrapper) ChangeCurrency(ctx echo.Context) error {
var err error
@ -367,6 +381,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
router.GET(baseURL+"/currencies", wrapper.GetCurrencies)
router.PUT(baseURL+"/currencies", wrapper.UpdateCurrencies)
router.GET(baseURL+"/history", wrapper.GetHistory)
router.GET(baseURL+"/recent", wrapper.GetRecentTariffs)
router.PATCH(baseURL+"/wallet", wrapper.ChangeCurrency)
router.POST(baseURL+"/wallet", wrapper.RequestMoney)
@ -375,71 +390,73 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
// Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{
"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",
"SAAA",
}
// GetSwagger returns the content of the embedded swagger specification file

@ -35,6 +35,7 @@ type walletController interface {
type historyController interface {
GetHistoryList(ctx echo.Context, params GetHistoryParams) error
GetRecentTariffs(ctx echo.Context) error
}
type Deps struct {
@ -147,6 +148,10 @@ func (receiver *API) GetHistory(ctx echo.Context, params GetHistoryParams) error
return receiver.historyController.GetHistoryList(ctx, params)
}
func (receiver *API) GetRecentTariffs(ctx echo.Context) error {
return receiver.historyController.GetRecentTariffs(ctx)
}
// Wallet
func (receiver *API) RequestMoney(ctx echo.Context) error {

@ -1,6 +1,6 @@
// 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
import (

@ -14,6 +14,10 @@ type History struct {
DeletedAt *time.Time `json:"deletedAt,omitempty" bson:"deletedAt,omitempty"`
}
type TariffID struct {
ID string `json:"id" bson:"_id"`
}
func (receiver *History) Sanitize() *History {
now := time.Now()

@ -16,6 +16,7 @@ type historyRepository interface {
CountAll(context.Context, *dto.GetHistories) (int64, errors.Error)
FindMany(context.Context, *dto.GetHistories) ([]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 {
@ -90,3 +91,26 @@ func (receiver *Service) CreateHistory(ctx context.Context, history *models.Hist
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
}