feat: history

This commit is contained in:
Kirill 2023-05-23 13:52:27 +03:00
parent c2274e383b
commit 7aa91c9f67
8 changed files with 377 additions and 64 deletions

@ -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 <New (history controller)>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <New (history controller)>")
}
if deps.HistoryService == nil {
log.Panicln("HistoryService is nil on <New (history controller)>")
}
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 <CreateHistory> of <HistoryController>", 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 <GetHistoryList> of <HistoryController>", zap.Error(err))
return echotools.ResponseError(ctx, err)
}
return ctx.JSON(http.StatusOK, histories)
}

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

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

@ -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 <NewHistoryRepository>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <NewHistoryRepository>")
}
if deps.MongoDB == nil {
log.Panicln("mongodb is nil on <NewHistoryRepository>")
}
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 <Insert> of <HistoryRepository>",
zap.Any("history", history),
zap.Error(err),
)
return nil, errors.New(
fmt.Errorf("failed to insert history on <Insert> of <HistoryRepository>: %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 <CountAll> of <HistoryRepository>",
zap.Error(err),
)
return 0, errors.New(
fmt.Errorf("failed to count all documents on <CountAll> of <HistoryRepository>: %w", err),
errors.ErrInternalError,
)
}
return count, nil
}

@ -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 <New (history service)>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <New (history service)>")
}
if deps.Repository == nil {
log.Panicln("repository is nil on <New (history service)>")
}
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 <GetHistoryList> of <HistoryService>: %w", errors.ErrInternalError),
errors.ErrInternalError,
)
}
count, err := receiver.repository.CountAll(ctx)
if err != nil {
receiver.logger.Error("failed to count histories on <GetHistoryList> of <HistoryService>",
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 <GetHistoryList> of <HistoryService>",
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 <CreateHistory> of <HistoryService>", zap.Error(err))
return nil, err
}
return createdHistory, nil
}

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

@ -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 <New (API)>")
}
if deps.HistoryController == nil {
log.Panicln("historyController is nil on <New (API)>")
}
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

@ -670,7 +670,7 @@ components:
истории, поэтому предлагаю в это
поле просто класть строку с json.
Ибо для каждого типа записи она своя.
example: {"tariffs":["807f1f77bcf81cd799439011","807f1f77bcf81cd799439011"]}
example: '{"tariffs":["807f1f77bcf81cd799439011","807f1f77bcf81cd799439011"]}'
Error:
type: object