api/internal/api/merch/service.go
2025-09-24 20:28:36 +03:00

140 lines
3.1 KiB
Go

package merch
import (
"database/sql"
"errors"
"github.com/google/uuid"
"strconv"
"time"
)
type service struct {
repo repository
}
func newService(repo repository) *service {
return &service{
repo: repo,
}
}
func (s *service) addMerch(payload MerchDTO, userUuid string) error {
merchUuid := uuid.NewString()
bundle := merchBundle{
&Merch{
CreatedAt: time.Time{},
UpdatedAt: sql.NullTime{Valid: false},
DeletedAt: sql.NullTime{Valid: false},
MerchUuid: merchUuid,
UserUuid: userUuid,
Name: payload.Name,
},
&Surugaya{
DeletedAt: sql.NullTime{},
MerchUuid: merchUuid,
Link: payload.OriginSurugaya.Link,
},
&Mandarake{
DeletedAt: sql.NullTime{},
MerchUuid: merchUuid,
Link: payload.OriginMandarake.Link,
},
}
return s.repo.addMerch(bundle)
}
func (s *service) getSingleMerch(userUuid, merchUuid string) (MerchDTO, error) {
bundle, err := s.repo.getSingleMerch(userUuid, merchUuid)
if err != nil {
return MerchDTO{}, err
}
return MerchDTO{
MerchUuid: bundle.Merch.MerchUuid,
Name: bundle.Merch.Name,
OriginSurugaya: SurugayaDTO{
Link: bundle.Surugaya.Link,
},
OriginMandarake: MandarakeDTO{
Link: bundle.Mandarake.Link,
},
}, nil
}
func (s *service) getAllMerch(userUuid string) ([]ListResponse, error) {
return s.repo.getAllMerch(userUuid)
}
func (s *service) updateMerch(payload MerchDTO, userUuid string) error {
if payload.MerchUuid == "" {
return errors.New("no MerchUuid or empty payload")
}
return s.repo.updateMerch(payload, userUuid)
}
func (s *service) deleteMerch(userUuid, merchUuid string) error {
return s.repo.deleteMerch(userUuid, merchUuid)
}
func (s *service) getPrices(userUuid string, days string) ([]PricesResponse, error) {
merchList, err := s.repo.getAllUserMerch(userUuid)
if err != nil {
return nil, err
}
if len(merchList) == 0 {
return nil, errors.New("no merch found")
}
var response []PricesResponse
for _, item := range merchList {
response = append(response, PricesResponse{
MerchUuid: item.MerchUuid,
Name: item.Name,
Origins: []OriginWithPrices{},
})
}
daysInt, err := strconv.Atoi(days)
if err != nil {
daysInt = 7
}
period := time.Now().UTC().Add(-(time.Duration(daysInt) * time.Hour * 24))
pricesList, err := s.repo.getPricesWithDays(userUuid, period)
if err != nil {
return nil, err
}
pricesMap := make(map[string]map[Origin][]PriceEntry)
for _, item := range pricesList {
if _, ok := pricesMap[item.MerchUuid]; !ok {
pricesMap[item.MerchUuid] = make(map[Origin][]PriceEntry)
}
pricesMap[item.MerchUuid][item.Origin] = append(pricesMap[item.MerchUuid][item.Origin], PriceEntry{
CreatedAt: item.CreatedAt,
Value: item.Price,
})
}
for i := range response {
originSurugaya := OriginWithPrices{
Origin: surugaya,
Prices: pricesMap[response[i].MerchUuid][surugaya],
}
response[i].Origins = append(response[i].Origins, originSurugaya)
originMandarake := OriginWithPrices{
Origin: mandarake,
Prices: pricesMap[response[i].MerchUuid][mandarake],
}
response[i].Origins = append(response[i].Origins, originMandarake)
}
return response, nil
}