diff --git a/internal/repository/repository.go b/internal/repository/repository.go index 72d3807..e82293e 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -107,6 +107,7 @@ type User interface { GetAllUsers(ctx context.Context, req entity.UserSearch) (entity.UserList, int, error) GetAllCustomer(ctx context.Context, req entity.CustomerSearch) (entity.CustomerList, int, error) GetUserByID(ctx context.Context, id int64) (*entity.UserDB, error) + GetPartnerAdmin(ctx context.Context, partnerID int64) (*entity.UserDB, error) GetUserByEmail(ctx context.Context, email string) (*entity.UserDB, error) UpdateUser(ctx context.Context, user *entity.UserDB) (*entity.UserDB, error) UpdateUserWithTx(ctx context.Context, tx *gorm.DB, user *entity.UserDB) (*entity.UserDB, error) diff --git a/internal/repository/users/user.go b/internal/repository/users/user.go index f618bc8..186b9d1 100644 --- a/internal/repository/users/user.go +++ b/internal/repository/users/user.go @@ -190,6 +190,27 @@ func (b *UserRepository) GetUserByID(ctx context.Context, id int64) (*entity.Use return user, nil } +func (b *UserRepository) GetPartnerAdmin(ctx context.Context, partnerID int64) (*entity.UserDB, error) { + var user *entity.UserDB + + partnerAdmin := 3 + + query := b.db.Table("users"). + Select("users.id, users.email,users.phone_number,users.nik, users.password , users.name, users.status, users.created_at, users.updated_at, ur.role_id, r.role_name, ur.partner_id, b.name as partner_name"). + Joins("LEFT JOIN user_roles ur ON users.id = ur.user_id"). + Joins("LEFT JOIN roles r ON ur.role_id = r.role_id"). + Joins("LEFT JOIN partners b ON ur.partner_id = b.id"). + Where("ur.partner_id = ?", partnerID). + Where("ur.role_id = ?", partnerAdmin) + + if err := query.Scan(&user).Error; err != nil { + logger.ContextLogger(ctx).Error("error when get user", zap.Error(err)) + return nil, err + } + + return user, nil +} + func (b *UserRepository) GetUserByEmail(ctx context.Context, email string) (*entity.UserDB, error) { var user *entity.UserDB diff --git a/internal/services/partner/partner.go b/internal/services/partner/partner.go index 03daf44..9ee0ae7 100644 --- a/internal/services/partner/partner.go +++ b/internal/services/partner/partner.go @@ -15,16 +15,20 @@ type PartnerService struct { trx repository.TransactionManager userSvc *users.UserService walletRepo repository.WalletRepository + userRepo repository.User } func NewPartnerService(repo repository.PartnerRepository, userSvc *users.UserService, repoManager repository.TransactionManager, - walletRepo repository.WalletRepository) *PartnerService { + walletRepo repository.WalletRepository, + userRepo repository.User, +) *PartnerService { return &PartnerService{ repo: repo, userSvc: userSvc, trx: repoManager, walletRepo: walletRepo, + userRepo: userRepo, } } @@ -106,7 +110,14 @@ func (s *PartnerService) Update(ctx mycontext.Context, req *entity.PartnerUpdate return nil, err } - if req.AdminUserID != 0 { + 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 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)) diff --git a/internal/services/service.go b/internal/services/service.go index 7194a37..29bf9c2 100644 --- a/internal/services/service.go +++ b/internal/services/service.go @@ -53,7 +53,7 @@ func NewServiceManagerImpl(cfg *config.Config, repo *repository.RepoManagerImpl) OrderSvc: order.NewOrderService(repo.Order, repo.Product, repo.Crypto, repo.Midtrans, repo.Payment, repo.Trx, repo.Wallet, &cfg.Order), OSSSvc: oss.NewOSSService(repo.OSS), PartnerSvc: partner.NewPartnerService( - repo.Partner, users.NewUserService(repo.User, repo.Branch), repo.Trx, repo.Wallet), + repo.Partner, users.NewUserService(repo.User, repo.Branch), repo.Trx, repo.Wallet, repo.User), SiteSvc: site.NewSiteService(repo.Site), LicenseSvc: service.NewLicenseService(repo.License), Transaction: transaction.New(repo.Transaction, repo.Wallet, repo.Trx),