merch-api/internal/merch/service_merch.go
2026-03-25 23:01:47 +03:00

168 lines
3.7 KiB
Go

package merch
import (
"context"
"github.com/google/uuid"
)
func (s *service) createMerch(ctx context.Context, userId int64, payload *newMerchDTO) error {
now := s.utils.TimeNowUTC()
nullNow := s.utils.NullTimeFromNow(now)
empty := s.utils.DeletedNullTime()
merchUuid, err := uuid.NewV7()
if err != nil {
logErr(serviceLogHeader, err)
return err
}
newMerch := &Merch{
CreatedAt: now,
UpdatedAt: nullNow,
DeletedAt: empty,
MerchUuid: merchUuid.String(),
UserId: userId,
Name: payload.Name,
}
var merchExtra []ExtraData
if payload.Links != nil {
originsMap, _, err := s.getOriginsMaps(ctx)
if err != nil {
logErr(serviceLogHeader, err)
return err
}
for _, item := range payload.Links {
merchExtra = append(merchExtra, ExtraData{
CreatedAt: now,
UpdatedAt: nullNow,
DeletedAt: empty,
MerchId: 0,
OriginId: originsMap[item.Origin],
URL: item.Link,
})
}
}
return s.repo.createMerch(ctx, newMerch, merchExtra)
}
func (s *service) getSingleMerch(ctx context.Context, userId int64, merchUuid string) (*singleMerchResponse, error) {
merch, err := s.repo.getSingleMerch(ctx, userId, merchUuid)
if err != nil {
logErr(serviceLogHeader, err)
return nil, err
}
if merch == nil {
return nil, nil
}
links, err := s.repo.getSingleMerchExtraData(ctx, merch.Id)
if err != nil {
logErr(serviceLogHeader, err)
return nil, err
}
return &singleMerchResponse{
MerchUuid: merchUuid,
Name: merch.Name,
Origins: links,
}, nil
}
func (s *service) getMany(ctx context.Context, userId int64) ([]listResponse, error) {
allUserMerch, err := s.repo.getMany(ctx, userId)
if err != nil {
return nil, err
}
if len(allUserMerch) == 0 || allUserMerch == nil {
logWarn(serviceLogHeader, "User has no merch records")
return nil, nil
}
ids := make([]int64, 0, len(allUserMerch))
for _, m := range allUserMerch {
ids = append(ids, m.Id)
}
cardLabels, err := s.repo.getManyAttachedLabelsByList(ctx, userId, ids)
if err != nil {
return nil, err
}
var response []listResponse
for _, m := range allUserMerch {
response = append(response, listResponse{
MerchUuid: m.MerchUuid,
Name: m.Name,
Labels: cardLabels[m.Id],
})
}
return response, nil
}
func (s *service) updateMerch(ctx context.Context, userId int64, payload *updateMerchDTO) (*merchDTO, error) {
return s.repo.updateMerch(ctx, userId, payload)
}
func (s *service) updateExtraData(ctx context.Context, userId int64, payload *extraDataDTO) (*extraDataDTO, error) {
merchId, err := s.repo.getMerchIdByUuid(ctx, userId, payload.MerchUuid)
if err != nil {
logErr(serviceLogHeader, err)
return nil, err
}
origins, ids, err := s.getOriginsMaps(ctx)
if err != nil {
logErr(serviceLogHeader, err)
return nil, err
}
var insertData []ExtraData
for _, item := range payload.Links {
if _, ok := origins[item.Origin]; !ok {
continue
}
now := s.utils.TimeNowUTC()
insertData = append(insertData, ExtraData{
CreatedAt: now,
UpdatedAt: s.utils.NullTimeFromNow(now),
OriginId: origins[item.Origin],
URL: item.Link,
})
}
result, err := s.repo.updateExtraData(ctx, merchId, insertData)
if err != nil {
logErr(serviceLogHeader, err)
return nil, err
}
if result == nil || len(result) == 0 {
return nil, nil
}
var ol []originLink
for _, item := range result {
ol = append(ol, originLink{
Origin: ids[item.OriginId],
Link: item.URL,
})
}
return &extraDataDTO{
MerchUuid: payload.MerchUuid,
Links: ol,
}, nil
}
func (s *service) deleteOneMerchRecord(ctx context.Context, userId int64, merchUuid string) error {
return s.repo.deleteOneMerchRecord(ctx, userId, merchUuid, s.utils.TimeNowUTC())
}