JavaScript 56.7%
TypeScript 42.6%
1/**2 * Annule la réorganisation en rejouant data/applied.jsonl à l'envers3 * (noms/dossiers d'origine des fichiers, anciens dossiers recréés avec leur id, nouveaux dossiers vides supprimés, noms d'espaces).4 * npx tsx --env-file=.env scripts/organize/rollback.ts5 */6import fs from "fs";7import { prisma } from "../../lib/prisma";8import { APPLIED_PATH, readJsonl } from "./common";910interface Applied {11 kind: "file" | "space" | "folder-created" | "folder-deleted";12 fileId?: string; oldName?: string; newName?: string;13 oldFolder?: { id: string; name: string; parentId: string | null; sharedSpaceId: string | null } | null;14 newFolderId?: string; spaceId?: string; folderId?: string;15 folder?: { id: string; name: string; parentId: string | null; sharedSpaceId: string | null };16}1718async function ensureOldFolder(f: { id: string; name: string; parentId: string | null; sharedSpaceId: string | null }) {19 const exists = await prisma.folder.findUnique({ where: { id: f.id } });20 if (exists) return;21 if (f.parentId && !(await prisma.folder.findUnique({ where: { id: f.parentId } }))) f = { ...f, parentId: null };22 await prisma.folder.create({ data: { id: f.id, name: f.name, parentId: f.parentId, sharedSpaceId: f.sharedSpaceId } });23}2425async function main() {26 const entries = readJsonl<Applied>(APPLIED_PATH).reverse();27 let files = 0, spaces = 0, recreated = 0, removed = 0;28 for (const e of entries) {29 if (e.kind === "file" && e.fileId) {30 if (e.oldFolder) { await ensureOldFolder(e.oldFolder); recreated++; }31 await prisma.file.update({ where: { id: e.fileId }, data: { name: e.oldName!, folderId: e.oldFolder?.id ?? null } }).catch(() => {});32 files++;33 } else if (e.kind === "space" && e.spaceId) {34 await prisma.sharedSpace.update({ where: { id: e.spaceId }, data: { name: e.oldName! } }).catch(() => {});35 spaces++;36 } else if (e.kind === "folder-deleted" && e.folder) {37 await ensureOldFolder(e.folder); recreated++;38 }39 }40 // Supprimer les dossiers créés par le plan s'ils sont vides (enfants d'abord : ordre inverse de création)41 for (const e of entries) {42 if (e.kind === "folder-created" && e.folderId) {43 const f = await prisma.folder.findUnique({ where: { id: e.folderId }, include: { _count: { select: { files: true, children: true } } } });44 if (f && f._count.files === 0 && f._count.children === 0) { await prisma.folder.delete({ where: { id: f.id } }); removed++; }45 }46 }47 fs.renameSync(APPLIED_PATH, APPLIED_PATH + `.rolled-back-${Date.now()}`);48 console.log(`Rollback : ${files} fichiers restaurés · ${spaces} espaces · ${recreated} dossiers d'origine vérifiés · ${removed} dossiers du plan supprimés`);49 await prisma.$disconnect();50}5152main().catch((e) => { console.error(e); process.exit(1); });53