2025-11-15 17:43:23 +00:00
|
|
|
package service
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"errors"
|
2026-01-20 03:34:58 +00:00
|
|
|
approvalHistoriesService "jaecoo-be/app/module/approval_histories/service"
|
2025-11-15 17:43:23 +00:00
|
|
|
"jaecoo-be/app/module/galleries/mapper"
|
|
|
|
|
"jaecoo-be/app/module/galleries/repository"
|
|
|
|
|
"jaecoo-be/app/module/galleries/request"
|
|
|
|
|
"jaecoo-be/app/module/galleries/response"
|
2026-01-20 03:34:58 +00:00
|
|
|
usersRepository "jaecoo-be/app/module/users/repository"
|
2025-11-15 17:43:23 +00:00
|
|
|
"jaecoo-be/config/config"
|
|
|
|
|
"jaecoo-be/utils/paginator"
|
2026-01-20 03:34:58 +00:00
|
|
|
utilSvc "jaecoo-be/utils/service"
|
2025-11-15 17:43:23 +00:00
|
|
|
|
|
|
|
|
"github.com/rs/zerolog"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type galleriesService struct {
|
2026-01-20 03:34:58 +00:00
|
|
|
Repo repository.GalleriesRepository
|
|
|
|
|
Log zerolog.Logger
|
|
|
|
|
Cfg *config.Config
|
|
|
|
|
UsersRepo usersRepository.UsersRepository
|
|
|
|
|
ApprovalHistoriesService approvalHistoriesService.ApprovalHistoriesService
|
2025-11-15 17:43:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type GalleriesService interface {
|
|
|
|
|
GetAll(req request.GalleriesQueryRequest) (galleries []*response.GalleriesResponse, paging paginator.Pagination, err error)
|
|
|
|
|
GetOne(id uint) (gallery *response.GalleriesResponse, err error)
|
|
|
|
|
Create(req request.GalleriesCreateRequest) (gallery *response.GalleriesResponse, err error)
|
|
|
|
|
Update(id uint, req request.GalleriesUpdateRequest) (gallery *response.GalleriesResponse, err error)
|
|
|
|
|
Delete(id uint) (err error)
|
2026-01-20 03:34:58 +00:00
|
|
|
Approve(id uint, authToken string) (gallery *response.GalleriesResponse, err error)
|
2026-01-26 06:57:05 +00:00
|
|
|
Comment(id uint, authToken string, message *string) (banner *response.GalleriesResponse, err error)
|
2026-01-20 03:34:58 +00:00
|
|
|
Reject(id uint, authToken string, message *string) (gallery *response.GalleriesResponse, err error)
|
2025-11-15 17:43:23 +00:00
|
|
|
}
|
|
|
|
|
|
2026-01-20 03:34:58 +00:00
|
|
|
func NewGalleriesService(repo repository.GalleriesRepository, log zerolog.Logger, cfg *config.Config, usersRepo usersRepository.UsersRepository, approvalHistoriesService approvalHistoriesService.ApprovalHistoriesService) GalleriesService {
|
2025-11-15 17:43:23 +00:00
|
|
|
return &galleriesService{
|
2026-01-20 03:34:58 +00:00
|
|
|
Repo: repo,
|
|
|
|
|
Log: log,
|
|
|
|
|
Cfg: cfg,
|
|
|
|
|
UsersRepo: usersRepo,
|
|
|
|
|
ApprovalHistoriesService: approvalHistoriesService,
|
2025-11-15 17:43:23 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (_i *galleriesService) GetAll(req request.GalleriesQueryRequest) (galleries []*response.GalleriesResponse, paging paginator.Pagination, err error) {
|
|
|
|
|
galleriesEntity, paging, err := _i.Repo.GetAll(req)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
host := _i.Cfg.App.Domain
|
|
|
|
|
|
|
|
|
|
for _, gallery := range galleriesEntity {
|
|
|
|
|
galleries = append(galleries, mapper.GalleriesResponseMapper(gallery, host))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (_i *galleriesService) GetOne(id uint) (gallery *response.GalleriesResponse, err error) {
|
|
|
|
|
galleryEntity, err := _i.Repo.FindOne(id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if galleryEntity == nil {
|
|
|
|
|
err = errors.New("gallery not found")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
host := _i.Cfg.App.Domain
|
|
|
|
|
|
|
|
|
|
gallery = mapper.GalleriesResponseMapper(galleryEntity, host)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (_i *galleriesService) Create(req request.GalleriesCreateRequest) (gallery *response.GalleriesResponse, err error) {
|
|
|
|
|
galleryEntity := req.ToEntity()
|
|
|
|
|
isActive := true
|
|
|
|
|
galleryEntity.IsActive = &isActive
|
|
|
|
|
|
|
|
|
|
galleryEntity, err = _i.Repo.Create(galleryEntity)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
host := _i.Cfg.App.Domain
|
|
|
|
|
|
|
|
|
|
gallery = mapper.GalleriesResponseMapper(galleryEntity, host)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (_i *galleriesService) Update(id uint, req request.GalleriesUpdateRequest) (gallery *response.GalleriesResponse, err error) {
|
|
|
|
|
galleryEntity := req.ToEntity()
|
|
|
|
|
|
|
|
|
|
err = _i.Repo.Update(id, galleryEntity)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
galleryEntity, err = _i.Repo.FindOne(id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
host := _i.Cfg.App.Domain
|
|
|
|
|
|
|
|
|
|
gallery = mapper.GalleriesResponseMapper(galleryEntity, host)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (_i *galleriesService) Delete(id uint) (err error) {
|
|
|
|
|
err = _i.Repo.Delete(id)
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-01-20 01:08:14 +00:00
|
|
|
|
2026-01-20 03:34:58 +00:00
|
|
|
func (_i *galleriesService) Approve(id uint, authToken string) (gallery *response.GalleriesResponse, err error) {
|
|
|
|
|
// Get user from token
|
|
|
|
|
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
|
|
|
|
if user == nil {
|
|
|
|
|
err = errors.New("unauthorized: user not found")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-20 01:08:14 +00:00
|
|
|
// Check if user has admin role (roleId = 1)
|
2026-01-20 03:34:58 +00:00
|
|
|
if user.UserRoleId != 1 {
|
2026-01-20 01:08:14 +00:00
|
|
|
err = errors.New("unauthorized: only admin can approve")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Approve gallery (update status_id to 2)
|
|
|
|
|
err = _i.Repo.Approve(id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-20 03:34:58 +00:00
|
|
|
// Save approval history
|
|
|
|
|
userID := user.ID
|
2026-01-25 16:50:49 +00:00
|
|
|
statusApprove := 2
|
|
|
|
|
|
|
|
|
|
err = _i.ApprovalHistoriesService.CreateHistory(
|
|
|
|
|
"banners",
|
|
|
|
|
id,
|
|
|
|
|
&statusApprove, // ✅ pointer
|
|
|
|
|
"approve",
|
|
|
|
|
&userID,
|
|
|
|
|
nil,
|
|
|
|
|
)
|
2026-01-20 03:34:58 +00:00
|
|
|
if err != nil {
|
|
|
|
|
_i.Log.Error().Err(err).Msg("Failed to save approval history")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Get updated gallery data
|
|
|
|
|
galleryEntity, err := _i.Repo.FindOne(id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if galleryEntity == nil {
|
|
|
|
|
err = errors.New("gallery not found")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
host := _i.Cfg.App.Domain
|
|
|
|
|
gallery = mapper.GalleriesResponseMapper(galleryEntity, host)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (_i *galleriesService) Reject(id uint, authToken string, message *string) (gallery *response.GalleriesResponse, err error) {
|
|
|
|
|
// Get user from token
|
|
|
|
|
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
|
|
|
|
if user == nil {
|
|
|
|
|
err = errors.New("unauthorized: user not found")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Check if user has admin role (roleId = 1)
|
|
|
|
|
if user.UserRoleId != 1 {
|
|
|
|
|
err = errors.New("unauthorized: only admin can reject")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Reject gallery (update status_id to 3)
|
|
|
|
|
err = _i.Repo.Reject(id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Save rejection history
|
|
|
|
|
userID := user.ID
|
2026-01-25 16:50:49 +00:00
|
|
|
statusReject := 3
|
|
|
|
|
|
|
|
|
|
err = _i.ApprovalHistoriesService.CreateHistory(
|
|
|
|
|
"banners",
|
|
|
|
|
id,
|
|
|
|
|
&statusReject, // ✅ pointer
|
|
|
|
|
"reject",
|
|
|
|
|
&userID,
|
|
|
|
|
message,
|
|
|
|
|
)
|
2026-01-20 03:34:58 +00:00
|
|
|
if err != nil {
|
|
|
|
|
_i.Log.Error().Err(err).Msg("Failed to save rejection history")
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-20 01:08:14 +00:00
|
|
|
// Get updated gallery data
|
|
|
|
|
galleryEntity, err := _i.Repo.FindOne(id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if galleryEntity == nil {
|
|
|
|
|
err = errors.New("gallery not found")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
host := _i.Cfg.App.Domain
|
|
|
|
|
gallery = mapper.GalleriesResponseMapper(galleryEntity, host)
|
|
|
|
|
return
|
|
|
|
|
}
|
2026-01-26 06:57:05 +00:00
|
|
|
|
|
|
|
|
func (_i *galleriesService) Comment(
|
|
|
|
|
id uint,
|
|
|
|
|
authToken string,
|
|
|
|
|
message *string,
|
|
|
|
|
) (galleries *response.GalleriesResponse, err error) {
|
|
|
|
|
|
|
|
|
|
user := utilSvc.GetUserInfo(_i.Log, _i.UsersRepo, authToken)
|
|
|
|
|
if user == nil {
|
|
|
|
|
err = errors.New("unauthorized")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if user.UserRoleId != 1 {
|
|
|
|
|
err = errors.New("only admin can comment")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SIMPAN COMMENT KE HISTORY (INTI FITURNYA)
|
|
|
|
|
userID := user.ID
|
|
|
|
|
err = _i.ApprovalHistoriesService.CreateHistory(
|
|
|
|
|
"galleries",
|
|
|
|
|
id,
|
|
|
|
|
nil, // status_id NULL
|
|
|
|
|
"comment",
|
|
|
|
|
&userID,
|
|
|
|
|
message,
|
|
|
|
|
)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Ambil terbaru
|
|
|
|
|
galleriesEntity, err := _i.Repo.FindOne(id)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if galleriesEntity == nil {
|
|
|
|
|
err = errors.New("galleries not found")
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
host := _i.Cfg.App.Domain
|
|
|
|
|
galleries = mapper.GalleriesResponseMapper(galleriesEntity, host)
|
|
|
|
|
return
|
|
|
|
|
}
|