SPB Git forge

spb/spb-cloud

Public
10commits 1branches 0releases
3.2 MBsize
maindefault branch
2 h agolast push
JavaScript 56.7% TypeScript 42.6%
2.7 KB · 53 lines typescript
Raw Blame History
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