package partners import ( "context" "furtuna-be/internal/common/logger" "furtuna-be/internal/entity" "go.uber.org/zap" "gorm.io/gorm" ) type PartnerRepository struct { db *gorm.DB } func NewPartnerRepository(db *gorm.DB) *PartnerRepository { return &PartnerRepository{ db: db, } } func (b *PartnerRepository) Create(ctx context.Context, Partner *entity.PartnerDB) (*entity.PartnerDB, error) { err := b.db.Create(Partner).Error if err != nil { logger.ContextLogger(ctx).Error("error when create Partner", zap.Error(err)) return nil, err } return Partner, nil } func (b *PartnerRepository) CreateWithTx(ctx context.Context, tx *gorm.DB, Partner *entity.PartnerDB) (*entity.PartnerDB, error) { err := tx.Create(Partner).Error if err != nil { logger.ContextLogger(ctx).Error("error when create Partner", zap.Error(err)) return nil, err } return Partner, nil } func (b *PartnerRepository) Update(ctx context.Context, Partner *entity.PartnerDB) (*entity.PartnerDB, error) { if err := b.db.Save(Partner).Error; err != nil { logger.ContextLogger(ctx).Error("error when update Partner", zap.Error(err)) return nil, err } return Partner, nil } func (b *PartnerRepository) UpdateWithTx(ctx context.Context, tx *gorm.DB, Partner *entity.PartnerDB) (*entity.PartnerDB, error) { if err := tx.Save(Partner).Error; err != nil { logger.ContextLogger(ctx).Error("error when update Partner", zap.Error(err)) return nil, err } return Partner, nil } func (b *PartnerRepository) GetByID(ctx context.Context, id int64) (*entity.PartnerDB, error) { Partner := new(entity.PartnerDB) if err := b.db.First(Partner, id).Error; err != nil { logger.ContextLogger(ctx).Error("error when get by id Partner", zap.Error(err)) return nil, err } return Partner, nil } func (b *PartnerRepository) GetAll(ctx context.Context, req entity.PartnerSearch) (entity.PartnerList, int, error) { var partners []*entity.PartnerDBSearch var total int64 query := b.db.Table("partners p"). Select("p.*, w.balance as wallet_balance, u.name as admin_name, u.email as admin_email, u.phone_number as admin_phone_number"). Joins("LEFT JOIN wallets w ON w.partner_id = p.id"). Joins("LEFT JOIN users u ON p.admin_user_id = u.id"). Where("p.deleted_at IS NULL") if req.Search != "" { query = query.Where("p.name ILIKE ?", "%"+req.Search+"%") } if req.Name != "" { query = query.Where("p.name ILIKE ?", "%"+req.Name+"%") } if req.Limit > 0 { query = query.Limit(req.Limit) } if req.Offset > 0 { query = query.Offset(req.Offset) } // Find partners with joined wallet balances if err := query.Find(&partners).Error; err != nil { logger.ContextLogger(ctx).Error("error when getting all partners", zap.Error(err)) return nil, 0, err } // Counting total records if err := b.db.Table("partners p"). Joins("LEFT JOIN wallets w ON w.partner_id = p.id"). Where("p.deleted_at IS NULL"). Count(&total).Error; err != nil { logger.ContextLogger(ctx).Error("error when counting partners", zap.Error(err)) return nil, 0, err } partnersSearchResult := entity.PartnerList{} for _, partner := range partners { partner.Balance = partner.WalletBalance partner.Partner.AdminName = partner.AdminName partner.Partner.AdminPhoneNumber = partner.AdminPhoneNumber partner.Partner.AdminEmail = partner.AdminEmail partnersSearchResult = append(partnersSearchResult, &entity.PartnerDB{partner.Partner}) } return partnersSearchResult, int(total), nil } func (b *PartnerRepository) Delete(ctx context.Context, id int64) error { Partner := new(entity.PartnerDB) Partner.ID = id if err := b.db.Delete(Partner).Error; err != nil { return err } return nil }