package app import ( "context" "fmt" "gitea.dwysokinski.me/twhelp/corev3/internal/domain" ) type TribeSnapshotRepository interface { // Create persists tribe snapshots in a store (e.g. Postgres). // Duplicates are ignored. Create(ctx context.Context, params ...domain.CreateTribeSnapshotParams) error } type TribeSnapshotService struct { repo TribeSnapshotRepository tribeSvc *TribeService pub SnapshotPublisher } func NewTribeSnapshotService( repo TribeSnapshotRepository, tribeSvc *TribeService, pub SnapshotPublisher, ) *TribeSnapshotService { return &TribeSnapshotService{repo: repo, tribeSvc: tribeSvc, pub: pub} } //nolint:gocyclo func (svc *TribeSnapshotService) Create( ctx context.Context, createSnapshotsCmdPayload domain.CreateSnapshotsCmdPayload, ) error { serverKey := createSnapshotsCmdPayload.ServerKey() date := createSnapshotsCmdPayload.Date() listTribesParams := domain.NewListTribesParams() if err := listTribesParams.SetServerKeys([]string{serverKey}); err != nil { return fmt.Errorf("%s: %w", serverKey, err) } if err := listTribesParams.SetDeleted(domain.NullBool{ Value: false, Valid: true, }); err != nil { return fmt.Errorf("%s: %w", serverKey, err) } if err := listTribesParams.SetSort([]domain.TribeSort{domain.TribeSortIDASC}); err != nil { return fmt.Errorf("%s: %w", serverKey, err) } if err := listTribesParams.SetLimit(domain.TribeListMaxLimit); err != nil { return fmt.Errorf("%s: %w", serverKey, err) } for { tribes, err := svc.tribeSvc.List(ctx, listTribesParams) if err != nil { return fmt.Errorf("%s: %w", serverKey, err) } if len(tribes) == 0 { break } params, err := domain.NewCreateTribeSnapshotParams(tribes, date) if err != nil { return fmt.Errorf("%s: %w", serverKey, err) } if err = svc.repo.Create(ctx, params...); err != nil { return fmt.Errorf("%s: %w", serverKey, err) } if err = listTribesParams.SetIDGT(domain.NullInt{ Value: tribes[len(tribes)-1].ID(), Valid: true, }); err != nil { return fmt.Errorf("%s: %w", serverKey, err) } } payload, err := domain.NewSnapshotsCreatedEventPayload(serverKey, createSnapshotsCmdPayload.VersionCode()) if err != nil { return fmt.Errorf("%s: couldn't construct domain.SnapshotsCreatedEventPayload: %w", serverKey, err) } if err = svc.pub.EventCreated(ctx, payload); err != nil { return fmt.Errorf("%s: %w", serverKey, err) } return nil }