package repository import ( "context" "fmt" "log" "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 { 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("repository is nil on ") } 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 of ", zap.String("name", name), zap.Error(err), ) findError := errors.New( fmt.Errorf("failed to find list with <%s> on of : %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(¤cyList); err != nil { receiver.logger.Error("failed to insert currencies on of ", zap.String("name", name), zap.Error(err), ) removeErr := errors.New( fmt.Errorf("failed to insert currencies <%s> on of : %w", name, err), errors.ErrInternalError, ) if err == mongo.ErrNoDocuments { removeErr.SetType(errors.ErrNotFound) } return nil, removeErr } return ¤cyList, nil }