From 0a232e505d070adc0afdcdc4e0a28de78bb7dc92 Mon Sep 17 00:00:00 2001 From: pasha1coil Date: Thu, 23 Nov 2023 21:55:22 +0300 Subject: [PATCH] add route /recent and fix history repo --- api/openapi/v1/openapi.yaml | 14 +- deployments/local/.env.test | 4 + deployments/local/auth.env.test | 9 + deployments/local/docker-compose.yaml | 217 ++++++++++++++++++ .../controller/rest/history/history.go | 2 +- internal/interface/repository/history.go | 39 ++-- internal/interface/swagger/api.gen.go | 149 ++++++------ internal/interface/swagger/models.gen.go | 2 +- internal/models/history.go | 4 + internal/service/history/history.go | 15 +- migrations/test/001_accounts_insert.up.json | 2 +- 11 files changed, 356 insertions(+), 101 deletions(-) create mode 100644 deployments/local/.env.test create mode 100644 deployments/local/auth.env.test create mode 100644 deployments/local/docker-compose.yaml diff --git a/api/openapi/v1/openapi.yaml b/api/openapi/v1/openapi.yaml index f0f8b5b..e982a38 100644 --- a/api/openapi/v1/openapi.yaml +++ b/api/openapi/v1/openapi.yaml @@ -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". - diff --git a/deployments/local/.env.test b/deployments/local/.env.test new file mode 100644 index 0000000..fad1595 --- /dev/null +++ b/deployments/local/.env.test @@ -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-----" diff --git a/deployments/local/auth.env.test b/deployments/local/auth.env.test new file mode 100644 index 0000000..6d0290c --- /dev/null +++ b/deployments/local/auth.env.test @@ -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 \ No newline at end of file diff --git a/deployments/local/docker-compose.yaml b/deployments/local/docker-compose.yaml new file mode 100644 index 0000000..447aa06 --- /dev/null +++ b/deployments/local/docker-compose.yaml @@ -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: \ No newline at end of file diff --git a/internal/interface/controller/rest/history/history.go b/internal/interface/controller/rest/history/history.go index d44cf40..f4636eb 100644 --- a/internal/interface/controller/rest/history/history.go +++ b/internal/interface/controller/rest/history/history.go @@ -16,7 +16,7 @@ import ( type historyService interface { GetHistoryList(context.Context, *dto.GetHistories) (*models.PaginationResponse[models.History], errors.Error) - GetRecentTariffs(context.Context, string) ([]string, errors.Error) //new + GetRecentTariffs(context.Context, string) ([]models.TariffID, errors.Error) //new } type Deps struct { diff --git a/internal/interface/repository/history.go b/internal/interface/repository/history.go index ec2f517..f288a27 100644 --- a/internal/interface/repository/history.go +++ b/internal/interface/repository/history.go @@ -112,20 +112,27 @@ func (receiver *HistoryRepository) CountAll(ctx context.Context, dto *dto.GetHis // 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) ([]string, errors.Error) { - var result []struct { - ID string `bson:"tariffID"` +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}, + }}, } - filter := bson.D{ - {Key: fields.History.UserID, Value: userID}, - {Key: fields.History.IsDeleted, Value: false}, + sortStage := bson.D{ + {Key: "$sort", Value: bson.D{ + {Key: "createdAt", Value: -1}, + }}, } - findOptions := options.Find() - findOptions.SetSort(bson.D{{"createdAt", -1}}) - findOptions.SetLimit(100) - cursor, err := receiver.mongoDB.Find(ctx, filter, findOptions) + 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 of ", zap.String("userId", userID), @@ -137,6 +144,7 @@ func (receiver *HistoryRepository) GetRecentTariffs(ctx context.Context, userID ) } + var result []models.TariffID if err := cursor.All(ctx, &result); err != nil { receiver.logger.Error("failed to decode recent tariffs on of ", zap.String("userId", userID), @@ -147,13 +155,6 @@ func (receiver *HistoryRepository) GetRecentTariffs(ctx context.Context, userID errors.ErrInternalError, ) } - tariffSet := make(map[string]struct{}, len(result)) - for _, item := range result { - tariffSet[item.ID] = struct{}{} - } - tariffs := make([]string, 0, len(tariffSet)) - for tariff := range tariffSet { - tariffs = append(tariffs, tariff) - } - return tariffs, nil + + return result, nil } diff --git a/internal/interface/swagger/api.gen.go b/internal/interface/swagger/api.gen.go index 736822b..aa2a636 100644 --- a/internal/interface/swagger/api.gen.go +++ b/internal/interface/swagger/api.gen.go @@ -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 diff --git a/internal/interface/swagger/models.gen.go b/internal/interface/swagger/models.gen.go index d9bcc01..05513a9 100644 --- a/internal/interface/swagger/models.gen.go +++ b/internal/interface/swagger/models.gen.go @@ -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 ( diff --git a/internal/models/history.go b/internal/models/history.go index 7bf03bf..23a8917 100644 --- a/internal/models/history.go +++ b/internal/models/history.go @@ -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() diff --git a/internal/service/history/history.go b/internal/service/history/history.go index 013732b..4672da7 100644 --- a/internal/service/history/history.go +++ b/internal/service/history/history.go @@ -16,7 +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) ([]string, errors.Error) //new + GetRecentTariffs(context.Context, string) ([]models.TariffID, errors.Error) //new } type Deps struct { @@ -93,8 +93,8 @@ func (receiver *Service) CreateHistory(ctx context.Context, history *models.Hist } // TODO:tests -func (receiver *Service) GetRecentTariffs(ctx context.Context, userID string) ([]string, errors.Error) { - // Validation of input data +func (receiver *Service) GetRecentTariffs(ctx context.Context, userID string) ([]models.TariffID, errors.Error) { + if userID == "" { receiver.logger.Error("user id is missing in of ") return nil, errors.New( @@ -113,14 +113,5 @@ func (receiver *Service) GetRecentTariffs(ctx context.Context, userID string) ([ return nil, err } - // Processing the received response, optional - if len(tariffs) == 0 { - receiver.logger.Info( - "no recent tariffs found for user in of ", - zap.String("userId", userID), - ) - // если слайс тарифов пуст является ли это ошибкой, возвращать ошибку или пустой слайс? - } - return tariffs, nil } diff --git a/migrations/test/001_accounts_insert.up.json b/migrations/test/001_accounts_insert.up.json index 4c182c7..31ba326 100644 --- a/migrations/test/001_accounts_insert.up.json +++ b/migrations/test/001_accounts_insert.up.json @@ -45,4 +45,4 @@ } ] } -] +] \ No newline at end of file