mirror of
https://github.com/IliesAllali/parenthese.git
synced 2026-11-11 00:02:13 +00:00
Utilisateurs - Suppression de compte depuis l'écran « Votre compte », confirmée par mot de passe : arbres possédés et médias effacés, email retiré des contributions, sessions fermées partout. - Suppression d'arbre définitive, en base et sur le disque. - Ajout d'un frère ou d'une sœur relié aux parents existants ; relations parent et enfant corrigées en mode démo. - Liste d'attente retirée (route, envoi d'emails, dépendance Resend). Projet ouvert - CI : front, landing, backend avec vérification des migrations, test Docker de bout en bout. - Déploiement lancé seulement après une CI réussie sur main. - Image API : CLI Prisma installée à part pour que les migrations tournent au démarrage. - SECURITY.md, CONTRIBUTING.md, modèles d'issue et de pull request. - Migration renommée avec un nom descriptif, contenu identique. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
60 lines
2.3 KiB
JavaScript
60 lines
2.3 KiB
JavaScript
// Purge définitive des arbres marqués supprimés (deletedAt non nul) : base et dossiers médias.
|
|
//
|
|
// Usage, depuis backend/ après `npm run build` :
|
|
// node scripts/purge-deleted-trees.mjs liste les arbres concernés, ne modifie rien
|
|
// node scripts/purge-deleted-trees.mjs --apply les supprime définitivement
|
|
//
|
|
// Le script réutilise la logique compilée de dist/lib/tree-purge.js, la même que l'API.
|
|
// Il n'affiche que des identifiants, jamais de nom d'arbre ni d'adresse email.
|
|
import { existsSync } from 'node:fs'
|
|
import path from 'node:path'
|
|
import { fileURLToPath, pathToFileURL } from 'node:url'
|
|
|
|
const backendDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..')
|
|
const distLibDir = path.join(backendDir, 'dist', 'lib')
|
|
const apply = process.argv.includes('--apply')
|
|
|
|
// Même répertoire de travail que le serveur : .env et MEDIA_STORAGE_PATH relatif se résolvent pareil.
|
|
process.chdir(backendDir)
|
|
|
|
if (!existsSync(path.join(distLibDir, 'tree-purge.js'))) {
|
|
console.error('Build introuvable : lancez `npm run build` dans backend/ avant ce script.')
|
|
process.exit(1)
|
|
}
|
|
|
|
const { prisma } = await import(pathToFileURL(path.join(distLibDir, 'prisma.js')).href)
|
|
const { purgeTrees } = await import(pathToFileURL(path.join(distLibDir, 'tree-purge.js')).href)
|
|
|
|
const logger = {
|
|
warn: (details, message) => console.warn(message, details),
|
|
error: (details, message) => console.error(message, details),
|
|
}
|
|
|
|
try {
|
|
const trees = await prisma.tree.findMany({
|
|
where: { deletedAt: { not: null } },
|
|
select: { id: true },
|
|
orderBy: { deletedAt: 'asc' },
|
|
})
|
|
const treeIds = trees.map((tree) => tree.id)
|
|
|
|
console.log(`${treeIds.length} arbre(s) marqué(s) supprimé(s).`)
|
|
for (const treeId of treeIds) {
|
|
console.log(` ${treeId}`)
|
|
}
|
|
|
|
if (treeIds.length === 0) {
|
|
// Rien à faire.
|
|
} else if (!apply) {
|
|
console.log('Simulation : aucune modification. Relancez avec --apply pour purger définitivement.')
|
|
} else {
|
|
const count = await purgeTrees(prisma, treeIds, logger)
|
|
console.log(`${count} arbre(s) purgé(s) en base, dossiers médias supprimés.`)
|
|
}
|
|
} catch (error) {
|
|
console.error('Échec de la purge :', error instanceof Error ? error.message : error)
|
|
process.exitCode = 1
|
|
} finally {
|
|
await prisma.$disconnect()
|
|
}
|