- COALESCE(..., false) query keyed on company_id; absent row/null/NaN -> all-false - never throws; type-check and vitest suite pass
58 lines
1.5 KiB
TypeScript
58 lines
1.5 KiB
TypeScript
/**
|
|
* 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,
|
|
};
|
|
}
|