183 lines
4.2 KiB
Go
Raw Normal View History

2023-10-08 15:59:42 +07:00
package users
import (
2024-07-30 14:18:18 +07:00
"errors"
2023-10-08 15:59:42 +07:00
"fmt"
"furtuna-be/internal/common/mycontext"
2024-06-03 14:40:50 +07:00
"gorm.io/gorm"
2023-10-08 15:59:42 +07:00
"go.uber.org/zap"
"furtuna-be/internal/common/logger"
"furtuna-be/internal/entity"
"furtuna-be/internal/repository"
)
type UserService struct {
2024-08-28 00:36:26 +07:00
repo repository.User
2023-10-08 15:59:42 +07:00
}
2024-08-28 00:36:26 +07:00
func NewUserService(repo repository.User) *UserService {
2023-10-08 15:59:42 +07:00
return &UserService{
2024-08-28 00:36:26 +07:00
repo: repo,
2023-10-08 15:59:42 +07:00
}
}
func (s *UserService) Create(ctx mycontext.Context, 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.Create(ctx, userDB)
if err != nil {
logger.ContextLogger(ctx).Error("error when create user", zap.Error(err))
return nil, err
}
return userDB.ToUser(), nil
}
2024-06-03 14:40:50 +07:00
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
}
2023-10-08 15:59:42 +07:00
func (s *UserService) GetAll(ctx mycontext.Context, search entity.UserSearch) ([]*entity.User, int, error) {
users, total, err := s.repo.GetAllUsers(ctx, search)
if err != nil {
logger.ContextLogger(ctx).Error("error when get all users", zap.Error(err))
return nil, 0, err
}
return users.ToUserList(), total, nil
}
2024-08-15 11:01:55 +07:00
func (s *UserService) GetAllCustomer(ctx mycontext.Context, search entity.CustomerSearch) ([]*entity.Customer, int, error) {
users, total, err := s.repo.GetAllCustomer(ctx, search)
if err != nil {
logger.ContextLogger(ctx).Error("error when get all users", zap.Error(err))
return nil, 0, err
}
return users.ToCustomerList(), total, nil
}
2023-10-08 15:59:42 +07:00
func (s *UserService) GetByID(ctx mycontext.Context, id int64) (*entity.User, error) {
userDB, err := s.repo.GetUserByID(ctx, id)
if err != nil {
logger.ContextLogger(ctx).Error("error when get user by id", zap.Error(err))
return nil, err
}
return userDB.ToUser(), nil
}
func (s *UserService) Update(ctx mycontext.Context, id int64, userReq *entity.User) (*entity.User, error) {
existingUser, err := s.repo.GetUserByID(ctx, id)
if err != nil {
return nil, err
}
2024-07-30 14:18:18 +07:00
if existingUser == nil {
return nil, errors.New("user not found")
}
2024-08-30 01:52:42 +07:00
if !ctx.IsAdmin() && userReq.UserType != "CUSTOMER" {
2024-08-29 23:24:05 +07:00
if *existingUser.PartnerID != *userReq.PartnerID {
return nil, errors.New("user partner cant be changed")
}
2024-08-28 14:28:57 +07:00
}
2023-10-08 15:59:42 +07:00
err = existingUser.ToUpdatedUser(*userReq)
if err != nil {
return nil, err
}
updatedUserDB, err := s.repo.UpdateUser(ctx, existingUser)
if err != nil {
logger.ContextLogger(ctx).Error("error when update user", zap.Error(err))
return nil, err
}
return updatedUserDB.ToUser(), nil
}
2024-07-30 14:18:18 +07:00
func (s *UserService) UpdateWithTx(ctx mycontext.Context, tx *gorm.DB, req *entity.User) (*entity.User, error) {
existingUser, err := s.repo.GetUserByID(ctx, req.ID)
if err != nil {
return nil, err
}
if existingUser == nil {
return nil, errors.New("user not found")
}
if *existingUser.PartnerID != *req.PartnerID {
return nil, errors.New("invalid request")
}
err = existingUser.ToUpdatedUser(*req)
if err != nil {
return nil, err
}
updatedUserDB, err := s.repo.UpdateUserWithTx(ctx, tx, existingUser)
if err != nil {
logger.ContextLogger(ctx).Error("error when update user", zap.Error(err))
return nil, err
}
return updatedUserDB.ToUser(), nil
}
2023-10-08 15:59:42 +07:00
func (s *UserService) Delete(ctx mycontext.Context, id int64) error {
userDB, err := s.repo.GetUserByID(ctx, id)
if err != nil {
logger.ContextLogger(ctx).Error("error when get user by id", zap.Error(err))
return err
}
userDB.SetDeleted(ctx.RequestedBy())
_, err = s.repo.UpdateUser(ctx, userDB)
if err != nil {
logger.ContextLogger(ctx).Error("error when update user", zap.Error(err))
return err
}
return nil
}