update issue 3

This commit is contained in:
pasha1coil 2023-11-22 20:31:17 +03:00 committed by skeris
parent 298e079f0f
commit c149d6a743
4 changed files with 113 additions and 0 deletions

@ -16,6 +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
}
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)
}

@ -3,7 +3,9 @@ package repository
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/bson"
"log"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/fields"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/bson/primitive"
@ -107,3 +109,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) ([]string, errors.Error) {
var result []struct {
ID string `bson:"tariffID"`
}
filter := bson.D{
{fields.History.UserID, userID},
{fields.History.IsDeleted, false},
}
pipeline := mongo.Pipeline{
{{"$match", filter}},
{{"$unwind", "$rawDetails"}},
{{"$match", bson.D{{"rawDetails.Key", "tariffs"}}}},
{{"$unwind", "$rawDetails.Value"}},
{{"$group", bson.D{{"_id", "$rawDetails.Value.Key.id"}}}},
{{"$sort", bson.D{{"createdAt", -1}}}}, // -1 specifies descending order
{{"$limit", 100}},
}
cursor, err := receiver.mongoDB.Aggregate(ctx, pipeline)
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,
)
}
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,
)
}
tariffs := make([]string, len(result))
for i, item := range result {
tariffs[i] = item.ID
}
return tariffs, nil
}

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

@ -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) ([]string, errors.Error) //new
}
type Deps struct {
@ -90,3 +91,36 @@ func (receiver *Service) CreateHistory(ctx context.Context, history *models.Hist
return createdHistory, nil
}
// TODO:tests
func (receiver *Service) GetRecentTariffs(ctx context.Context, userID string) ([]string, errors.Error) {
// Validation of input data
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
}
// Processing the received response, optional
if len(tariffs) == 0 {
receiver.logger.Info(
"no recent tariffs found for user in <GetRecentTariffs> of <HistoryService>",
zap.String("userId", userID),
)
// если слайс тарифов пуст является ли это ошибкой, возвращать ошибку или пустой слайс?
}
return tariffs, nil
}