customer/internal/repository/currency.go

113 lines
2.8 KiB
Go
Raw Normal View History

2023-05-18 19:43:43 +00:00
package repository
import (
"context"
"fmt"
2023-05-19 04:50:40 +00:00
"log"
2023-05-18 19:43:43 +00:00
"go.mongodb.org/mongo-driver/bson"
"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"
mongoWrapper "penahub.gitlab.yandexcloud.net/pena-services/customer/pkg/mongo"
)
type CurrencyRepositoryDeps struct {
Logger *zap.Logger
MongoDB *mongo.Collection
}
type CurrencyRepository struct {
logger *zap.Logger
mongoDB *mongo.Collection
}
func NewCurrencyRepository(deps *CurrencyRepositoryDeps) *CurrencyRepository {
2023-05-19 04:50:40 +00:00
if deps == nil {
log.Panicln("deps is nil on <NewCurrencyRepository>")
}
if deps.Logger == nil {
log.Panicln("logger is nil on <NewCurrencyRepository>")
}
if deps.MongoDB == nil {
log.Panicln("repository is nil on <NewCurrencyRepository>")
}
2023-05-18 19:43:43 +00:00
return &CurrencyRepository{
mongoDB: deps.MongoDB,
logger: deps.Logger,
}
}
func (receiver *CurrencyRepository) FindCurrenciesList(ctx context.Context, name string) (*models.CurrencyList, errors.Error) {
filter := bson.M{
fields.Currency.Name: name,
fields.Account.Deleted: false,
}
currencyList, err := mongoWrapper.FindOne[models.CurrencyList](ctx, &mongoWrapper.RequestSettings{
Driver: receiver.mongoDB,
Filter: filter,
})
if err != nil {
receiver.logger.Error("failed to find list on <FindCurrenciesList> of <CurrencyRepository>",
zap.String("name", name),
zap.Error(err),
)
findError := errors.New(
fmt.Errorf("failed to find list with <%s> on <FindCurrenciesList> of <CurrencyRepository>: %w", name, err),
errors.ErrInternalError,
)
if err == mongo.ErrNoDocuments {
findError.SetType(errors.ErrNotFound)
}
return nil, findError
}
return currencyList, nil
}
func (receiver *CurrencyRepository) InsertCurrenciesToList(ctx context.Context, name string, currencies []string) (*models.CurrencyList, errors.Error) {
currencyList := models.CurrencyList{}
update := bson.M{
"$addToSet": bson.M{
fields.Currency.Currencies: bson.M{
"$each": currencies,
},
},
}
filter := bson.M{
fields.Currency.Name: name,
fields.Account.Deleted: false,
}
if err := receiver.mongoDB.FindOneAndUpdate(ctx, filter, update).Decode(&currencyList); err != nil {
receiver.logger.Error("failed to insert currencies on <InsertCurrenciesToList> of <CurrencyRepository>",
zap.String("name", name),
zap.Error(err),
)
removeErr := errors.New(
fmt.Errorf("failed to insert currencies <%s> on <InsertCurrenciesToList> of <CurrencyRepository>: %w", name, err),
errors.ErrInternalError,
)
if err == mongo.ErrNoDocuments {
removeErr.SetType(errors.ErrNotFound)
}
return nil, removeErr
}
return &currencyList, nil
}