import { NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { createRequestContainer } from '@open-mercato/shared/lib/di/container' import { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server' import { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope' import type { CommandBus } from '@open-mercato/shared/lib/commands' export const metadata = { POST: { requireAuth: true, requireFeatures: ['terminal_tracking.tracking_jobs.manage'] }, } const pollSchema = z.object({ id: z.string().uuid() }) export async function POST(request: NextRequest) { const auth = await getAuthFromRequest(request) if (!auth || !auth.orgId || !auth.tenantId) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) } let body: unknown try { body = await request.json() } catch { return NextResponse.json({ error: 'Invalid JSON body' }, { status: 400 }) } const parsed = pollSchema.safeParse(body) if (!parsed.success) { return NextResponse.json({ error: 'Invalid request', details: parsed.error.flatten() }, { status: 400 }) } const container = await createRequestContainer() const scope = await resolveOrganizationScopeForRequest({ container, auth, request }) const commandBus = container.resolve('commandBus') as CommandBus const selectedOrgId = scope?.selectedId ?? auth.orgId const tenantId = auth.tenantId try { const { result } = await commandBus.execute< { jobId: string; tenantId: string; organizationId: string }, { newEvents: number; updatedEvents: number } >('terminal_tracking.tracking.poll_single', { input: { jobId: parsed.data.id, tenantId, organizationId: selectedOrgId }, ctx: { container, auth, organizationScope: scope, selectedOrganizationId: selectedOrgId ?? null, organizationIds: scope?.filterIds ?? (selectedOrgId ? [selectedOrgId] : null), request, }, metadata: { tenantId: tenantId ?? null, organizationId: selectedOrgId ?? null, resourceKind: 'terminal_tracking.tracking_job', resourceId: parsed.data.id, }, }) return NextResponse.json(result) } catch (error) { const message = error instanceof Error ? error.message : 'Failed to poll terminal tracking job' return NextResponse.json({ error: message }, { status: 400 }) } }