292 lines
6.4 KiB
Go
292 lines
6.4 KiB
Go
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)
|
|
}
|