Refactor document and email template schemas to include resource validation and normalization functions
All checks were successful
farmcontrol/farmcontrol-api/pipeline/head This commit looks good

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.
This commit is contained in:
Tom Butcher 2026-09-13 19:51:24 +01:00
parent 171d3094a2
commit 52162e1ec6
2 changed files with 52 additions and 10 deletions

View File

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

View File

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