95 lines
2.6 KiB
Go
95 lines
2.6 KiB
Go
package repository
|
|
|
|
import (
|
|
"context"
|
|
"furtuna-be/internal/common/logger"
|
|
"furtuna-be/internal/entity"
|
|
"go.uber.org/zap"
|
|
"gorm.io/gorm"
|
|
"gorm.io/gorm/clause"
|
|
)
|
|
|
|
type WalletRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewWalletRepository(db *gorm.DB) *WalletRepository {
|
|
return &WalletRepository{
|
|
db: db,
|
|
}
|
|
}
|
|
|
|
func (r *WalletRepository) Create(ctx context.Context, tx *gorm.DB, wallet *entity.Wallet) (*entity.Wallet, error) {
|
|
err := tx.Create(wallet).Error
|
|
if err != nil {
|
|
logger.ContextLogger(ctx).Error("error when creating wallet", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
return wallet, nil
|
|
}
|
|
|
|
func (r *WalletRepository) Update(ctx context.Context, db *gorm.DB, wallet *entity.Wallet) (*entity.Wallet, error) {
|
|
if err := db.Save(wallet).Error; err != nil {
|
|
logger.ContextLogger(ctx).Error("error when updating wallet", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
return wallet, nil
|
|
}
|
|
|
|
func (r *WalletRepository) GetByPartnerID(ctx context.Context, db *gorm.DB, partnerID int64) (*entity.Wallet, error) {
|
|
if db == nil {
|
|
db = r.db
|
|
}
|
|
|
|
wallet := new(entity.Wallet)
|
|
if err := db.WithContext(ctx).Where("partner_id = ?", partnerID).First(wallet).Error; err != nil {
|
|
logger.ContextLogger(ctx).Error("error when finding wallet by partner ID", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
return wallet, nil
|
|
}
|
|
|
|
func (r *WalletRepository) GetByID(ctx context.Context, id int64) (*entity.Wallet, error) {
|
|
wallet := new(entity.Wallet)
|
|
if err := r.db.First(wallet, id).Error; err != nil {
|
|
logger.ContextLogger(ctx).Error("error when getting wallet by id", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
return wallet, nil
|
|
}
|
|
|
|
func (r *WalletRepository) GetForUpdate(ctx context.Context, tx *gorm.DB, partnerID int64) (*entity.Wallet, error) {
|
|
if tx == nil {
|
|
tx = r.db
|
|
}
|
|
|
|
query := tx.WithContext(ctx).Where("partner_id = ?", partnerID).
|
|
Clauses(clause.Locking{Strength: "UPDATE"})
|
|
|
|
wallet := new(entity.Wallet)
|
|
if err := query.First(wallet).Error; err != nil {
|
|
logger.ContextLogger(ctx).Error("error when finding balance by partner ID", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
return wallet, nil
|
|
}
|
|
|
|
func (r *WalletRepository) GetAll(ctx context.Context) ([]*entity.Wallet, error) {
|
|
var wallets []*entity.Wallet
|
|
if err := r.db.Find(&wallets).Error; err != nil {
|
|
logger.ContextLogger(ctx).Error("error when getting all wallets", zap.Error(err))
|
|
return nil, err
|
|
}
|
|
return wallets, nil
|
|
}
|
|
|
|
func (r *WalletRepository) Delete(ctx context.Context, id int64) error {
|
|
wallet := new(entity.Wallet)
|
|
wallet.ID = id
|
|
if err := r.db.Delete(wallet).Error; err != nil {
|
|
logger.ContextLogger(ctx).Error("error when deleting wallet", zap.Error(err))
|
|
return err
|
|
}
|
|
return nil
|
|
}
|