From bab4efc6ad245dc03466676c418315cceca9523e Mon Sep 17 00:00:00 2001 From: FragginWagon Date: Wed, 9 Sep 2026 12:45:48 -0400 Subject: [PATCH] feat: poll pricing jobs in worker --- apps/worker/src/worker-runtime.js | 22 ++++++++++++++++++++++ docs/IMPLEMENTATION-STATUS.md | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/apps/worker/src/worker-runtime.js b/apps/worker/src/worker-runtime.js index bc853a4..6dd22ef 100644 --- a/apps/worker/src/worker-runtime.js +++ b/apps/worker/src/worker-runtime.js @@ -8,7 +8,12 @@ import { createLocalImageStorage, resolveProjectImageStorageRoot } from '../../a import { createImageDerivativeProcessor } from '../../api/src/infrastructure/images/image-derivative-processor.js'; import { createSharpImageRenderer } from '../../api/src/infrastructure/images/sharp-image-renderer.js'; import { createImageDerivativeJobRepository } from '../../api/src/modules/inventory/repositories/image-derivative-job-repository.js'; +import { createPricingRepository } from '../../api/src/modules/pricing/repositories/pricing-repository.js'; +import { createPricingRefreshJobRepository } from '../../api/src/modules/pricing/repositories/pricing-refresh-job-repository.js'; +import { createPricingService } from '../../api/src/modules/pricing/services/pricing-service.js'; +import { createPricingProviderRegistry } from '../../api/src/modules/pricing/providers/pricing-provider.js'; import { processNextPersistentImageDerivativeJob } from './image-derivative-worker.js'; +import { processNextPersistentPricingRefreshJob, runPricingRefreshJob } from './pricing-refresh-worker.js'; const pollIntervalMs = Number.parseInt(process.env.WORKER_POLL_INTERVAL_MS ?? '2000', 10); @@ -17,6 +22,12 @@ async function runWorker() { const database = createDatabase(); const imageStorage = createLocalImageStorage(imageStorageRoot); const jobRepository = createImageDerivativeJobRepository(database.db); + const pricingRefreshJobRepository = createPricingRefreshJobRepository(database.db); + const pricingProviderRegistry = createPricingProviderRegistry(); + const pricingService = createPricingService({ + pricingRepository: createPricingRepository(database.db), + pricingProviderRegistry, + }); const processor = createImageDerivativeProcessor({ imageStorage, renderer: createSharpImageRenderer(), @@ -32,6 +43,17 @@ async function runWorker() { }); if (result) console.log(`Image derivative job ${result.id} ${result.status.toLowerCase()}.`); + + const pricingResult = await processNextPersistentPricingRefreshJob({ + jobRepository: pricingRefreshJobRepository, + pricingRefreshJob: (job) => runPricingRefreshJob({ + job, + providerRegistry: pricingProviderRegistry, + pricingService, + }), + }); + + if (pricingResult) console.log(`Pricing refresh job ${pricingResult.id} ${pricingResult.status.toLowerCase()}.`); } await processOne(); diff --git a/docs/IMPLEMENTATION-STATUS.md b/docs/IMPLEMENTATION-STATUS.md index f138190..8dbb14c 100644 --- a/docs/IMPLEMENTATION-STATUS.md +++ b/docs/IMPLEMENTATION-STATUS.md @@ -149,7 +149,7 @@ Work through one bounded vertical slice at a time. The linked documentation rema - No initial User/Seller is provisioned in the development database yet. Run `npm run provision:admin` after setting its required local `.env` variables. - Listings are partially implemented: draft creation, seller-scoped reads, publication gating, lifecycle writes, archive behavior, sold/archived inventory checks, and item-owned image metadata are complete; storage-backed processing remains. - Concrete provider adapters, asynchronous pricing refresh transport, richer exports/settings, full integration CI services, and deployment/backup automation remain incomplete to varying degrees. -- The pricing refresh worker now has durable PostgreSQL refresh jobs with row-locked claim, completed/failed persistence, and provider observations routed through the pricing service; configured external providers remain deployment work. +- The pricing refresh worker now claims durable PostgreSQL jobs with row locking, persists completed/failed outcomes, and routes provider observations through the pricing service; configured external providers remain deployment work. - Pricing refresh requests now enqueue seller-scoped jobs and expose a safe `GET /api/v1/admin/jobs/:id` polling contract instead of doing provider work inline. - `npm install` currently reports dependency audit findings. Review and remediate them before production deployment; do not use `npm audit fix --force` without reviewing its changes.