Add resource management to document and email template schemas
All checks were successful
farmcontrol/farmcontrol-ws/pipeline/head This commit looks good
All checks were successful
farmcontrol/farmcontrol-ws/pipeline/head This commit looks good
- Introduced a `resources` field in both `documentTemplate` and `emailTemplate` schemas to manage associated resources. - Implemented validation and normalization functions for resource names to ensure uniqueness and proper formatting. - Updated schemas to include resource name and file references, enhancing template management capabilities.
This commit is contained in:
parent
110ea9355a
commit
cd12a0ca0d
@ -2,8 +2,33 @@ import mongoose from 'mongoose';
|
||||
import { generateId } from '../../utils.js';
|
||||
const { Schema } = mongoose;
|
||||
|
||||
const RENDER_DOCUMENT_TEMPLATE_CALL =
|
||||
/fc\.renderDocumentTemplate\s*\(\s*(['"])([^'"]+)\1/g;
|
||||
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) {
|
||||
if (content == null || typeof content !== 'string' || content === '') {
|
||||
@ -103,6 +128,27 @@ const documentTemplateSchema = new Schema(
|
||||
refPath: 'objectType',
|
||||
required: false,
|
||||
},
|
||||
resources: {
|
||||
type: [
|
||||
new Schema(
|
||||
{
|
||||
name: {
|
||||
type: String,
|
||||
required: true,
|
||||
set: normalizeTemplateResourceName,
|
||||
match: RESOURCE_NAME_PATTERN,
|
||||
},
|
||||
file: { type: Schema.Types.ObjectId, ref: 'file', required: true },
|
||||
},
|
||||
{ _id: true }
|
||||
),
|
||||
],
|
||||
default: [],
|
||||
validate: {
|
||||
validator: validateTemplateResources,
|
||||
message: 'Template resource names must be unique.',
|
||||
},
|
||||
},
|
||||
},
|
||||
{ timestamps: true }
|
||||
);
|
||||
|
||||
@ -2,6 +2,32 @@ import mongoose from 'mongoose';
|
||||
import { generateId } from '../../utils.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) {
|
||||
@ -36,13 +62,32 @@ const emailTemplateSchema = new Schema(
|
||||
active: { type: Boolean, required: true, default: true },
|
||||
global: { type: Boolean, required: true, default: false },
|
||||
parent: { type: Schema.Types.ObjectId, ref: 'emailTemplate', required: false },
|
||||
referencedTemplates: [
|
||||
{ type: Schema.Types.ObjectId, ref: 'emailTemplate', required: false },
|
||||
],
|
||||
referencedTemplates: [{ type: Schema.Types.ObjectId, ref: 'emailTemplate', required: false }],
|
||||
subject: { type: String, required: false, default: '' },
|
||||
content: { type: String, required: false, default: '<Container></Container>' },
|
||||
testObject: { type: Schema.Types.ObjectId, refPath: 'objectType', required: false },
|
||||
attachments: { type: [emailTemplateAttachmentSchema], default: [] },
|
||||
resources: {
|
||||
type: [
|
||||
new Schema(
|
||||
{
|
||||
name: {
|
||||
type: String,
|
||||
required: true,
|
||||
set: normalizeTemplateResourceName,
|
||||
match: RESOURCE_NAME_PATTERN,
|
||||
},
|
||||
file: { type: Schema.Types.ObjectId, ref: 'file', required: true },
|
||||
},
|
||||
{ _id: true }
|
||||
),
|
||||
],
|
||||
default: [],
|
||||
validate: {
|
||||
validator: validateTemplateResources,
|
||||
message: 'Template resource names must be unique.',
|
||||
},
|
||||
},
|
||||
},
|
||||
{ timestamps: true }
|
||||
);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user