alpha01 filetti: web app, crossword service and tor batch
This commit is contained in:
18
webapp/app/api/crosswords/[id]/route.ts
Normal file
18
webapp/app/api/crosswords/[id]/route.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
import { readFile } from "node:fs/promises";
|
||||
import { join } from "node:path";
|
||||
import { NextResponse } from "next/server";
|
||||
|
||||
const RUNTIME_DIR = join(process.cwd(), ".runtime-crosswords");
|
||||
|
||||
export async function GET(
|
||||
_request: Request,
|
||||
context: { params: Promise<{ id: string }> },
|
||||
) {
|
||||
try {
|
||||
const { id } = await context.params;
|
||||
const source = await readFile(join(RUNTIME_DIR, `${id}.json`), "utf-8");
|
||||
return NextResponse.json(JSON.parse(source));
|
||||
} catch {
|
||||
return NextResponse.json({ status: "not_found" }, { status: 404 });
|
||||
}
|
||||
}
|
||||
65
webapp/app/api/crosswords/generate/route.ts
Normal file
65
webapp/app/api/crosswords/generate/route.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import { mkdir, writeFile } from "node:fs/promises";
|
||||
import { join } from "node:path";
|
||||
import { spawn } from "node:child_process";
|
||||
import { NextResponse } from "next/server";
|
||||
|
||||
const PYTHON = process.env.PYTHON_EXECUTABLE || "python";
|
||||
const PROJECT_ROOT = join(process.cwd(), "..");
|
||||
const RUNTIME_DIR = join(process.cwd(), ".runtime-crosswords");
|
||||
|
||||
function runPython(requestPayload: unknown): Promise<string> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const child = spawn(PYTHON, ["crossword_service.py"], {
|
||||
cwd: PROJECT_ROOT,
|
||||
stdio: ["pipe", "pipe", "pipe"],
|
||||
});
|
||||
|
||||
let stdout = "";
|
||||
let stderr = "";
|
||||
|
||||
child.stdout.on("data", (chunk) => {
|
||||
stdout += chunk.toString();
|
||||
});
|
||||
|
||||
child.stderr.on("data", (chunk) => {
|
||||
stderr += chunk.toString();
|
||||
});
|
||||
|
||||
child.on("error", (error) => {
|
||||
reject(error);
|
||||
});
|
||||
|
||||
child.on("close", (code) => {
|
||||
if (code !== 0) {
|
||||
reject(new Error(stderr || `Python process exited with code ${code}`));
|
||||
return;
|
||||
}
|
||||
resolve(stdout);
|
||||
});
|
||||
|
||||
child.stdin.write(JSON.stringify(requestPayload));
|
||||
child.stdin.end();
|
||||
});
|
||||
}
|
||||
|
||||
export async function POST(request: Request) {
|
||||
try {
|
||||
const payload = await request.json();
|
||||
const stdout = await runPython(payload);
|
||||
const responsePayload = JSON.parse(stdout);
|
||||
|
||||
await mkdir(RUNTIME_DIR, { recursive: true });
|
||||
const targetPath = join(RUNTIME_DIR, `${responsePayload.crossword_id}.json`);
|
||||
await writeFile(targetPath, JSON.stringify(responsePayload, null, 2), "utf-8");
|
||||
|
||||
return NextResponse.json(responsePayload);
|
||||
} catch (error) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
status: "error",
|
||||
message: error instanceof Error ? error.message : "Unknown error",
|
||||
},
|
||||
{ status: 500 },
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user