first commit

This commit is contained in:
2026-07-30 09:51:25 +07:00
commit e3aca176b7
82 changed files with 7847 additions and 0 deletions

View File

@@ -0,0 +1,291 @@
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)
}