From 4ea7139ed50e8a6641f33ad8adff480d70170b7b Mon Sep 17 00:00:00 2001 From: Kelly Date: Fri, 12 Dec 2025 20:14:00 -0700 Subject: [PATCH] feat: Add step reporting to all task handlers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added updateStep() calls to: - payload-fetch-curl: loading → preflight → fetching → saving - product-refresh: loading → normalizing → upserting - store-discovery-http: starting → preflight → navigating → fetching This enables real-time visibility of worker progress in the dashboard. --- backend/src/tasks/handlers/payload-fetch-curl.ts | 6 +++++- backend/src/tasks/handlers/product-refresh.ts | 1 + backend/src/tasks/handlers/store-discovery-http.ts | 6 +++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/src/tasks/handlers/payload-fetch-curl.ts b/backend/src/tasks/handlers/payload-fetch-curl.ts index 9c1bf105..5d803ffa 100644 --- a/backend/src/tasks/handlers/payload-fetch-curl.ts +++ b/backend/src/tasks/handlers/payload-fetch-curl.ts @@ -28,7 +28,7 @@ import { saveRawPayload } from '../../utils/payload-storage'; import { taskService } from '../task-service'; export async function handlePayloadFetch(ctx: TaskContext): Promise { - const { pool, task } = ctx; + const { pool, task, updateStep } = ctx; const dispensaryId = task.dispensary_id; if (!dispensaryId) { @@ -39,6 +39,7 @@ export async function handlePayloadFetch(ctx: TaskContext): Promise // ============================================================ // STEP 1: Load dispensary info // ============================================================ + updateStep('loading', 'Loading dispensary info'); const dispResult = await pool.query(` SELECT id, name, platform_dispensary_id, menu_url, menu_type, city, state @@ -67,6 +68,7 @@ export async function handlePayloadFetch(ctx: TaskContext): Promise // ============================================================ // STEP 2: Start stealth session // ============================================================ + updateStep('preflight', 'Starting stealth session'); const session = startSession(); console.log(`[PayloadFetch] Session started: ${session.sessionId}`); @@ -75,6 +77,7 @@ export async function handlePayloadFetch(ctx: TaskContext): Promise // ============================================================ // STEP 3: Fetch products via GraphQL (Status: 'All') // ============================================================ + updateStep('fetching', 'Executing GraphQL query'); const allProducts: any[] = []; let page = 0; let totalCount = 0; @@ -162,6 +165,7 @@ export async function handlePayloadFetch(ctx: TaskContext): Promise // STEP 4: Save raw payload to filesystem // Per TASK_WORKFLOW_2024-12-10.md: Metadata/Payload separation // ============================================================ + updateStep('saving', `Saving ${allProducts.length} products`); const rawPayload = { dispensaryId, platformId, diff --git a/backend/src/tasks/handlers/product-refresh.ts b/backend/src/tasks/handlers/product-refresh.ts index 2c0df585..97f9d47d 100644 --- a/backend/src/tasks/handlers/product-refresh.ts +++ b/backend/src/tasks/handlers/product-refresh.ts @@ -188,6 +188,7 @@ export async function handleProductRefresh(ctx: TaskContext): Promise { - const { pool, task, crawlRotator } = ctx; + const { pool, task, crawlRotator, updateStep } = ctx; const platform = task.platform || 'dutchie'; let browser: any = null; try { + updateStep('starting', 'Initializing store discovery'); console.log(`[StoreDiscoveryHTTP] Starting discovery for platform: ${platform}`); // ============================================================ // STEP 1: Setup Puppeteer with proxy // ============================================================ + updateStep('preflight', 'Launching browser'); const puppeteer = require('puppeteer-extra'); const StealthPlugin = require('puppeteer-extra-plugin-stealth'); puppeteer.use(StealthPlugin()); @@ -126,6 +128,7 @@ export async function handleStoreDiscoveryHttp(ctx: TaskContext): Promise { const logs: string[] = []; try {