import db from '@adonisjs/lucid/services/db' import { DEFAULT_RULES, type Rules } from '#lib/rules/index' type StoredRules = Omit /** * The rule set workers get with a lease (REBUILD.md, rules and recovery): * the newest version, plus the indexed groups' priorities (owner rule). * Version 1 (DEFAULT_RULES, no dropped signatures) is created when there is none. */ class RuleSets { async current(): Promise { let row = await db.from('rule_sets').orderBy('version', 'desc').first() if (!row) { const { version: _version, ...rules } = DEFAULT_RULES await db.table('rule_sets').insert({ version: 1, rules: JSON.stringify({ ...rules, droppedSignatures: [] }), note: 'default' }).onConflict('version').ignore() row = await db.from('rule_sets').orderBy('version', 'desc').first() } const groups = await db.from('groups').where('active', true).select('name', 'priority') const { version: _v, ...defaults } = DEFAULT_RULES return { // A field newer than the stored set takes today's default. ...defaults, ...(row.rules as StoredRules), version: Number(row.version), priorities: Object.fromEntries(groups.map((g) => [g.name, Number(g.priority)])), } } /** A new version: what changes is recorded on the ranges that run with it. */ async publish(rules: StoredRules, note?: string): Promise { const latest = await db.from('rule_sets').max('version as v').first() const version = Number(latest?.v ?? 0) + 1 await db.table('rule_sets').insert({ version, rules: JSON.stringify(rules), note: note ?? null }) return version } } export default new RuleSets()