import { BaseCommand } from '@adonisjs/core/ace' import type { CommandOptions } from '@adonisjs/core/types/ace' import db from '@adonisjs/lucid/services/db' import { decidePar2Completeness } from '#services/par2_completeness' /** Releases per batch. */ const BATCH = 1000 /** * Decides completeness by par2 set (app/services/par2_completeness.ts) for the releases that had their par2 read * before it was built (2026-10-23): every holder of a set whose file list is still there, by release id. Once. */ export default class ReleasesPar2Complete extends BaseCommand { static commandName = 'releases:par2-complete' static description = 'Decides completeness by their par2 sets for settled releases without a counter, then exits' static options: CommandOptions = { startApp: true } async run() { let after = 0 let looked = 0 let decided = 0 for (;;) { const { rows } = await db.rawQuery( `SELECT DISTINCT s.release_id FROM par2_sets s WHERE s.release_id > ? AND EXISTS (SELECT 1 FROM par2_files f WHERE f.set_id = s.set_id) ORDER BY s.release_id LIMIT ?`, [after, BATCH] ) if (rows.length === 0) break const ids = rows.map((r: { release_id: string }) => Number(r.release_id)) decided += await decidePar2Completeness(db, ids) looked += ids.length after = ids.at(-1)! if (looked % 50_000 < BATCH) this.logger.info(`${looked} releases with a par2 set looked at, ${decided} decided (up to id ${after}).`) } this.logger.info(`Done: ${looked} releases with a par2 set looked at, ${decided} decided.`) } }