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" mongoWrapper "penahub.gitlab.yandexcloud.net/backend/penahub_common/mongo" "gitea.pena/PenaSide/customer/internal/errors" "gitea.pena/PenaSide/customer/internal/fields" "gitea.pena/PenaSide/customer/internal/models" ) 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.Logger == nil { log.Panicln("logger is nil on ") } if deps.MongoDB == nil { log.Panicln("mongodb 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.Currency.IsDeleted: 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) ReplaceCurrencies(ctx context.Context, list *models.CurrencyList) (*models.CurrencyList, errors.Error) { currencyList := models.CurrencyList{} filter := bson.M{ fields.Currency.Name: list.Name, fields.Currency.IsDeleted: false, } update := bson.M{ "$set": bson.M{ fields.Currency.UpdatedAt: time.Now(), fields.Currency.Currencies: list.Currencies, }, } if err := receiver.mongoDB.FindOneAndUpdate(ctx, filter, update).Decode(¤cyList); err != nil { receiver.logger.Error("failed to insert currencies on of ", zap.String("name", list.Name), zap.Error(err), ) removeErr := errors.New( fmt.Errorf("failed to insert currencies <%s> on of : %w", list.Name, err), errors.ErrInternalError, ) if err == mongo.ErrNoDocuments { removeErr.SetType(errors.ErrNotFound) } return nil, removeErr } return ¤cyList, nil } func (receiver *CurrencyRepository) Insert(ctx context.Context, list *models.CurrencyList) (*models.CurrencyList, errors.Error) { result, err := receiver.mongoDB.InsertOne(ctx, list.Sanitize()) if err != nil { receiver.logger.Error("failed to insert currency list on of ", zap.Any("list", list), zap.Error(err), ) return nil, errors.New( fmt.Errorf("failed to insert currency list on of : %w", err), errors.ErrInternalError, ) } insertedID := result.InsertedID.(primitive.ObjectID).Hex() list.ID = insertedID return list, nil }