Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 

49 строки
1.7 KiB

  1. import { NextResponse } from 'next/server';
  2. import { mkdir, writeFile, rm } from 'node:fs/promises';
  3. import path from 'node:path';
  4. import crypto from 'node:crypto';
  5. import { checkSystemBin } from '@/lib/system-bins';
  6. import { restoreFromZipFile } from '@/lib/restore-zip';
  7. export const dynamic = 'force-dynamic';
  8. export const maxDuration = 600;
  9. const PROJECT_ROOT = process.cwd();
  10. const UPLOAD_STAGING = path.join(PROJECT_ROOT, '.restore-staging');
  11. export async function POST(request: Request) {
  12. if (!(await checkSystemBin('unzip', '-v'))) {
  13. return NextResponse.json({ error: "Binario 'unzip' non disponibile sul server." }, { status: 503 });
  14. }
  15. const sessionId = crypto.randomUUID();
  16. const sessionDir = path.join(UPLOAD_STAGING, `upload-${sessionId}`);
  17. const zipPath = path.join(sessionDir, 'backup.zip');
  18. try {
  19. const formData = await request.formData();
  20. const file = formData.get('file') as File | null;
  21. if (!file) {
  22. return NextResponse.json({ error: 'Nessun file ricevuto.' }, { status: 400 });
  23. }
  24. await mkdir(sessionDir, { recursive: true });
  25. await writeFile(zipPath, Buffer.from(await file.arrayBuffer()));
  26. const result = await restoreFromZipFile(zipPath);
  27. if (!result.ok) {
  28. return NextResponse.json({ error: result.error, detail: result.detail }, { status: result.status });
  29. }
  30. return NextResponse.json({
  31. ok: true,
  32. restored: { cards: result.cards, portals: result.portals },
  33. previousDataBackup: result.previousBackup,
  34. });
  35. } catch (error) {
  36. console.error('Restore error:', error);
  37. return NextResponse.json({ error: 'Errore durante il ripristino.' }, { status: 500 });
  38. } finally {
  39. try { await rm(sessionDir, { recursive: true, force: true }); } catch { /* ignore */ }
  40. }
  41. }