| import { existsSync, readdirSync, statSync, readFileSync } from "fs"; |
| import { join } from "path"; |
|
|
| const DB_DIR = join(process.cwd(), "data"); |
| const DB_PATH = join(DB_DIR, "nexova.db"); |
|
|
| export async function POST(req: Request) { |
| const { action } = await req.json().catch(() => ({ action: "backup" })); |
|
|
| if (action === "info") { |
| const files = existsSync(DB_DIR) |
| ? readdirSync(DB_DIR).map((f) => { |
| const s = statSync(join(DB_DIR, f)); |
| return { name: f, size: `${(s.size / 1024).toFixed(1)}KB`, modified: s.mtime.toISOString() }; |
| }) |
| : []; |
| return Response.json({ ok: true, data: { dir: DB_DIR, files } }); |
| } |
|
|
| if (action === "backup") { |
| if (!existsSync(DB_PATH)) |
| return Response.json({ ok: false, error: "no database file" }, { status: 400 }); |
| const token = process.env.HF_TOKEN; |
| const repo = process.env.HF_DATASET ?? "jay-hank/Nexova-storage"; |
| if (!token) return Response.json({ ok: false, error: "HF_TOKEN not set" }, { status: 500 }); |
|
|
| try { |
| const file = readFileSync(DB_PATH); |
| const b64 = Buffer.from(file).toString("base64"); |
|
|
| const res = await fetch( |
| `https://huggingface.co/api/datasets/${repo}/commit/main`, |
| { |
| method: "POST", |
| headers: { |
| Authorization: `Bearer ${token}`, |
| "Content-Type": "application/json", |
| }, |
| body: JSON.stringify({ |
| summary: `backup ${new Date().toISOString()}`, |
| operations: [{ |
| op: "upload", |
| path: "nexova.db", |
| encoding: "base64", |
| content: b64, |
| }], |
| }), |
| } |
| ); |
| const status = res.status; |
| const text = await res.text(); |
| return Response.json({ ok: status < 400, message: `HTTP ${status}`, detail: text }); |
| } catch (e: unknown) { |
| return Response.json({ ok: false, error: e instanceof Error ? e.message : String(e) }, { status: 500 }); |
| } |
| } |
|
|
| return Response.json({ ok: false, error: `unknown action: ${action}` }, { status: 400 }); |
| } |
|
|