139 lines
4.0 KiB
Go
139 lines
4.0 KiB
Go
package service
|
|
|
|
import (
|
|
"errors"
|
|
"narasi-ahli-be/app/database/entity"
|
|
"narasi-ahli-be/app/module/ebooks/mapper"
|
|
"narasi-ahli-be/app/module/ebooks/repository"
|
|
"narasi-ahli-be/app/module/ebooks/response"
|
|
usersRepository "narasi-ahli-be/app/module/users/repository"
|
|
"narasi-ahli-be/utils/paginator"
|
|
utilSvc "narasi-ahli-be/utils/service"
|
|
|
|
"github.com/rs/zerolog"
|
|
)
|
|
|
|
// EbookWishlistsService
|
|
type ebookWishlistsService struct {
|
|
Repo repository.EbookWishlistsRepository
|
|
EbooksRepo repository.EbooksRepository
|
|
Log zerolog.Logger
|
|
UsersRepo usersRepository.UsersRepository
|
|
}
|
|
|
|
// EbookWishlistsService define interface of IEbookWishlistsService
|
|
type EbookWishlistsService interface {
|
|
GetByUserId(authToken string, pagination *paginator.Pagination) (wishlists []*response.EbookWishlistResponse, paging paginator.Pagination, err error)
|
|
AddToWishlist(authToken string, ebookId uint) (err error)
|
|
RemoveFromWishlist(authToken string, ebookId uint) (err error)
|
|
IsInWishlist(authToken string, ebookId uint) (isInWishlist bool, err error)
|
|
}
|
|
|
|
// NewEbookWishlistsService init EbookWishlistsService
|
|
func NewEbookWishlistsService(
|
|
repo repository.EbookWishlistsRepository,
|
|
ebooksRepo repository.EbooksRepository,
|
|
log zerolog.Logger,
|
|
usersRepo usersRepository.UsersRepository) EbookWishlistsService {
|
|
|
|
return &ebookWishlistsService{
|
|
Repo: repo,
|
|
EbooksRepo: ebooksRepo,
|
|
Log: log,
|
|
UsersRepo: usersRepo,
|
|
}
|
|
}
|
|
|
|
// GetByUserId implement interface of EbookWishlistsService
|
|
func (_i *ebookWishlistsService) GetByUserId(authToken string, pagination *paginator.Pagination) (wishlists []*response.EbookWishlistResponse, paging paginator.Pagination, err error) {
|
|
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
|
if user == nil {
|
|
return nil, paginator.Pagination{}, errors.New("user not found")
|
|
}
|
|
|
|
wishlistsData, paging, err := _i.Repo.GetByUserId(user.ID, pagination)
|
|
if err != nil {
|
|
return nil, paging, err
|
|
}
|
|
|
|
wishlists = mapper.ToEbookWishlistResponseList(wishlistsData)
|
|
|
|
return wishlists, paging, nil
|
|
}
|
|
|
|
// AddToWishlist implement interface of EbookWishlistsService
|
|
func (_i *ebookWishlistsService) AddToWishlist(authToken string, ebookId uint) (err error) {
|
|
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
|
if user == nil {
|
|
return errors.New("user not found")
|
|
}
|
|
|
|
// Check if ebook exists
|
|
_, err = _i.EbooksRepo.FindOne(ebookId)
|
|
if err != nil {
|
|
return errors.New("ebook not found")
|
|
}
|
|
|
|
// Check if already in wishlist
|
|
existingWishlist, err := _i.Repo.FindByUserAndEbook(user.ID, ebookId)
|
|
if err == nil && existingWishlist != nil {
|
|
return errors.New("ebook already in wishlist")
|
|
}
|
|
|
|
// Add to wishlist
|
|
wishlist := &entity.EbookWishlists{
|
|
UserId: user.ID,
|
|
EbookId: ebookId,
|
|
}
|
|
|
|
_, err = _i.Repo.Create(wishlist)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Update wishlist count
|
|
err = _i.EbooksRepo.UpdateWishlistCount(ebookId)
|
|
if err != nil {
|
|
_i.Log.Error().Err(err).Msg("Failed to update wishlist count")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// RemoveFromWishlist implement interface of EbookWishlistsService
|
|
func (_i *ebookWishlistsService) RemoveFromWishlist(authToken string, ebookId uint) (err error) {
|
|
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
|
if user == nil {
|
|
return errors.New("user not found")
|
|
}
|
|
|
|
// Check if in wishlist
|
|
existingWishlist, err := _i.Repo.FindByUserAndEbook(user.ID, ebookId)
|
|
if err != nil || existingWishlist == nil {
|
|
return errors.New("ebook not in wishlist")
|
|
}
|
|
|
|
// Remove from wishlist
|
|
err = _i.Repo.Delete(existingWishlist.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// IsInWishlist implement interface of EbookWishlistsService
|
|
func (_i *ebookWishlistsService) IsInWishlist(authToken string, ebookId uint) (isInWishlist bool, err error) {
|
|
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
|
if user == nil {
|
|
return false, errors.New("user not found")
|
|
}
|
|
|
|
existingWishlist, err := _i.Repo.FindByUserAndEbook(user.ID, ebookId)
|
|
if err != nil {
|
|
return false, nil // Not in wishlist
|
|
}
|
|
|
|
return existingWishlist != nil, nil
|
|
}
|