From 0e12e7238f48ffc2a5d35dae059c2f00c7250f3b Mon Sep 17 00:00:00 2001 From: yyamashita Date: Sat, 9 May 2026 14:36:28 +0900 Subject: Add /api/export and /api/import endpoints for DB backup and sync Co-Authored-By: Claude Sonnet 4.6 --- app/routes/api-export.tsx | 16 ++++++++++++++++ app/routes/api-import.tsx | 30 ++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 app/routes/api-export.tsx create mode 100644 app/routes/api-import.tsx (limited to 'app/routes') diff --git a/app/routes/api-export.tsx b/app/routes/api-export.tsx new file mode 100644 index 0000000..17437df --- /dev/null +++ b/app/routes/api-export.tsx @@ -0,0 +1,16 @@ +import { exportDb } from "~/lib/db.server"; + +export function loader() { + const data = exportDb(); + const date = new Date().toISOString().slice(0, 10); + return new Response(JSON.stringify(data, null, 2), { + headers: { + "Content-Type": "application/json", + "Content-Disposition": `attachment; filename="whois-export-${date}.json"`, + }, + }); +} + +export default function () { + return null; +} diff --git a/app/routes/api-import.tsx b/app/routes/api-import.tsx new file mode 100644 index 0000000..e28a7db --- /dev/null +++ b/app/routes/api-import.tsx @@ -0,0 +1,30 @@ +import type { ActionFunctionArgs } from "react-router"; +import { importDb, type DbExport } from "~/lib/db.server"; + +export async function action({ request }: ActionFunctionArgs) { + if (request.method !== "POST") { + return Response.json({ error: "Method not allowed" }, { status: 405 }); + } + + let data: DbExport; + try { + data = await request.json(); + } catch { + return Response.json({ error: "Invalid JSON body" }, { status: 400 }); + } + + if (!data || data.version !== 1) { + return Response.json({ error: "Invalid or unsupported export format (expected version 1)" }, { status: 400 }); + } + + try { + const result = importDb(data); + return Response.json({ ok: true, imported: result }); + } catch (e) { + return Response.json({ error: e instanceof Error ? e.message : "Import failed" }, { status: 500 }); + } +} + +export default function () { + return null; +} -- cgit v1.2.3