Files
forkmessager/apps/server/prisma/clean-db.ts
Халимов Рустам b4b4b8e0d3 Original
2026-03-10 21:11:59 +03:00

114 lines
3.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Полная очистка базы данных от тестовых данных.
* Удаляет ВСЕ: пользователей, чаты, сообщения, истории, дружбы.
* Таблицы и схема остаются на месте.
*
* Запуск: npx tsx prisma/clean-db.ts
*/
import { PrismaClient } from '@prisma/client';
import fs from 'fs';
import path from 'path';
const prisma = new PrismaClient();
async function cleanDatabase() {
console.log('⚠️ ВНИМАНИЕ: Полная очистка базы данных!\n');
// Удаляем в правильном порядке (зависимости → родители)
const counts: Record<string, number> = {};
// 1. Зависимые таблицы
const r1 = await prisma.hiddenMessage.deleteMany();
counts['HiddenMessage'] = r1.count;
const r2 = await prisma.readReceipt.deleteMany();
counts['ReadReceipt'] = r2.count;
const r3 = await prisma.reaction.deleteMany();
counts['Reaction'] = r3.count;
const r4 = await prisma.pinnedMessage.deleteMany();
counts['PinnedMessage'] = r4.count;
const r5 = await prisma.media.deleteMany();
counts['Media'] = r5.count;
const r6 = await prisma.storyView.deleteMany();
counts['StoryView'] = r6.count;
const r7 = await prisma.story.deleteMany();
counts['Story'] = r7.count;
// 2. Сообщения
const r8 = await prisma.message.deleteMany();
counts['Message'] = r8.count;
// 3. Чаты
const r9 = await prisma.chatMember.deleteMany();
counts['ChatMember'] = r9.count;
const r10 = await prisma.chat.deleteMany();
counts['Chat'] = r10.count;
// 4. Дружбы
const r11 = await prisma.friendship.deleteMany();
counts['Friendship'] = r11.count;
// 5. Пользователи
const r12 = await prisma.user.deleteMany();
counts['User'] = r12.count;
// 6. Чистка папки uploads (кроме avatars/.gitkeep)
const uploadsDir = path.join(__dirname, '..', 'uploads');
let filesDeleted = 0;
if (fs.existsSync(uploadsDir)) {
const entries = fs.readdirSync(uploadsDir);
for (const entry of entries) {
const fullPath = path.join(uploadsDir, entry);
const stat = fs.statSync(fullPath);
if (stat.isDirectory()) {
// Для папки avatars — очистить содержимое, но оставить папку
if (entry === 'avatars') {
const avatarFiles = fs.readdirSync(fullPath);
for (const f of avatarFiles) {
if (f === '.gitkeep') continue;
fs.unlinkSync(path.join(fullPath, f));
filesDeleted++;
}
}
} else {
// Файлы в корне uploads
if (entry !== '.gitkeep') {
fs.unlinkSync(fullPath);
filesDeleted++;
}
}
}
}
// Вывод результатов
console.log('┌──────────────────────────────────────┐');
console.log('│ 🧹 База данных очищена! │');
console.log('├──────────────────────────────────────┤');
for (const [table, count] of Object.entries(counts)) {
if (count > 0) {
console.log(`${table.padEnd(20)} ${String(count).padStart(6)} удалено │`);
}
}
if (filesDeleted > 0) {
console.log(`${'Файлы (uploads)'.padEnd(20)} ${String(filesDeleted).padStart(6)} удалено │`);
}
console.log('└──────────────────────────────────────┘');
console.log('\n✅ Готово. БД чистая, можно начинать с нуля.');
}
cleanDatabase()
.catch((e) => {
console.error('❌ Ошибка очистки:', e);
process.exit(1);
})
.finally(() => prisma.$disconnect());