import { getDb } from "../index.ts"; import type { WikiRow } from "../types.ts"; export interface ModerationRow { subject_type: "wiki" | "did"; subject: string; reason: string | null; moderator: string | null; created_at: string; } // Splice into a WHERE clause on alias `w`. export const WIKI_NOT_MODERATED = ` w.at_uri NOT IN (SELECT subject FROM moderation_actions WHERE subject_type = 'wiki') AND w.did NOT IN (SELECT subject FROM moderation_actions WHERE subject_type = 'did')`; function upsert( subjectType: "wiki" | "did", subject: string, reason: string | null, moderator: string | null, ): void { const db = getDb(); db.run( `INSERT INTO moderation_actions (subject_type, subject, reason, moderator) VALUES (?, ?, ?, ?) ON CONFLICT(subject_type, subject) DO UPDATE SET reason = excluded.reason, moderator = excluded.moderator, created_at = datetime('now')`, [subjectType, subject, reason, moderator], ); } function remove(subjectType: "wiki" | "did", subject: string): void { const db = getDb(); db.run( "DELETE FROM moderation_actions WHERE subject_type = ? AND subject = ?", [subjectType, subject], ); } export function hideWiki( atUri: string, reason: string | null, moderator: string | null, ): void { upsert("wiki", atUri, reason, moderator); } export function unhideWiki(atUri: string): void { remove("wiki", atUri); } export function banDid( did: string, reason: string | null, moderator: string | null, ): void { upsert("did", did, reason, moderator); } export function unbanDid(did: string): void { remove("did", did); } export function isWikiHidden(wiki: Pick): boolean { const db = getDb(); const row = db .query( `SELECT 1 FROM moderation_actions WHERE (subject_type = 'wiki' AND subject = ?) OR (subject_type = 'did' AND subject = ?) LIMIT 1`, ) .get(wiki.at_uri, wiki.did); return row !== null; } export function isDidBanned(did: string): boolean { const db = getDb(); const row = db .query( "SELECT 1 FROM moderation_actions WHERE subject_type = 'did' AND subject = ?", ) .get(did); return row !== null; } export function listModeration(): ModerationRow[] { const db = getDb(); return db .query( "SELECT subject_type, subject, reason, moderator, created_at FROM moderation_actions ORDER BY created_at DESC", ) .all() as ModerationRow[]; }