90 lines
2.8 KiB
TypeScript
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);
|
|
});
|