Files
usenet-indexer/database/migrations/1768620764870_strict_par2_matching.ts
T

29 lines
1.1 KiB
TypeScript

import { BaseSchema } from '@adonisjs/lucid/schema'
/**
* par2 set id per listed file (traceability; see LOG.md 2026-09-28 for the
* cross-post merges it helps diagnose), and a stricter "random name" rule:
* long letter-only tokens with many capitals count as random too
* (e.g. RmISakytFwXSCEzjVEpaKk).
*/
export default class extends BaseSchema {
async up() {
this.schema.alterTable('release_files', (table) => {
table.string('set_id', 32)
})
this.defer(async (db) => {
await db.rawQuery(`
CREATE OR REPLACE FUNCTION is_readable_name(name text) RETURNS boolean IMMUTABLE LANGUAGE sql AS $$
SELECT name IS NOT NULL AND NOT (
(name_stem(name) ~ '^[A-Za-z0-9]{16,}$' AND name_stem(name) ~ '[a-z]' AND name_stem(name) ~ '[A-Z]'
AND (name_stem(name) ~ '\\d' OR length(regexp_replace(name_stem(name), '[^A-Z]', '', 'g')) >= 6))
OR name_stem(name) ~* '^[0-9a-f]{16,}$')
$$`)
})
}
async down() {
this.schema.alterTable('release_files', (table) => table.dropColumn('set_id'))
}
}