From 52162e1ec63fe87fed5d76507cac90a91dda91fc Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 13 Sep 2026 19:51:24 +0100 Subject: [PATCH] Refactor document and email template schemas to include resource validation and normalization functions This commit adds the `normalizeTemplateResourceName` and `validateTemplateResources` functions to both the document and email template schemas. These functions ensure that resource names are properly formatted and validated, enhancing the integrity of template resource management. The changes improve the overall schema structure and prepare for future enhancements in template handling. --- .../management/documenttemplate.schema.js | 31 ++++++++++++++++--- .../management/emailtemplate.schema.js | 31 ++++++++++++++++--- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/database/schemas/management/documenttemplate.schema.js b/src/database/schemas/management/documenttemplate.schema.js index 28e4d5a..1149c66 100644 --- a/src/database/schemas/management/documenttemplate.schema.js +++ b/src/database/schemas/management/documenttemplate.schema.js @@ -1,12 +1,33 @@ import mongoose from 'mongoose'; import { generateId } from '../../utils.js'; -import { - normalizeTemplateResourceName, - RESOURCE_NAME_PATTERN, - validateTemplateResources, -} from '../../../templates/templateresources.js'; const { Schema } = mongoose; +const RESOURCE_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/; + +function normalizeTemplateResourceName(value) { + return String(value ?? '') + .trim() + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, ''); +} + +function validateTemplateResources(resources) { + const names = new Set(); + for (const resource of resources || []) { + if ( + !RESOURCE_NAME_PATTERN.test(resource?.name || '') || + resource?.file == null || + resource.file === '' || + names.has(resource.name) + ) { + return false; + } + names.add(resource.name); + } + return true; +} + const RENDER_DOCUMENT_TEMPLATE_CALL = /fc\.renderDocumentTemplate\s*\(\s*(['"])([^'"]+)\1/g; function extractRenderDocumentTemplateReferences(content) { diff --git a/src/database/schemas/management/emailtemplate.schema.js b/src/database/schemas/management/emailtemplate.schema.js index ce50b99..844ec1f 100644 --- a/src/database/schemas/management/emailtemplate.schema.js +++ b/src/database/schemas/management/emailtemplate.schema.js @@ -1,12 +1,33 @@ import mongoose from 'mongoose'; import { generateId } from '../../utils.js'; -import { - normalizeTemplateResourceName, - RESOURCE_NAME_PATTERN, - validateTemplateResources, -} from '../../../templates/templateresources.js'; const { Schema } = mongoose; +const RESOURCE_NAME_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/; + +function normalizeTemplateResourceName(value) { + return String(value ?? '') + .trim() + .toLowerCase() + .replace(/[^a-z0-9]+/g, '-') + .replace(/^-+|-+$/g, ''); +} + +function validateTemplateResources(resources) { + const names = new Set(); + for (const resource of resources || []) { + if ( + !RESOURCE_NAME_PATTERN.test(resource?.name || '') || + resource?.file == null || + resource.file === '' || + names.has(resource.name) + ) { + return false; + } + names.add(resource.name); + } + return true; +} + const RENDER_EMAIL_TEMPLATE_CALL = /fc\.renderEmailTemplate\s*\(\s*(['"])([^'"]+)\1/g; function extractReferences(content) {