Files
cardverse-be/internal/modules/seriessetmaster/service.go

207 lines
4.7 KiB
Go
Raw Normal View History

2026-07-30 09:51:25 +07:00
package seriessetmaster
import (
"errors"
"cardverse/internal/pkg/utils"
)
var ErrSeriesSetNotFound = errors.New("data series atau set tidak ditemukan")
type Service interface {
GetAllSeries(query ListSeriesQuery) ([]SeriesSetMaster, error)
GetAllSets(query ListSetQuery) ([]SeriesSetMaster, error)
GetByID(id uint) (*SeriesSetMaster, error)
GetSetByCode(code string) (*SeriesSetMaster, error)
CreateSeries(req CreateSeriesRequest) (*SeriesSetMaster, error)
CreateSet(req CreateSetRequest) (*SeriesSetMaster, error)
UpdateSeries(id uint, req UpdateSeriesRequest) (*SeriesSetMaster, error)
UpdateSet(id uint, req UpdateSetRequest) (*SeriesSetMaster, error)
Delete(id uint) error
}
type service struct {
repo Repository
}
func NewService(repo Repository) Service {
return &service{repo: repo}
}
func (s *service) GetAllSeries(query ListSeriesQuery) ([]SeriesSetMaster, error) {
return s.repo.FindAllSeries(query.Search)
}
func (s *service) GetAllSets(query ListSetQuery) ([]SeriesSetMaster, error) {
return s.repo.FindAllSets(query.Search, query.ParentID)
}
func (s *service) GetByID(id uint) (*SeriesSetMaster, error) {
m, err := s.repo.FindByID(id)
if err != nil {
return nil, ErrSeriesSetNotFound
}
return m, nil
}
func (s *service) GetSetByCode(code string) (*SeriesSetMaster, error) {
m, err := s.repo.FindBySetCode(code)
if err != nil {
return nil, ErrSeriesSetNotFound
}
return m, nil
}
func (s *service) CreateSeries(req CreateSeriesRequest) (*SeriesSetMaster, error) {
m := &SeriesSetMaster{
SeriesName: req.Name,
Image: req.Image,
ParentID: nil,
}
if err := s.repo.Create(m); err != nil {
return nil, err
}
return m, nil
}
func (s *service) CreateSet(req CreateSetRequest) (*SeriesSetMaster, error) {
parent, err := s.repo.FindByID(req.ParentID)
if err != nil || parent == nil || parent.ParentID != nil {
return nil, errors.New("parent_id tidak ditemukan atau bukan merupakan series")
}
m := &SeriesSetMaster{
ParentID: &req.ParentID,
SetCode: req.SetCode,
SetName: req.SetName,
SeriesName: parent.SeriesName,
Image: req.Image,
Logo: req.Logo,
ReleaseDate: req.ReleaseDate,
}
if err := s.repo.CreateSet(m); err != nil {
return nil, err
}
return m, nil
}
func (s *service) UpdateSeries(id uint, req UpdateSeriesRequest) (*SeriesSetMaster, error) {
m, err := s.repo.FindByID(id)
if err != nil {
return nil, ErrSeriesSetNotFound
}
if m.ParentID != nil {
return nil, errors.New("record ini adalah set, bukan series")
}
if req.Name != "" {
m.SeriesName = req.Name
}
if req.Image != "" {
if m.Image != "" && m.Image != req.Image {
utils.DeleteLocalFile(m.Image)
}
m.Image = req.Image
}
if err := s.repo.Update(m); err != nil {
return nil, err
}
return m, nil
}
func (s *service) UpdateSet(id uint, req UpdateSetRequest) (*SeriesSetMaster, error) {
m, err := s.repo.FindByID(id)
if err != nil {
return nil, ErrSeriesSetNotFound
}
if m.ParentID == nil {
return nil, errors.New("record ini adalah series, bukan set")
}
var oldParentID *uint
if req.ParentID != nil && (m.ParentID == nil || *req.ParentID != *m.ParentID) {
oldParentID = m.ParentID
parent, err := s.repo.FindByID(*req.ParentID)
if err != nil || parent == nil || parent.ParentID != nil {
return nil, errors.New("parent_id tidak ditemukan atau bukan merupakan series")
}
m.ParentID = req.ParentID
m.SeriesName = parent.SeriesName
}
if req.SetCode != "" {
m.SetCode = req.SetCode
}
if req.SetName != "" {
m.SetName = req.SetName
}
if req.Image != "" {
if m.Image != "" && m.Image != req.Image {
utils.DeleteLocalFile(m.Image)
}
m.Image = req.Image
}
if req.Logo != "" {
if m.Logo != "" && m.Logo != req.Logo {
utils.DeleteLocalFile(m.Logo)
}
m.Logo = req.Logo
}
if req.ReleaseDate != nil {
m.ReleaseDate = req.ReleaseDate
}
if err := s.repo.UpdateSet(m, oldParentID); err != nil {
return nil, err
}
return m, nil
}
func (s *service) Delete(id uint) error {
m, err := s.repo.FindByID(id)
if err != nil {
return ErrSeriesSetNotFound
}
if m.ParentID == nil {
childSets, _ := s.repo.FindAllSets("", m.ID)
for _, set := range childSets {
cardImages, _ := s.repo.FindCardImagesBySetID(set.ID)
for _, imgPath := range cardImages {
utils.DeleteLocalFile(imgPath)
}
if set.Image != "" {
utils.DeleteLocalFile(set.Image)
}
if set.Logo != "" {
utils.DeleteLocalFile(set.Logo)
}
}
if m.Image != "" {
utils.DeleteLocalFile(m.Image)
}
} else {
cardImages, _ := s.repo.FindCardImagesBySetID(m.ID)
for _, imgPath := range cardImages {
utils.DeleteLocalFile(imgPath)
}
if m.Image != "" {
utils.DeleteLocalFile(m.Image)
}
if m.Logo != "" {
utils.DeleteLocalFile(m.Logo)
}
}
return s.repo.DeleteCascade(m)
}