feat: reconcile application vertical slices

Backfill the completed acquisitions, sales, dashboard, pricing, search, public detail, worker, migration, contracts, validation, tests, and implementation-status changes into one verified application slice.
This commit is contained in:
2026-09-09 22:12:53 -04:00
parent b9ff7445a6
commit b8f089a5d9
78 changed files with 4561 additions and 2057 deletions
+69 -32
View File
@@ -1,32 +1,59 @@
import dotenv from 'dotenv';
import { fileURLToPath } from 'node:url';
import dotenv from "dotenv";
import { fileURLToPath } from "node:url";
dotenv.config({ path: fileURLToPath(new URL('../../../.env', import.meta.url)) });
dotenv.config({
path: fileURLToPath(new URL("../../../.env", import.meta.url)),
});
import { createDatabase } from '../../api/src/infrastructure/database/client.js';
import { createLocalImageStorage, resolveProjectImageStorageRoot } from '../../api/src/infrastructure/images/local-image-storage.js';
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 { createFixturePricingProvider } from '../../api/src/modules/pricing/providers/fixture-pricing-provider.js';
import { processNextPersistentImageDerivativeJob } from './image-derivative-worker.js';
import { processNextPersistentPricingRefreshJob, runPricingRefreshJob } from './pricing-refresh-worker.js';
import { createDatabase } from "../../api/src/infrastructure/database/client.js";
import {
createLocalImageStorage,
resolveProjectImageStorageRoot,
} from "../../api/src/infrastructure/images/local-image-storage.js";
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 { createFixturePricingProvider } from "../../api/src/modules/pricing/providers/fixture-pricing-provider.js";
import { createHttpPricingProvider } from "../../api/src/modules/pricing/providers/http-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);
const pollIntervalMs = Number.parseInt(
process.env.WORKER_POLL_INTERVAL_MS ?? "2000",
10,
);
async function runWorker() {
const imageStorageRoot = resolveProjectImageStorageRoot(process.env.IMAGE_STORAGE_ROOT ?? '.local/image-storage', import.meta.url);
const imageStorageRoot = resolveProjectImageStorageRoot(
process.env.IMAGE_STORAGE_ROOT ?? ".local/image-storage",
import.meta.url,
);
const database = createDatabase();
const imageStorage = createLocalImageStorage(imageStorageRoot);
const jobRepository = createImageDerivativeJobRepository(database.db);
const pricingRefreshJobRepository = createPricingRefreshJobRepository(database.db);
const pricingProviderRegistry = process.env.PRICING_FIXTURE_PROVIDER_ENABLED === 'true'
? createPricingProviderRegistry([createFixturePricingProvider()])
: createPricingProviderRegistry();
const pricingRefreshJobRepository = createPricingRefreshJobRepository(
database.db,
);
const providers = [];
if (process.env.PRICING_FIXTURE_PROVIDER_ENABLED === "true")
providers.push(createFixturePricingProvider());
if (process.env.PRICING_HTTP_PROVIDER_ENDPOINT) {
providers.push(
createHttpPricingProvider({
id: process.env.PRICING_HTTP_PROVIDER_ID ?? "http-provider",
endpoint: process.env.PRICING_HTTP_PROVIDER_ENDPOINT,
token: process.env.PRICING_HTTP_PROVIDER_TOKEN,
}),
);
}
const pricingProviderRegistry = createPricingProviderRegistry(providers);
const pricingService = createPricingService({
pricingRepository: createPricingRepository(database.db),
pricingProviderRegistry,
@@ -45,32 +72,42 @@ async function runWorker() {
processor,
});
if (result) console.log(`Image derivative job ${result.id} ${result.status.toLowerCase()}.`);
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,
}),
pricingRefreshJob: (job) =>
runPricingRefreshJob({
job,
providerRegistry: pricingProviderRegistry,
pricingService,
}),
});
if (pricingResult) console.log(`Pricing refresh job ${pricingResult.id} ${pricingResult.status.toLowerCase()}.`);
if (pricingResult)
console.log(
`Pricing refresh job ${pricingResult.id} ${pricingResult.status.toLowerCase()}.`,
);
}
await processOne();
const timer = setInterval(() => processOne().catch((error) => console.error(error)), pollIntervalMs);
const timer = setInterval(
() => processOne().catch((error) => console.error(error)),
pollIntervalMs,
);
const shutdown = async () => {
clearInterval(timer);
await database.close();
};
process.once('SIGINT', shutdown);
process.once('SIGTERM', shutdown);
process.once("SIGINT", shutdown);
process.once("SIGTERM", shutdown);
}
runWorker().catch((error) => {
console.error(error);
process.exitCode = 1;
});
});