feat(23-05): implement getCompanyAutomationGate reader

- COALESCE(..., false) query keyed on company_id; absent row/null/NaN -> all-false
- never throws; type-check and vitest suite pass
This commit is contained in:
lorentz 2026-07-16 19:45:41 -04:00
parent 0d7974cdd9
commit e0f22f27c9

View file

@ -0,0 +1,58 @@
/**
* Phase 23 D-06/D-07: per-company phishing automation gate reader.
*
* Opt-in model a company with no `phishing_automation_gate` row has all
* three stages OFF. Mirrors the COALESCE(..., false)-over-LEFT-JOIN pattern
* used by `app/api/admin/phishing-automation/route.ts`, but scoped to a
* single company for the webhook's per-ticket gate check.
*/
import { postgresClient } from './postgres-client';
export interface CompanyAutomationGate {
autoParse: boolean;
autoClassify: boolean;
autoReport: boolean;
}
const ALL_FALSE: CompanyAutomationGate = {
autoParse: false,
autoClassify: false,
autoReport: false,
};
/**
* Reads the automation gate flags for a company. Absent row, null, or NaN
* companyId all resolve to all-false never throws.
*/
export async function getCompanyAutomationGate(
companyId: number | null
): Promise<CompanyAutomationGate> {
if (companyId === null || Number.isNaN(companyId)) {
return { ...ALL_FALSE };
}
const result = await postgresClient.query<{
auto_parse: boolean;
auto_classify: boolean;
auto_report: boolean;
}>(
`SELECT COALESCE(auto_parse, false) AS auto_parse,
COALESCE(auto_classify, false) AS auto_classify,
COALESCE(auto_report, false) AS auto_report
FROM phishing_automation_gate
WHERE company_id = $1`,
[companyId]
);
const row = result.rows[0];
if (!row) {
return { ...ALL_FALSE };
}
return {
autoParse: row.auto_parse,
autoClassify: row.auto_classify,
autoReport: row.auto_report,
};
}