package cardmaster import ( "encoding/json" "errors" "cardverse/internal/pkg/utils" ) var ErrCardNotFound = errors.New("kartu tidak ditemukan") type Service interface { GetAllPaginated(query ListCardMasterQuery) ([]CardMaster, int64, error) GetByID(id uint) (*CardMaster, error) GetElements() []ElementResponse Create(req CreateCardMasterRequest) (*CardMaster, error) Update(id uint, req UpdateCardMasterRequest) (*CardMaster, error) Delete(id uint) error } type service struct { repo Repository } func NewService(repo Repository) Service { return &service{ repo: repo, } } func (s *service) GetAllPaginated(query ListCardMasterQuery) ([]CardMaster, int64, error) { page := query.Page if page < 1 { page = 1 } limit := query.Limit if limit < 1 { limit = 20 } return s.repo.FindAllPaginated(page, limit, query) } func (s *service) GetByID(id uint) (*CardMaster, error) { c, err := s.repo.FindByID(id) if err != nil { return nil, ErrCardNotFound } return c, nil } func (s *service) GetElements() []ElementResponse { return GetElementsResponse() } func (s *service) Create(req CreateCardMasterRequest) (*CardMaster, error) { elementImage := req.ElementImage if elementImage == "" && req.Element != "" { elementImage = GetElementImage(req.Element) } c := &CardMaster{ IDSet: req.IDSet, Name: req.Name, Number: req.Number, Image: req.Image, Stage: req.Stage, Element: req.Element, ElementImage: elementImage, EvolvesFrom: req.EvolvesFrom, Illustrator: req.Illustrator, Regulation: req.Regulation, Rarity: req.Rarity, IDPriceChartingEng: req.IDPriceChartingEng, LinkPriceChartingEng: req.LinkPriceChartingEng, IDPriceChartingJpn: req.IDPriceChartingJpn, LinkPriceChartingJpn: req.LinkPriceChartingJpn, } if req.HP != nil { req.HP.ElementImage = GetElementImage(req.HP.Element) bytes, err := json.Marshal(req.HP) if err == nil { c.HP = JSONB(bytes) } } if req.Attacks != nil { for i := range req.Attacks { for j := range req.Attacks[i].Cost { req.Attacks[i].Cost[j].Image = GetElementImage(req.Attacks[i].Cost[j].Element) } } bytes, err := json.Marshal(req.Attacks) if err == nil { c.Attacks = JSONB(bytes) } } if req.Abilities != nil { bytes, err := json.Marshal(req.Abilities) if err == nil { c.Abilities = JSONB(bytes) } } if req.Battle != nil { for i := range req.Battle.Weakness { req.Battle.Weakness[i].ElementImage = GetElementImage(req.Battle.Weakness[i].Element) } for i := range req.Battle.Resistance { req.Battle.Resistance[i].ElementImage = GetElementImage(req.Battle.Resistance[i].Element) } for i := range req.Battle.Retreat { req.Battle.Retreat[i].ElementImage = GetElementImage(req.Battle.Retreat[i].Element) } bytes, err := json.Marshal(req.Battle) if err == nil { c.Battle = JSONB(bytes) } } if req.EvolutionLine != nil { bytes, err := json.Marshal(req.EvolutionLine) if err == nil { c.EvolutionLine = JSONB(bytes) } } if req.PokedexInfo != nil { bytes, err := json.Marshal(req.PokedexInfo) if err == nil { c.PokedexInfo = JSONB(bytes) } } if req.Effects != nil { bytes, err := json.Marshal(req.Effects) if err == nil { c.Effects = JSONB(bytes) } } if err := s.repo.Create(c); err != nil { return nil, err } return c, nil } func (s *service) Update(id uint, req UpdateCardMasterRequest) (*CardMaster, error) { c, err := s.repo.FindByID(id) if err != nil { return nil, ErrCardNotFound } var oldIDSet uint if req.IDSet > 0 && req.IDSet != c.IDSet { oldIDSet = c.IDSet c.IDSet = req.IDSet } if req.Name != "" { c.Name = req.Name } if req.Number != "" { c.Number = req.Number } if req.Image != "" { if c.Image != "" && c.Image != req.Image { utils.DeleteLocalFile(c.Image) } c.Image = req.Image } if req.Stage != "" { c.Stage = req.Stage } if req.Element != "" { c.Element = req.Element c.ElementImage = GetElementImage(req.Element) } if req.EvolvesFrom != "" { c.EvolvesFrom = req.EvolvesFrom } if req.Illustrator != "" { c.Illustrator = req.Illustrator } if req.Regulation != "" { c.Regulation = req.Regulation } if req.Rarity != "" { c.Rarity = req.Rarity } if req.IDPriceChartingEng != "" { c.IDPriceChartingEng = req.IDPriceChartingEng } if req.LinkPriceChartingEng != "" { c.LinkPriceChartingEng = req.LinkPriceChartingEng } if req.IDPriceChartingJpn != "" { c.IDPriceChartingJpn = req.IDPriceChartingJpn } if req.LinkPriceChartingJpn != "" { c.LinkPriceChartingJpn = req.LinkPriceChartingJpn } if req.HP != nil { req.HP.ElementImage = GetElementImage(req.HP.Element) bytes, err := json.Marshal(req.HP) if err == nil { c.HP = JSONB(bytes) } } if req.Attacks != nil { for i := range req.Attacks { for j := range req.Attacks[i].Cost { req.Attacks[i].Cost[j].Image = GetElementImage(req.Attacks[i].Cost[j].Element) } } bytes, err := json.Marshal(req.Attacks) if err == nil { c.Attacks = JSONB(bytes) } } if req.Abilities != nil { bytes, err := json.Marshal(req.Abilities) if err == nil { c.Abilities = JSONB(bytes) } } if req.Battle != nil { for i := range req.Battle.Weakness { req.Battle.Weakness[i].ElementImage = GetElementImage(req.Battle.Weakness[i].Element) } for i := range req.Battle.Resistance { req.Battle.Resistance[i].ElementImage = GetElementImage(req.Battle.Resistance[i].Element) } for i := range req.Battle.Retreat { req.Battle.Retreat[i].ElementImage = GetElementImage(req.Battle.Retreat[i].Element) } bytes, err := json.Marshal(req.Battle) if err == nil { c.Battle = JSONB(bytes) } } if req.EvolutionLine != nil { bytes, err := json.Marshal(req.EvolutionLine) if err == nil { c.EvolutionLine = JSONB(bytes) } } if req.PokedexInfo != nil { bytes, err := json.Marshal(req.PokedexInfo) if err == nil { c.PokedexInfo = JSONB(bytes) } } if req.Effects != nil { bytes, err := json.Marshal(req.Effects) if err == nil { c.Effects = JSONB(bytes) } } if err := s.repo.Update(c, oldIDSet); err != nil { return nil, err } return c, nil } func (s *service) Delete(id uint) error { c, err := s.repo.FindByID(id) if err != nil { return ErrCardNotFound } idSet := c.IDSet if c.Image != "" { utils.DeleteLocalFile(c.Image) } return s.repo.Delete(id, idSet) }