JavaScript 56.7%
TypeScript 42.6%
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