package payment import ( "context" "enaklo-pos-be/internal/common/logger" "enaklo-pos-be/internal/entity" "github.com/google/uuid" "go.uber.org/zap" "gorm.io/gorm" "strconv" ) type PaymentRepository struct { db *gorm.DB } func NewPaymentRepository(db *gorm.DB) *PaymentRepository { return &PaymentRepository{ db: db, } } func (r *PaymentRepository) Create(ctx context.Context, payment *entity.Payment) (*entity.Payment, error) { payment.ID = uuid.New() if err := r.db.WithContext(ctx).Create(payment).Error; err != nil { logger.ContextLogger(ctx).Error("error when creating payment", zap.Error(err)) return nil, err } return payment, nil } // Update updates an existing payment record in the database func (r *PaymentRepository) Update(ctx context.Context, payment *entity.Payment) (*entity.Payment, error) { if err := r.db.WithContext(ctx).Save(payment).Error; err != nil { logger.ContextLogger(ctx).Error("error when updating payment", zap.Error(err)) return nil, err } return payment, nil } func (r *PaymentRepository) UpdateWithTx(ctx context.Context, tx *gorm.DB, payment *entity.Payment) (*entity.Payment, error) { if err := tx.WithContext(ctx).Save(payment).Error; err != nil { logger.ContextLogger(ctx).Error("error when updating payment", zap.Error(err)) return nil, err } return payment, nil } // FindByID retrieves a payment record by its ID func (r *PaymentRepository) FindByID(ctx context.Context, id uuid.UUID) (*entity.Payment, error) { payment := new(entity.Payment) if err := r.db.WithContext(ctx).First(payment, id).Error; err != nil { logger.ContextLogger(ctx).Error("error when finding payment by ID", zap.Error(err)) return nil, err } return payment, nil } func (r *PaymentRepository) FindByOrderAndPartnerID(ctx context.Context, orderID, partnerID int64) (*entity.Payment, error) { payment := new(entity.Payment) orderIDStr := strconv.FormatInt(orderID, 10) partnerIDStr := strconv.FormatInt(partnerID, 10) if err := r.db.WithContext(ctx). Where("order_id = ? AND partner_id = ?", orderIDStr, partnerIDStr). First(payment).Error; err != nil { logger.ContextLogger(ctx).Error("error when finding payment by order ID and partner ID", zap.Error(err)) return nil, err } return payment, nil } // FindByReferenceID retrieves a payment record by its reference ID func (r *PaymentRepository) FindByReferenceID(ctx context.Context, db *gorm.DB, referenceID string) (*entity.Payment, error) { payment := new(entity.Payment) if db == nil { db = r.db } if err := db.WithContext(ctx).Where("reference_id = ?", referenceID).First(payment).Error; err != nil { logger.ContextLogger(ctx).Error("error when finding payment by reference ID", zap.Error(err)) return nil, err } return payment, nil }