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()) }