migrated raw mongo.Collection to repository.Repository + chain driver resolution fix
This commit is contained in:
@@ -14,7 +14,6 @@ import (
|
||||
"github.com/tech/sendico/pkg/mlogger"
|
||||
"go.mongodb.org/mongo-driver/v2/bson"
|
||||
"go.mongodb.org/mongo-driver/v2/mongo"
|
||||
"go.mongodb.org/mongo-driver/v2/mongo/options"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
@@ -25,7 +24,7 @@ const (
|
||||
|
||||
type Payments struct {
|
||||
logger mlogger.Logger
|
||||
coll *mongo.Collection
|
||||
repo repository.Repository
|
||||
}
|
||||
|
||||
func NewPayments(logger mlogger.Logger, db *mongo.Database) (*Payments, error) {
|
||||
@@ -48,7 +47,7 @@ func NewPayments(logger mlogger.Logger, db *mongo.Database) (*Payments, error) {
|
||||
|
||||
p := &Payments{
|
||||
logger: logger,
|
||||
coll: db.Collection(paymentsCollection),
|
||||
repo: repo,
|
||||
}
|
||||
p.logger.Debug("Payments store initialised")
|
||||
return p, nil
|
||||
@@ -60,8 +59,8 @@ func (p *Payments) FindByIdempotencyKey(ctx context.Context, key string) (*model
|
||||
return nil, merrors.InvalidArgument("idempotency key is required", "idempotency_key")
|
||||
}
|
||||
var result model.PaymentRecord
|
||||
err := p.coll.FindOne(ctx, bson.M{fieldIdempotencyKey: key}).Decode(&result)
|
||||
if err == mongo.ErrNoDocuments {
|
||||
err := p.repo.FindOneByFilter(ctx, repository.Filter(fieldIdempotencyKey, key), &result)
|
||||
if errors.Is(err, merrors.ErrNoData) {
|
||||
return nil, nil
|
||||
}
|
||||
if err != nil {
|
||||
@@ -98,10 +97,26 @@ func (p *Payments) Upsert(ctx context.Context, record *model.PaymentRecord) erro
|
||||
}
|
||||
record.UpdatedAt = now
|
||||
record.ID = bson.NilObjectID
|
||||
update := bson.M{
|
||||
"$set": record,
|
||||
|
||||
filter := repository.Filter(fieldIdempotencyKey, record.IdempotencyKey)
|
||||
existing := &model.PaymentRecord{}
|
||||
err := p.repo.FindOneByFilter(ctx, filter, existing)
|
||||
switch {
|
||||
case err == nil:
|
||||
record.ID = existing.ID
|
||||
err = p.repo.Update(ctx, record)
|
||||
case errors.Is(err, merrors.ErrNoData):
|
||||
record.ID = bson.NilObjectID
|
||||
err = p.repo.Insert(ctx, record, filter)
|
||||
if errors.Is(err, merrors.ErrDataConflict) {
|
||||
if findErr := p.repo.FindOneByFilter(ctx, filter, existing); findErr != nil {
|
||||
err = findErr
|
||||
break
|
||||
}
|
||||
record.ID = existing.ID
|
||||
err = p.repo.Update(ctx, record)
|
||||
}
|
||||
}
|
||||
_, err := p.coll.UpdateOne(ctx, bson.M{fieldIdempotencyKey: record.IdempotencyKey}, update, options.UpdateOne().SetUpsert(true))
|
||||
if err != nil {
|
||||
if !errors.Is(err, context.Canceled) && !errors.Is(err, context.DeadlineExceeded) {
|
||||
p.logger.Warn("Failed to upsert payment record",
|
||||
|
||||
Reference in New Issue
Block a user