import { repoDb } from "../scoped-db"; export type SecuritySettings = { secretScanning: boolean; pushProtection: boolean; privateReporting: boolean; dependencyGraph: boolean; }; type SettingsRow = { secret_scanning: number; push_protection: number; private_reporting: number; dependency_graph: number; }; const DEFAULTS: SecuritySettings = { secretScanning: true, pushProtection: false, privateReporting: false, dependencyGraph: true, }; export async function loadSecuritySettings(repoId: string): Promise { const row = await repoDb(repoId).first("SELECT * FROM repo_security_settings WHERE repo_id = ?", repoId); if (!row) return DEFAULTS; return { secretScanning: row.secret_scanning === 1, pushProtection: row.push_protection === 1, privateReporting: row.private_reporting === 1, dependencyGraph: row.dependency_graph === 1, }; } export async function saveSecuritySettings(repoId: string, settings: SecuritySettings): Promise { await repoDb(repoId).run( `INSERT INTO repo_security_settings (repo_id, secret_scanning, push_protection, private_reporting, dependency_graph, updated_at) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT (repo_id) DO UPDATE SET secret_scanning = excluded.secret_scanning, push_protection = excluded.push_protection, private_reporting = excluded.private_reporting, dependency_graph = excluded.dependency_graph, updated_at = excluded.updated_at`, repoId, settings.secretScanning ? 1 : 0, settings.pushProtection ? 1 : 0, settings.privateReporting ? 1 : 0, settings.dependencyGraph ? 1 : 0, Date.now(), ); } /** * Reserves `count` consecutive per-repo alert numbers from a dedicated counter so security rows * never collide with issue numbers; returns the first reserved number. */ export async function reserveSecurityNumbers(repoId: string, kind: "secret" | "code", count: number): Promise { const row = await repoDb(repoId).first<{ number: number }>( `INSERT INTO security_counters (repo_id, kind, next_number) VALUES (?1, ?2, ?3 + 1) ON CONFLICT (repo_id, kind) DO UPDATE SET next_number = next_number + ?3 RETURNING next_number - ?3 AS number`, repoId, kind, count, ); return row?.number ?? 1; } export function nextSecurityNumber(repoId: string, kind: "secret" | "code"): Promise { return reserveSecurityNumbers(repoId, kind, 1); }