apskel-pos-backend/internal/repository/transaction_repo.go
2025-03-08 00:35:23 +07:00

77 lines
2.3 KiB
Go

package repository
import (
"enaklo-pos-be/internal/common/mycontext"
"enaklo-pos-be/internal/entity"
"enaklo-pos-be/internal/repository/models"
"github.com/pkg/errors"
"gorm.io/gorm"
)
type TransactionRepo interface {
Create(ctx mycontext.Context, transaction *entity.Transaction) (*entity.Transaction, error)
FindByOrderID(ctx mycontext.Context, orderID int64) ([]*entity.Transaction, error)
}
type transactionRepository struct {
db *gorm.DB
}
func NewTransactionRepository(db *gorm.DB) *transactionRepository {
return &transactionRepository{
db: db,
}
}
func (r *transactionRepository) Create(ctx mycontext.Context, transaction *entity.Transaction) (*entity.Transaction, error) {
transactionDB := r.toTransactionDBModel(transaction)
if err := r.db.Create(&transactionDB).Error; err != nil {
return nil, errors.Wrap(err, "failed to insert transaction")
}
return transaction, nil
}
func (r *transactionRepository) FindByOrderID(ctx mycontext.Context, orderID int64) ([]*entity.Transaction, error) {
var transactionsDB []models.TransactionDB
if err := r.db.Where("order_id = ?", orderID).Find(&transactionsDB).Error; err != nil {
return nil, errors.Wrap(err, "failed to find transactions for order")
}
transactions := make([]*entity.Transaction, 0, len(transactionsDB))
for i := range transactionsDB {
transaction := r.toDomainTransactionModel(&transactionsDB[i])
transactions = append(transactions, transaction)
}
return transactions, nil
}
func (r *transactionRepository) toTransactionDBModel(transaction *entity.Transaction) models.TransactionDB {
return models.TransactionDB{
ID: transaction.ID,
OrderID: transaction.OrderID,
Amount: transaction.Amount,
PaymentMethod: transaction.PaymentMethod,
Status: transaction.Status,
CreatedAt: transaction.CreatedAt,
UpdatedAt: transaction.UpdatedAt,
TransactionType: transaction.TransactionType,
PartnerID: transaction.PartnerID,
}
}
func (r *transactionRepository) toDomainTransactionModel(dbModel *models.TransactionDB) *entity.Transaction {
return &entity.Transaction{
ID: dbModel.ID,
OrderID: dbModel.OrderID,
Amount: dbModel.Amount,
PaymentMethod: dbModel.PaymentMethod,
Status: dbModel.Status,
CreatedAt: dbModel.CreatedAt,
UpdatedAt: dbModel.UpdatedAt,
}
}