2026-02-23 20:02:17 +03:00
|
|
|
package merch
|
|
|
|
|
|
2026-03-01 22:13:39 +03:00
|
|
|
import (
|
2026-03-04 17:02:11 +03:00
|
|
|
"context"
|
|
|
|
|
"merch-api/internal/user"
|
2026-03-01 22:13:39 +03:00
|
|
|
"merch-api/pkg/utils"
|
2026-03-04 17:02:11 +03:00
|
|
|
|
|
|
|
|
"github.com/google/uuid"
|
2026-03-01 22:13:39 +03:00
|
|
|
)
|
|
|
|
|
|
2026-02-23 20:02:17 +03:00
|
|
|
type service struct {
|
2026-03-04 17:02:11 +03:00
|
|
|
repo Repository
|
|
|
|
|
utils utils.Utils
|
|
|
|
|
userProvider user.Provider
|
2026-02-23 20:02:17 +03:00
|
|
|
}
|
|
|
|
|
|
2026-03-04 17:02:11 +03:00
|
|
|
func newService(repo Repository, u utils.Utils, up user.Provider) *service {
|
2026-02-23 20:02:17 +03:00
|
|
|
return &service{
|
2026-03-04 17:02:11 +03:00
|
|
|
repo: repo,
|
|
|
|
|
utils: u,
|
|
|
|
|
userProvider: up,
|
2026-03-01 22:13:39 +03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-04 17:02:11 +03:00
|
|
|
//origins
|
|
|
|
|
|
|
|
|
|
func (s *service) createOrigin(ctx context.Context, o *newOriginDTO) error {
|
2026-03-01 22:13:39 +03:00
|
|
|
newOrigin := &Origin{
|
|
|
|
|
CreatedAt: s.utils.TimeNowUTC(),
|
|
|
|
|
DeletedAt: s.utils.DeletedNullTime(),
|
|
|
|
|
Name: o.Name,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
logDebugService("create origin success")
|
2026-03-04 17:02:11 +03:00
|
|
|
return s.repo.createOrigin(ctx, newOrigin)
|
2026-03-01 22:13:39 +03:00
|
|
|
}
|
|
|
|
|
|
2026-03-04 17:02:11 +03:00
|
|
|
func (s *service) getOrigins(ctx context.Context) (*originsDTO, error) {
|
|
|
|
|
data, err := s.repo.getOrigins(ctx)
|
2026-03-01 22:13:39 +03:00
|
|
|
if err != nil {
|
|
|
|
|
logErrService(err)
|
|
|
|
|
return nil, err
|
2026-02-23 20:02:17 +03:00
|
|
|
}
|
2026-03-01 22:13:39 +03:00
|
|
|
|
|
|
|
|
var origins []originItem
|
|
|
|
|
for _, item := range data {
|
|
|
|
|
origins = append(origins, originItem{
|
|
|
|
|
Id: item.Id,
|
|
|
|
|
Name: item.Name,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
response := &originsDTO{
|
|
|
|
|
Origins: origins,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
logDebugService("get origins success")
|
|
|
|
|
return response, nil
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-04 17:02:11 +03:00
|
|
|
func (s *service) deleteOrigin(ctx context.Context, origin *deleteOriginDTO) error {
|
2026-03-01 22:13:39 +03:00
|
|
|
logDebugService("delete origin success")
|
2026-03-04 17:02:11 +03:00
|
|
|
return s.repo.deleteOriginByName(ctx, origin.Name, s.utils.NullTimeNowUTC())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// merch
|
|
|
|
|
|
|
|
|
|
func (s *service) createMerch(ctx context.Context, userUuid string, payload *newMerchDTO) error {
|
|
|
|
|
userId, err := s.userProvider.GetUserId(ctx, userUuid)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logErrService(err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
now := s.utils.TimeNowUTC()
|
|
|
|
|
nullNow := s.utils.NullTimeFromNow(now)
|
|
|
|
|
empty := s.utils.DeletedNullTime()
|
|
|
|
|
|
|
|
|
|
merchUuid, err := uuid.NewV7()
|
|
|
|
|
if err != nil {
|
|
|
|
|
logErrService(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.getOriginsMap(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logErrService(err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, item := range payload.Links {
|
|
|
|
|
merchExtra = append(merchExtra, ExtraData{
|
|
|
|
|
CreatedAt: now,
|
|
|
|
|
UpdatedAt: nullNow,
|
|
|
|
|
DeletedAt: empty,
|
|
|
|
|
MerchId: 0,
|
|
|
|
|
OriginId: originsMap[item.Name],
|
|
|
|
|
URL: item.Link,
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return s.repo.createMerch(ctx, newMerch, merchExtra)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *service) getOriginsMap(ctx context.Context) (map[string]int64, error) {
|
|
|
|
|
origins, err := s.repo.getOrigins(ctx)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logErrService(err)
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
originsMap := make(map[string]int64, len(origins))
|
|
|
|
|
for _, origin := range origins {
|
|
|
|
|
originsMap[origin.Name] = origin.Id
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return originsMap, nil
|
2026-02-23 20:02:17 +03:00
|
|
|
}
|
2026-03-04 17:59:46 +03:00
|
|
|
|
|
|
|
|
func (s *service) getMany(ctx context.Context, userUuid string) ([]merchDTO, error) {
|
|
|
|
|
userId, err := s.userProvider.GetUserId(ctx, userUuid)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logErrService(err)
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return s.repo.getMany(ctx, userId)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *service) deleteOneMerchRecord(ctx context.Context, userUuid, merchUuid string) error {
|
|
|
|
|
userId, err := s.userProvider.GetUserId(ctx, userUuid)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logErrService(err)
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return s.repo.deleteOneMerchRecord(ctx, userId, merchUuid, s.utils.TimeNowUTC())
|
|
|
|
|
}
|