diff --git a/internal/controller/history/history.go b/internal/controller/history/history.go new file mode 100644 index 0000000..7f21009 --- /dev/null +++ b/internal/controller/history/history.go @@ -0,0 +1,71 @@ +package history + +import ( + "context" + "log" + "net/http" + + "github.com/labstack/echo/v4" + "go.uber.org/zap" + "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/errors" + "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models" + "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/swagger" + "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/utils/echotools" +) + +type historyService interface { + CreateHistory(context.Context, *models.History) (*models.History, errors.Error) + GetHistoryList(context.Context, *models.Pagination) (*models.PaginationResponse[models.History], errors.Error) +} + +type Deps struct { + Logger *zap.Logger + HistoryService historyService +} + +type Controller struct { + logger *zap.Logger + historyService historyService +} + +func New(deps *Deps) *Controller { + if deps == nil { + log.Panicln("deps is nil on ") + } + + if deps.Logger == nil { + log.Panicln("logger is nil on ") + } + + if deps.HistoryService == nil { + log.Panicln("HistoryService is nil on ") + } + + return &Controller{ + logger: deps.Logger, + historyService: deps.HistoryService, + } +} + +func (receiver *Controller) CreateHistory(ctx echo.Context) error { + createdHistory, err := receiver.historyService.CreateHistory(ctx.Request().Context(), &models.History{}) + if err != nil { + receiver.logger.Error("failed to create history on of ", zap.Error(err)) + return echotools.ResponseError(ctx, err) + } + + return ctx.JSON(http.StatusOK, createdHistory) +} + +func (receiver *Controller) GetHistoryList(ctx echo.Context, params swagger.GetHistoryParams) error { + histories, err := receiver.historyService.GetHistoryList(ctx.Request().Context(), &models.Pagination{ + Page: int64(*params.Page), + Limit: int64(*params.Limit), + }) + if err != nil { + receiver.logger.Error("failed to get histories on of ", zap.Error(err)) + return echotools.ResponseError(ctx, err) + } + + return ctx.JSON(http.StatusOK, histories) +} diff --git a/internal/fields/history.go b/internal/fields/history.go new file mode 100644 index 0000000..3c289bb --- /dev/null +++ b/internal/fields/history.go @@ -0,0 +1,23 @@ +package fields + +var History = struct { + ID string + UserID string + Comment string + Subject string + Type string + Deleted string + CreatedAt string + UpdatedAt string + DeletedAt string +}{ + ID: "_id", + UserID: "userId", + Comment: "comment", + Subject: "subject", + Type: "type", + Deleted: "deleted", + CreatedAt: "createdAt", + UpdatedAt: "updatedAt", + DeletedAt: "deletedAt", +} diff --git a/internal/models/history.go b/internal/models/history.go new file mode 100644 index 0000000..bde710e --- /dev/null +++ b/internal/models/history.go @@ -0,0 +1,25 @@ +package models + +import "time" + +type History struct { + ID string `json:"id" bson:"_id,omitempty"` + UserID string `json:"userId" bson:"userId"` + Comment string `json:"comment" bson:"comment"` + Subject string `json:"subject" bson:"subject"` + Type HistoryType `json:"type" bson:"type"` + Deleted bool `json:"deleted" bson:"deleted"` + CreatedAt time.Time `json:"createdAt" bson:"createdAt"` + UpdatedAt time.Time `json:"updatedAt" bson:"updatedAt"` + DeletedAt *time.Time `json:"deletedAt,omitempty" bson:"deletedAt,omitempty"` +} + +type HistoryType string + +const ( + BuyCart HistoryType = "buyCart" + DeclinedPayment HistoryType = "declinedPayment" + SubsriptionEnd HistoryType = "subsriptionEnd" + SuccessfulPayment HistoryType = "successfulPayment" + TimeoutPayment HistoryType = "timeoutPayment" +) diff --git a/internal/repository/history.go b/internal/repository/history.go new file mode 100644 index 0000000..2f74487 --- /dev/null +++ b/internal/repository/history.go @@ -0,0 +1,85 @@ +package repository + +import ( + "context" + "fmt" + "log" + "time" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.uber.org/zap" + "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" +) + +type HistoryRepositoryDeps struct { + Logger *zap.Logger + MongoDB *mongo.Collection +} + +type HistoryRepository struct { + logger *zap.Logger + mongoDB *mongo.Collection +} + +func NewHistoryRepository(deps *HistoryRepositoryDeps) *HistoryRepository { + if deps == nil { + log.Panicln("deps is nil on ") + } + + if deps.Logger == nil { + log.Panicln("logger is nil on ") + } + + if deps.MongoDB == nil { + log.Panicln("mongodb is nil on ") + } + + return &HistoryRepository{ + logger: deps.Logger, + mongoDB: deps.MongoDB, + } +} + +func (receiver *HistoryRepository) Insert(ctx context.Context, history *models.History) (*models.History, errors.Error) { + history.CreatedAt = time.Now() + history.UpdatedAt = time.Now() + history.Deleted = false + + result, err := receiver.mongoDB.InsertOne(ctx, history) + if err != nil { + receiver.logger.Error("failed to insert history on of ", + zap.Any("history", history), + zap.Error(err), + ) + + return nil, errors.New( + fmt.Errorf("failed to insert history on of : %w", err), + errors.ErrInternalError, + ) + } + + insertedID := result.InsertedID.(primitive.ObjectID).Hex() + history.ID = insertedID + + return history, nil +} + +func (receiver *HistoryRepository) CountAll(ctx context.Context) (int64, errors.Error) { + count, err := receiver.mongoDB.CountDocuments(ctx, bson.M{fields.History.Deleted: false}) + if err != nil { + receiver.logger.Error("failed to count all documents on of ", + zap.Error(err), + ) + + return 0, errors.New( + fmt.Errorf("failed to count all documents on of : %w", err), + errors.ErrInternalError, + ) + } + + return count, nil +} diff --git a/internal/service/history/history.go b/internal/service/history/history.go new file mode 100644 index 0000000..168b161 --- /dev/null +++ b/internal/service/history/history.go @@ -0,0 +1,97 @@ +package currency + +import ( + "context" + "fmt" + "log" + "math" + + "go.uber.org/zap" + "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/errors" + "penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models" +) + +type historyRepository interface { + CountAll(context.Context) (int64, errors.Error) + FindMany(ctx context.Context, page, limit int64) ([]models.History, errors.Error) + Insert(context.Context, *models.History) (*models.History, errors.Error) +} + +type Deps struct { + Logger *zap.Logger + Repository historyRepository +} + +type Service struct { + logger *zap.Logger + repository historyRepository +} + +func New(deps *Deps) *Service { + if deps == nil { + log.Panicln("deps is nil on ") + } + + if deps.Logger == nil { + log.Panicln("logger is nil on ") + } + + if deps.Repository == nil { + log.Panicln("repository is nil on ") + } + + return &Service{ + logger: deps.Logger, + repository: deps.Repository, + } +} + +func (receiver *Service) GetHistoryList(ctx context.Context, pagination *models.Pagination) (*models.PaginationResponse[models.History], errors.Error) { + if pagination == nil { + return nil, errors.New( + fmt.Errorf("pagination is nil on of : %w", errors.ErrInternalError), + errors.ErrInternalError, + ) + } + + count, err := receiver.repository.CountAll(ctx) + if err != nil { + receiver.logger.Error("failed to count histories on of ", + zap.Error(err.Extract()), + ) + + return nil, err + } + + if count == 0 { + return &models.PaginationResponse[models.History]{TotalPages: 0, Records: []models.History{}}, nil + } + + totalPages := int64(math.Ceil(float64(count) / float64(pagination.Limit))) + + histories, err := receiver.repository.FindMany(ctx, pagination.Page, pagination.Limit) + if err != nil { + receiver.logger.Error("failed to get historiy list on of ", + zap.Error(err.Extract()), + zap.Int64("page", pagination.Page), + zap.Int64("limit", pagination.Limit), + ) + + return nil, err + } + + return &models.PaginationResponse[models.History]{ + TotalPages: totalPages, + Records: histories, + }, nil +} + +func (receiver *Service) CreateHistory(ctx context.Context, history *models.History) (*models.History, errors.Error) { + createdHistory, err := receiver.repository.Insert(ctx, history) + if err != nil { + receiver.logger.Error("failed to create history on of ", zap.Error(err)) + return nil, err + } + + return createdHistory, nil +} diff --git a/internal/swagger/api.gen.go b/internal/swagger/api.gen.go index 68e3a12..f407be7 100644 --- a/internal/swagger/api.gen.go +++ b/internal/swagger/api.gen.go @@ -370,66 +370,66 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "7d8BAAD//xnIgYj0QgAA", + "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", + "WkosduIbwox4dWH13wEAAP//CUifXPxCAAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/swagger/api.go b/internal/swagger/api.go index abf7789..c198249 100644 --- a/internal/swagger/api.go +++ b/internal/swagger/api.go @@ -34,11 +34,17 @@ type walletController interface { PutMoney(ctx echo.Context) error } +type historyController interface { + CreateHistory(ctx echo.Context) error + GetHistoryList(ctx echo.Context, params GetHistoryParams) error +} + type Deps struct { AccountController accountController CurrencyController currencyController CartController cartController WalletController walletController + HistoryController historyController } type API struct { @@ -46,6 +52,7 @@ type API struct { currencyController currencyController cartController cartController walletController walletController + historyController historyController } func New(deps *Deps) *API { @@ -69,11 +76,16 @@ func New(deps *Deps) *API { log.Panicln("walletController is nil on ") } + if deps.HistoryController == nil { + log.Panicln("historyController is nil on ") + } + return &API{ accountController: deps.AccountController, currencyController: deps.CurrencyController, cartController: deps.CartController, walletController: deps.WalletController, + historyController: deps.HistoryController, } } @@ -129,12 +141,12 @@ func (receiver *API) UpdateCurrencies(ctx echo.Context) error { // History -func (receiver *API) GetHistory(ctx echo.Context, _ GetHistoryParams) error { - return ctx.String(http.StatusNotImplemented, "method not implemented") +func (receiver *API) GetHistory(ctx echo.Context, params GetHistoryParams) error { + return receiver.historyController.GetHistoryList(ctx, params) } func (receiver *API) Add2history(ctx echo.Context) error { - return ctx.String(http.StatusNotImplemented, "method not implemented") + return receiver.historyController.CreateHistory(ctx) } // Wallet diff --git a/openapi.yaml b/openapi.yaml index 8ee8ee9..0a0f5d1 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -670,7 +670,7 @@ components: истории, поэтому предлагаю в это поле просто класть строку с json. Ибо для каждого типа записи она своя. - example: {"tariffs":["807f1f77bcf81cd799439011","807f1f77bcf81cd799439011"]} + example: '{"tariffs":["807f1f77bcf81cd799439011","807f1f77bcf81cd799439011"]}' Error: type: object