Files
alla-allaos-fullstack/scripts/audit-pdf-template-inventory.ts
phaichayon fd01ebf7c7 pdf task-h
2026-06-19 15:09:58 +07:00

90 lines
2.8 KiB
TypeScript

import {
createSqlClient,
getEffectiveMappedKeys,
extractTemplateFields,
getActiveTemplateVersions,
getDuplicateFieldNames,
getMappingsForVersion,
getUnknownFieldNames,
summarizeIssues
} from './pdf-audit-utils.ts';
async function main() {
const sql = createSqlClient();
try {
const templates = await getActiveTemplateVersions(sql);
const results = [];
for (const template of templates) {
const fields = extractTemplateFields(template.schemaJson);
const { mappings } = await getMappingsForVersion(sql, template.versionId);
const fieldNames = new Set(fields.map((field) => field.name).filter(Boolean));
const mappedKeys = getEffectiveMappedKeys(fields, mappings);
const duplicateFields = getDuplicateFieldNames(fields);
const unknownFields = getUnknownFieldNames(fields, mappedKeys);
const tableFields = fields.filter((field) => field.type === 'table').map((field) => field.name);
const dynamicTopicFields = fields
.filter((field) => field.name === 'topic' || field.name === 'data_topic')
.map((field) => field.name);
const placeholderTokens = new Set(fields.flatMap((field) => field.tokens));
const missingMappings = [...placeholderTokens].filter(
(token) => token !== 'item_topic' && !mappedKeys.has(token)
);
const orphanMappings = mappings
.filter(
(mapping) =>
!placeholderTokens.has(mapping.placeholderKey) &&
!fieldNames.has(mapping.placeholderKey) &&
mapping.placeholderKey !== 'items_table'
)
.map((mapping) => mapping.placeholderKey);
const status = summarizeIssues([
duplicateFields.length ? 'FAIL' : 'PASS',
missingMappings.length ? 'FAIL' : 'PASS',
orphanMappings.length ? 'WARNING' : 'PASS',
unknownFields.length ? 'WARNING' : 'PASS'
]);
results.push({
templateName: template.templateName,
version: template.version,
organizationId: template.organizationId,
schemaFieldCount: fields.length,
tableFields,
dynamicTopicFields,
duplicateFields,
unknownFields,
missingMappings,
orphanMappings,
mappedFieldCount: mappings.length,
status
});
}
const overallStatus = summarizeIssues(
results.map((result) => result.status) as Array<'PASS' | 'WARNING' | 'FAIL'>
);
console.log(
JSON.stringify(
{
audit: 'template-inventory',
overallStatus,
templateCount: results.length,
results
},
null,
2
)
);
} finally {
await sql.end({ timeout: 5 });
}
}
main().catch((error) => {
console.error(`[audit-pdf-template-inventory] ${error.message}`);
process.exit(1);
});