diff --git a/package.json b/package.json index 6d8beb1..b59ed6c 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "main": "src/", "scripts": { "db.dump": "node scripts/dump.mjs", + "db.prune": "node scripts/prune.mjs", "db.restore": "node scripts/restore.mjs", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", "contributors:add": "all-contributors add", diff --git a/scripts/dump.mjs b/scripts/dump.mjs index 9c42491..1b9c331 100644 --- a/scripts/dump.mjs +++ b/scripts/dump.mjs @@ -31,7 +31,7 @@ if (process.env.DB_PROVIDER === 'sqlite') { spinner.succeed('Connected'); -export const models = [ +const models = [ 'user', 'guild', 'tag', diff --git a/scripts/prune.mjs b/scripts/prune.mjs new file mode 100644 index 0000000..251c786 --- /dev/null +++ b/scripts/prune.mjs @@ -0,0 +1,49 @@ +import { config } from 'dotenv'; +import { program } from 'commander'; +import { join } from 'path'; +import ora from 'ora'; +import { PrismaClient } from '@prisma/client'; + +config(); + +program + .requiredOption('-y, --yes', 'ARE YOU SURE?') + .option('-d, --days ', 'number of days', 365); + +program.parse(); + +const options = program.opts(); + +let spinner = ora('Connecting').start(); + +const prisma_options = {}; + +if (process.env.DB_PROVIDER === 'sqlite' && !process.env.DB_CONNECTION_URL) { + prisma_options.datasources = { db: { url: 'file:' + join(process.cwd(), './user/database.db') } }; +} + +const prisma = new PrismaClient(prisma_options); + +if (process.env.DB_PROVIDER === 'sqlite') { + const { default: sqliteMiddleware } = await import('../src/lib/middleware/prisma-sqlite.js'); + prisma.$use(sqliteMiddleware); + await prisma.$queryRaw`PRAGMA journal_mode=WAL;`; + await prisma.$queryRaw`PRAGMA synchronous=normal;`; +} + +spinner.succeed('Connected'); + +const now = Date.now(); +const elapsed = 1000 * 60 * 60 * 24 * options.days; +const cutoff = now - elapsed; + +spinner = ora('Counting total guilds').start(); +const total = await prisma.guild.count(); +spinner.succeed(`Found ${total} total guilds`); + +// ! the bot might still be in these guilds +spinner = ora(`Deleting guilds inactive for more than ${options.days} days`).start(); +const result = await prisma.guild.deleteMany({ where: { tickets: { none: { createdAt: { gt: new Date(cutoff) } } } } }); +spinner.succeed(`Deleted ${result.count} guilds; ${total - result.count} remaining`); + +process.exit(0);