2024-06-05 00:24:53 +07:00

81 lines
2.7 KiB
Go

package payment
import (
"context"
"furtuna-be/internal/common/logger"
"furtuna-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 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
}