168 lines
4.6 KiB
Go
Raw Normal View History

2023-10-08 15:59:42 +07:00
package partner
import (
"context"
"furtuna-be/internal/common/logger"
"furtuna-be/internal/common/mycontext"
"furtuna-be/internal/entity"
"furtuna-be/internal/repository"
2024-06-03 14:40:50 +07:00
"furtuna-be/internal/services/users"
2023-10-08 15:59:42 +07:00
"go.uber.org/zap"
)
type PartnerService struct {
2024-06-03 14:40:50 +07:00
repo repository.PartnerRepository
trx repository.TransactionManager
userSvc *users.UserService
walletRepo repository.WalletRepository
2024-08-21 23:34:54 +07:00
userRepo repository.User
2023-10-08 15:59:42 +07:00
}
2024-06-03 14:40:50 +07:00
func NewPartnerService(repo repository.PartnerRepository,
userSvc *users.UserService, repoManager repository.TransactionManager,
2024-08-21 23:34:54 +07:00
walletRepo repository.WalletRepository,
userRepo repository.User,
) *PartnerService {
2023-10-08 15:59:42 +07:00
return &PartnerService{
2024-06-03 14:40:50 +07:00
repo: repo,
userSvc: userSvc,
trx: repoManager,
walletRepo: walletRepo,
2024-08-21 23:34:54 +07:00
userRepo: userRepo,
2023-10-08 15:59:42 +07:00
}
}
2024-06-03 14:40:50 +07:00
func (s *PartnerService) Create(ctx mycontext.Context, partnerReq *entity.CreatePartnerRequest) (*entity.Partner, error) {
var err error
2023-10-08 15:59:42 +07:00
2024-06-03 14:40:50 +07:00
tx, err := s.trx.Begin(ctx)
2023-10-08 15:59:42 +07:00
if err != nil {
2024-06-03 14:40:50 +07:00
logger.ContextLogger(ctx).Error("error when starting transaction", zap.Error(err))
return nil, err
}
defer func() {
if r := recover(); r != nil {
s.trx.Rollback(tx)
panic(r)
} else if err != nil {
s.trx.Rollback(tx)
} else {
err = s.trx.Commit(tx).Error
}
}()
// Create Partner
partnerDB := partnerReq.ToPartnerDB(ctx.RequestedBy())
if partnerDB, err = s.repo.CreateWithTx(ctx, tx, partnerDB); err != nil {
logger.ContextLogger(ctx).Error("error when creating partner", zap.Error(err))
return nil, err
}
adminUser := partnerReq.ToUserAdmin(partnerDB.ID)
if adminUser, err = s.userSvc.CreateWithTx(ctx, tx, adminUser); err != nil {
logger.ContextLogger(ctx).Error("error when creating admin user", zap.Error(err))
return nil, err
}
2024-07-30 02:48:31 +07:00
partnerDB.AdminUserID = adminUser.ID
if partnerDB, err = s.repo.UpdateWithTx(ctx, tx, partnerDB); err != nil {
logger.ContextLogger(ctx).Error("error when creating partner", zap.Error(err))
return nil, err
}
2024-06-03 14:40:50 +07:00
partnerWallet := partnerReq.ToWallet(partnerDB.ID)
if partnerWallet, err = s.walletRepo.Create(ctx, tx, partnerWallet); err != nil {
logger.ContextLogger(ctx).Error("error when creating wallet", zap.Error(err))
2023-10-08 15:59:42 +07:00
return nil, err
}
2024-06-03 14:40:50 +07:00
return partnerDB.ToPartner(), nil
2023-10-08 15:59:42 +07:00
}
2024-07-30 14:18:18 +07:00
func (s *PartnerService) Update(ctx mycontext.Context, req *entity.PartnerUpdate) (*entity.Partner, error) {
existingPartner, err := s.repo.GetByID(ctx, req.ID)
2023-10-08 15:59:42 +07:00
if err != nil {
return nil, err
}
2024-07-30 14:18:18 +07:00
existingPartner.ToUpdatedPartnerData(ctx.RequestedBy(), *req)
2023-10-08 15:59:42 +07:00
2024-07-30 14:18:18 +07:00
tx, err := s.trx.Begin(ctx)
if err != nil {
logger.ContextLogger(ctx).Error("error when starting transaction", zap.Error(err))
return nil, err
}
2023-10-08 15:59:42 +07:00
2024-07-30 14:18:18 +07:00
defer func() {
if r := recover(); r != nil {
s.trx.Rollback(tx)
panic(r)
} else if err != nil {
s.trx.Rollback(tx)
} else {
err = s.trx.Commit(tx).Error
}
}()
updatedPartnerDB, err := s.repo.UpdateWithTx(ctx, tx, existingPartner.ToPartnerDB())
2023-10-08 15:59:42 +07:00
if err != nil {
logger.ContextLogger(ctx).Error("error when update Partner", zap.Error(err))
return nil, err
}
2024-08-21 23:34:54 +07:00
partnerAdmin, err := s.userRepo.GetPartnerAdmin(ctx, req.ID)
if err != nil {
logger.ContextLogger(ctx).Error("error when get Partner admin", zap.Error(err))
return nil, err
}
if partnerAdmin != nil {
req.AdminUserID = partnerAdmin.ID
2024-07-30 14:18:18 +07:00
adminUser := req.ToUserAdmin(&req.ID)
if adminUser, err = s.userSvc.UpdateWithTx(ctx, tx, adminUser); err != nil {
logger.ContextLogger(ctx).Error("error when creating admin user", zap.Error(err))
return nil, err
}
}
2023-10-08 15:59:42 +07:00
return updatedPartnerDB.ToPartner(), nil
}
func (s *PartnerService) GetByID(ctx context.Context, id int64) (*entity.Partner, error) {
PartnerDB, err := s.repo.GetByID(ctx, id)
if err != nil {
logger.ContextLogger(ctx).Error("error when get Partner by id", zap.Error(err))
return nil, err
}
return PartnerDB.ToPartner(), nil
}
func (s *PartnerService) GetAll(ctx context.Context, search entity.PartnerSearch) ([]*entity.Partner, int, error) {
Partneres, total, err := s.repo.GetAll(ctx, search)
if err != nil {
logger.ContextLogger(ctx).Error("error when get all Partneres", zap.Error(err))
return nil, 0, err
}
return Partneres.ToPartnerList(), total, nil
}
func (s *PartnerService) Delete(ctx mycontext.Context, id int64) error {
PartnerDB, err := s.repo.GetByID(ctx, id)
if err != nil {
logger.ContextLogger(ctx).Error("error when get Partner by id", zap.Error(err))
return err
}
PartnerDB.SetDeleted(ctx.RequestedBy())
_, err = s.repo.Update(ctx, PartnerDB)
if err != nil {
logger.ContextLogger(ctx).Error("error when update Partner", zap.Error(err))
return err
}
return nil
}