SPB Git forge

spb/spb-cloud

Public
10commits 1branches 0releases
3.2 MBsize
maindefault branch
1 h agolast push
JavaScript 56.7% TypeScript 42.6%
2.1 KB · 61 lines typescript
Raw Blame History
1import { prisma } from "../lib/prisma";2import { encryptBuffer } from "../lib/filecrypto";3import { readFile, writeFile } from "fs/promises";4import { existsSync } from "fs";5import path from "path";67const UPLOAD_DIR = process.env.UPLOAD_DIR || "./uploads";8const FILES_DIR = path.join(UPLOAD_DIR, "files");9const VERSIONS_DIR = path.join(UPLOAD_DIR, "versions");1011// Idempotent : ne chiffre que les fichiers isEncrypted=false (+ leurs versions au même moment).12// Usage: tsx scripts/encrypt-migrate.ts [fileId]   (fileId optionnel = ne traiter qu'un fichier)13async function main() {14  const onlyId = process.argv[2];15  const where: { isEncrypted: boolean; id?: string } = { isEncrypted: false };16  if (onlyId) where.id = onlyId;1718  const files = await prisma.file.findMany({19    where,20    select: { id: true, storagePath: true, name: true },21  });22  console.log(`À chiffrer : ${files.length} fichier(s)${onlyId ? " (ciblé)" : ""}`);2324  let ok = 0, miss = 0, err = 0;25  for (const f of files) {26    const fp = path.join(FILES_DIR, f.storagePath);27    if (!existsSync(fp)) { miss++; console.warn("MANQUANT", f.id, f.name); continue; }28    try {29      const plain = await readFile(fp);30      await writeFile(fp, encryptBuffer(plain));3132      // Chiffre aussi les versions de ce fichier (une seule fois, à la transition)33      const versions = await prisma.fileVersion.findMany({34        where: { fileId: f.id },35        select: { storagePath: true },36      });37      for (const v of versions) {38        const vp = path.join(VERSIONS_DIR, v.storagePath);39        if (existsSync(vp)) {40          const vpl = await readFile(vp);41          await writeFile(vp, encryptBuffer(vpl));42        }43      }4445      await prisma.file.update({46        where: { id: f.id },47        data: { isEncrypted: true, encryptionIV: "v2" },48      });49      ok++;50      if (ok % 100 === 0) console.log(`  ... ${ok} chiffrés`);51    } catch (e) {52      err++;53      console.error("ERREUR", f.id, f.name, (e as Error).message);54    }55  }56  console.log(`Terminé. ok=${ok} manquants=${miss} erreurs=${err}`);57  await prisma.$disconnect();58}5960main();61