Add User Partner and Product
This commit is contained in:
@@ -6,31 +6,68 @@ import (
|
||||
"furtuna-be/internal/common/mycontext"
|
||||
"furtuna-be/internal/entity"
|
||||
"furtuna-be/internal/repository"
|
||||
|
||||
"furtuna-be/internal/services/users"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
type PartnerService struct {
|
||||
repo repository.PartnerRepository
|
||||
repo repository.PartnerRepository
|
||||
trx repository.TransactionManager
|
||||
userSvc *users.UserService
|
||||
walletRepo repository.WalletRepository
|
||||
}
|
||||
|
||||
func NewPartnerService(repo repository.PartnerRepository) *PartnerService {
|
||||
func NewPartnerService(repo repository.PartnerRepository,
|
||||
userSvc *users.UserService, repoManager repository.TransactionManager,
|
||||
walletRepo repository.WalletRepository) *PartnerService {
|
||||
return &PartnerService{
|
||||
repo: repo,
|
||||
repo: repo,
|
||||
userSvc: userSvc,
|
||||
trx: repoManager,
|
||||
walletRepo: walletRepo,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *PartnerService) Create(ctx mycontext.Context, PartnerReq *entity.Partner) (*entity.Partner, error) {
|
||||
PartnerDB := PartnerReq.ToPartnerDB()
|
||||
PartnerDB.CreatedBy = ctx.RequestedBy()
|
||||
func (s *PartnerService) Create(ctx mycontext.Context, partnerReq *entity.CreatePartnerRequest) (*entity.Partner, error) {
|
||||
var err error
|
||||
|
||||
PartnerDB, err := s.repo.Create(ctx, PartnerDB)
|
||||
tx, err := s.trx.Begin(ctx)
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when create Partner", zap.Error(err))
|
||||
logger.ContextLogger(ctx).Error("error when starting transaction", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return PartnerDB.ToPartner(), nil
|
||||
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
|
||||
}
|
||||
|
||||
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))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return partnerDB.ToPartner(), nil
|
||||
}
|
||||
|
||||
func (s *PartnerService) Update(ctx mycontext.Context, id int64, PartnerReq *entity.Partner) (*entity.Partner, error) {
|
||||
|
||||
@@ -8,8 +8,10 @@ import (
|
||||
"furtuna-be/internal/services/oss"
|
||||
"furtuna-be/internal/services/partner"
|
||||
"furtuna-be/internal/services/product"
|
||||
"furtuna-be/internal/services/sites"
|
||||
"furtuna-be/internal/services/studio"
|
||||
"furtuna-be/internal/services/users"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"furtuna-be/config"
|
||||
"furtuna-be/internal/entity"
|
||||
@@ -28,6 +30,7 @@ type ServiceManagerImpl struct {
|
||||
OrderSvc Order
|
||||
OSSSvc OSSService
|
||||
PartnerSvc Partner
|
||||
SiteSvc Site
|
||||
}
|
||||
|
||||
func NewServiceManagerImpl(cfg *config.Config, repo *repository.RepoManagerImpl) *ServiceManagerImpl {
|
||||
@@ -40,7 +43,9 @@ func NewServiceManagerImpl(cfg *config.Config, repo *repository.RepoManagerImpl)
|
||||
ProductSvc: product.NewProductService(repo.Product),
|
||||
OrderSvc: order.NewOrderService(repo.Order, repo.Product, repo.Studio),
|
||||
OSSSvc: oss.NewOSSService(repo.OSS),
|
||||
PartnerSvc: partner.NewPartnerService(repo.Partner),
|
||||
PartnerSvc: partner.NewPartnerService(
|
||||
repo.Partner, users.NewUserService(repo.User, repo.Branch), repo.Trx, repo.Wallet),
|
||||
SiteSvc: site.NewSiteService(repo.Site),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,6 +63,7 @@ type Event interface {
|
||||
|
||||
type User interface {
|
||||
Create(ctx mycontext.Context, userReq *entity.User) (*entity.User, error)
|
||||
CreateWithTx(ctx mycontext.Context, tx *gorm.DB, userReq *entity.User) (*entity.User, error)
|
||||
GetAll(ctx mycontext.Context, search entity.UserSearch) ([]*entity.User, int, error)
|
||||
Update(ctx mycontext.Context, id int64, userReq *entity.User) (*entity.User, error)
|
||||
GetByID(ctx mycontext.Context, id int64) (*entity.User, error)
|
||||
@@ -102,9 +108,17 @@ type OSSService interface {
|
||||
}
|
||||
|
||||
type Partner interface {
|
||||
Create(ctx mycontext.Context, branchReq *entity.Partner) (*entity.Partner, error)
|
||||
Create(ctx mycontext.Context, branchReq *entity.CreatePartnerRequest) (*entity.Partner, error)
|
||||
Update(ctx mycontext.Context, id int64, branchReq *entity.Partner) (*entity.Partner, error)
|
||||
GetByID(ctx context.Context, id int64) (*entity.Partner, error)
|
||||
GetAll(ctx context.Context, search entity.PartnerSearch) ([]*entity.Partner, int, error)
|
||||
Delete(ctx mycontext.Context, id int64) error
|
||||
}
|
||||
|
||||
type Site interface {
|
||||
Create(ctx mycontext.Context, branchReq *entity.Site) (*entity.Site, error)
|
||||
Update(ctx mycontext.Context, id int64, branchReq *entity.Site) (*entity.Site, error)
|
||||
GetByID(ctx context.Context, id int64) (*entity.Site, error)
|
||||
GetAll(ctx context.Context, search entity.SiteSearch) ([]*entity.Site, int, error)
|
||||
Delete(ctx mycontext.Context, id int64) error
|
||||
}
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
package site
|
||||
|
||||
import (
|
||||
"context"
|
||||
"furtuna-be/internal/common/logger"
|
||||
"furtuna-be/internal/common/mycontext"
|
||||
"furtuna-be/internal/entity"
|
||||
"furtuna-be/internal/repository"
|
||||
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
type SiteService struct {
|
||||
repo repository.SiteRepository
|
||||
}
|
||||
|
||||
func NewSiteService(repo repository.SiteRepository) *SiteService {
|
||||
return &SiteService{
|
||||
repo: repo,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *SiteService) Create(ctx mycontext.Context, siteReq *entity.Site) (*entity.Site, error) {
|
||||
siteDB := siteReq
|
||||
siteDB.CreatedBy = ctx.RequestedBy()
|
||||
|
||||
siteDB, err := s.repo.Upsert(ctx, siteDB)
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when creating site", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return siteDB, nil
|
||||
}
|
||||
|
||||
func (s *SiteService) Update(ctx mycontext.Context, id int64, siteReq *entity.Site) (*entity.Site, error) {
|
||||
existingSite, err := s.repo.GetByID(ctx, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
existingSite.ToUpdatedSite(ctx.RequestedBy(), *siteReq)
|
||||
|
||||
updatedSiteDB, err := s.repo.Update(ctx, existingSite.ToSiteDB())
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when updating site", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return updatedSiteDB.ToSite(), nil
|
||||
}
|
||||
|
||||
func (s *SiteService) GetByID(ctx context.Context, id int64) (*entity.Site, error) {
|
||||
siteDB, err := s.repo.GetByID(ctx, id)
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when getting site by ID", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return siteDB.ToSite(), nil
|
||||
}
|
||||
|
||||
func (s *SiteService) GetAll(ctx context.Context, search entity.SiteSearch) ([]*entity.Site, int, error) {
|
||||
sites, total, err := s.repo.GetAll(ctx, search)
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when getting all sites", zap.Error(err))
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
return sites.ToSiteList(), total, nil
|
||||
}
|
||||
|
||||
func (s *SiteService) Delete(ctx mycontext.Context, id int64) error {
|
||||
siteDB, err := s.repo.GetByID(ctx, id)
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when getting site by ID", zap.Error(err))
|
||||
return err
|
||||
}
|
||||
|
||||
siteDB.SetDeleted(ctx.RequestedBy())
|
||||
|
||||
_, err = s.repo.Update(ctx, siteDB)
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when updating site", zap.Error(err))
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package users
|
||||
import (
|
||||
"fmt"
|
||||
"furtuna-be/internal/common/mycontext"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"go.uber.org/zap"
|
||||
|
||||
@@ -48,6 +49,31 @@ func (s *UserService) Create(ctx mycontext.Context, userReq *entity.User) (*enti
|
||||
return userDB.ToUser(), nil
|
||||
}
|
||||
|
||||
func (s *UserService) CreateWithTx(ctx mycontext.Context, tx *gorm.DB, userReq *entity.User) (*entity.User, error) {
|
||||
//check
|
||||
userExist, err := s.repo.GetUserByEmail(ctx, userReq.Email)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if userExist != nil {
|
||||
return nil, fmt.Errorf("Email already exist")
|
||||
}
|
||||
|
||||
userDB, err := userReq.ToUserDB(ctx.RequestedBy())
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
userDB, err = s.repo.CreateWithTx(ctx, tx, userDB)
|
||||
if err != nil {
|
||||
logger.ContextLogger(ctx).Error("error when create user", zap.Error(err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return userDB.ToUser(), nil
|
||||
}
|
||||
|
||||
func (s *UserService) GetAll(ctx mycontext.Context, search entity.UserSearch) ([]*entity.User, int, error) {
|
||||
|
||||
users, total, err := s.repo.GetAllUsers(ctx, search)
|
||||
@@ -82,7 +108,7 @@ func (s *UserService) Update(ctx mycontext.Context, id int64, userReq *entity.Us
|
||||
return nil, err
|
||||
}
|
||||
|
||||
existingUser.BranchName = branch.Name
|
||||
existingUser.PartnerName = branch.Name
|
||||
}
|
||||
|
||||
err = existingUser.ToUpdatedUser(*userReq)
|
||||
|
||||
Reference in New Issue
Block a user