/** * Resource route: /api/scrape * * POST (form action) — バックグラウンドでスクレイプ開始、202 を即時返却 * GET ?venue_id=xxx — 特定会場のみバックグラウンド開始 * GET (パラメータなし) — 全会場をバックグラウンド開始 * * ステータス確認は /api/scrape-status?run_id=xxx */ import { redirect } from "react-router"; import type { Route } from "./+types/api.scrape"; import { startAllScrapersAsync, startScraperAsync } from "~/lib/scraper-runner.server"; export async function action({ request }: Route.ActionArgs) { const formData = await request.formData(); const venueId = formData.get("venue_id"); const run_id = venueId ? startScraperAsync(String(venueId)) : startAllScrapersAsync(); const referer = request.headers.get("Referer"); if (referer) return redirect(referer); return Response.json({ run_id, status: "started" }, { status: 202 }); } export async function loader({ request }: Route.LoaderArgs) { const url = new URL(request.url); const venueId = url.searchParams.get("venue_id"); const run_id = venueId ? startScraperAsync(venueId) : startAllScrapersAsync(); return Response.json({ run_id, status: "started" }, { status: 202 }); }