/** * Annule la réorganisation en rejouant data/applied.jsonl à l'envers * (noms/dossiers d'origine des fichiers, anciens dossiers recréés avec leur id, nouveaux dossiers vides supprimés, noms d'espaces). * npx tsx --env-file=.env scripts/organize/rollback.ts */ import fs from "fs"; import { prisma } from "../../lib/prisma"; import { APPLIED_PATH, readJsonl } from "./common"; interface Applied { kind: "file" | "space" | "folder-created" | "folder-deleted"; fileId?: string; oldName?: string; newName?: string; oldFolder?: { id: string; name: string; parentId: string | null; sharedSpaceId: string | null } | null; newFolderId?: string; spaceId?: string; folderId?: string; folder?: { id: string; name: string; parentId: string | null; sharedSpaceId: string | null }; } async function ensureOldFolder(f: { id: string; name: string; parentId: string | null; sharedSpaceId: string | null }) { const exists = await prisma.folder.findUnique({ where: { id: f.id } }); if (exists) return; if (f.parentId && !(await prisma.folder.findUnique({ where: { id: f.parentId } }))) f = { ...f, parentId: null }; await prisma.folder.create({ data: { id: f.id, name: f.name, parentId: f.parentId, sharedSpaceId: f.sharedSpaceId } }); } async function main() { const entries = readJsonl(APPLIED_PATH).reverse(); let files = 0, spaces = 0, recreated = 0, removed = 0; for (const e of entries) { if (e.kind === "file" && e.fileId) { if (e.oldFolder) { await ensureOldFolder(e.oldFolder); recreated++; } await prisma.file.update({ where: { id: e.fileId }, data: { name: e.oldName!, folderId: e.oldFolder?.id ?? null } }).catch(() => {}); files++; } else if (e.kind === "space" && e.spaceId) { await prisma.sharedSpace.update({ where: { id: e.spaceId }, data: { name: e.oldName! } }).catch(() => {}); spaces++; } else if (e.kind === "folder-deleted" && e.folder) { await ensureOldFolder(e.folder); recreated++; } } // Supprimer les dossiers créés par le plan s'ils sont vides (enfants d'abord : ordre inverse de création) for (const e of entries) { if (e.kind === "folder-created" && e.folderId) { const f = await prisma.folder.findUnique({ where: { id: e.folderId }, include: { _count: { select: { files: true, children: true } } } }); if (f && f._count.files === 0 && f._count.children === 0) { await prisma.folder.delete({ where: { id: f.id } }); removed++; } } } fs.renameSync(APPLIED_PATH, APPLIED_PATH + `.rolled-back-${Date.now()}`); console.log(`Rollback : ${files} fichiers restaurés · ${spaces} espaces · ${recreated} dossiers d'origine vérifiés · ${removed} dossiers du plan supprimés`); await prisma.$disconnect(); } main().catch((e) => { console.error(e); process.exit(1); });