fix: process insight jobs during backfill

This commit is contained in:
2026-08-21 19:09:39 +08:00
parent 31fc5ebd39
commit ca55c2fb3d
4 changed files with 133 additions and 20 deletions

View File

@@ -10,12 +10,24 @@ import (
)
type Service struct {
repository *Repository
repository repositoryStore
builder Builder
now func() time.Time
}
func NewService(repository *Repository, builder Builder) *Service {
type repositoryStore interface {
DatasetMetadata(context.Context) (string, time.Time, error)
ActiveCatalogVersion(context.Context) (string, error)
MerchantScopes(context.Context) ([]MerchantScope, error)
Create(context.Context, CreateRequest) (Job, bool, error)
Latest(context.Context, int64, string, Module) (Snapshot, error)
GetJob(context.Context, int64, string) (Job, error)
EventsAfter(context.Context, int64, string, int64) ([]Event, error)
Claim(context.Context) (claimedJob, error)
Complete(context.Context, claimedJob, Analysis, string, string) error
}
func NewService(repository repositoryStore, builder Builder) *Service {
return &Service{repository: repository, builder: builder, now: time.Now}
}
@@ -42,11 +54,23 @@ func (s *Service) EnqueueAll(ctx context.Context, reason string) (int, error) {
if err != nil {
return 0, err
}
watermark, dataThrough, err := s.repository.DatasetMetadata(ctx)
if err != nil {
return 0, err
}
catalog, err := s.repository.ActiveCatalogVersion(ctx)
if err != nil {
return 0, err
}
timeContext := BuildTimeContext(s.now(), dataThrough)
modules := []Module{ModuleOverview, ModulePayments, ModuleFees, ModulePeers, ModuleTransactions, ModuleGrowth}
created := 0
for _, scope := range scopes {
for _, module := range modules {
if _, cached, err := s.Enqueue(ctx, scope.MerchantID, scope.TerminalID, module, reason); err != nil {
if err := ctx.Err(); err != nil {
return created, err
}
if _, cached, err := s.enqueuePrepared(ctx, scope.MerchantID, scope.TerminalID, module, reason, false, "", watermark, catalog, timeContext); err != nil {
return created, err
} else if !cached {
created++
@@ -66,6 +90,10 @@ func (s *Service) enqueue(ctx context.Context, merchantID int64, terminalID stri
return Job{}, false, err
}
tc := BuildTimeContext(s.now(), dataThrough)
return s.enqueuePrepared(ctx, merchantID, terminalID, module, reason, manual, key, watermark, catalog, tc)
}
func (s *Service) enqueuePrepared(ctx context.Context, merchantID int64, terminalID string, module Module, reason string, manual bool, key, watermark, catalog string, tc TimeContext) (Job, bool, error) {
fingerprint := hash(fmt.Sprintf("%d|%s|%s|%s|%s|%s|%s|%s", merchantID, terminalID, module, tc.AsOfDate, watermark, catalog, AnalyticsVersion, "1.0.0"))
requestHash := hash(fmt.Sprintf("%d|%s|%s|%t", merchantID, terminalID, module, manual))
return s.repository.Create(ctx, CreateRequest{MerchantID: merchantID, TerminalID: terminalID, Module: module, TriggerReason: reason, ManualRefresh: manual, IdempotencyKey: key, RequestHash: requestHash, Fingerprint: fingerprint, Time: tc, Confidence: confidenceFor(tc.Freshness), CatalogVersion: catalog, Evidence: []byte(`{}`)})