38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { sql } from "@/lib/db";
|
|
import { getPipelineQueue, JOB_OPTIONS } from "@/lib/queue";
|
|
|
|
export const runtime = "nodejs";
|
|
|
|
export async function POST(
|
|
_req: NextRequest,
|
|
{ params }: { params: Promise<{ slug: string }> },
|
|
) {
|
|
const { slug } = await params;
|
|
|
|
const rows = await Promise.resolve(sql<{ geofabrik_url: string }[]>`
|
|
SELECT geofabrik_url FROM cities WHERE slug = ${slug}
|
|
`);
|
|
|
|
if (rows.length === 0) {
|
|
return NextResponse.json({ error: "City not found" }, { status: 404 });
|
|
}
|
|
|
|
const { geofabrik_url: geofabrikUrl } = rows[0];
|
|
|
|
const [{ iter }] = await Promise.resolve(sql<{ iter: number }[]>`
|
|
UPDATE cities SET status = 'pending', error_message = NULL,
|
|
refresh_iter = refresh_iter + 1
|
|
WHERE slug = ${slug}
|
|
RETURNING refresh_iter AS iter
|
|
`);
|
|
|
|
const queue = getPipelineQueue();
|
|
const job = await queue.add(
|
|
"refresh-city",
|
|
{ type: "refresh-city", citySlug: slug, geofabrikUrl, iter },
|
|
{ ...JOB_OPTIONS["refresh-city"], jobId: `refresh-city.${slug}.${iter}` },
|
|
);
|
|
|
|
return NextResponse.json({ citySlug: slug, jobId: job.id }, { status: 202 });
|
|
}
|