144 lines
3.2 KiB
Go
144 lines
3.2 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) 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())
|
|
}
|