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) {