79 lines
2.9 KiB
JavaScript

import mongoose from 'mongoose';
import { generateId } from '../../utils.js';
const { Schema } = mongoose;
const RENDER_EMAIL_TEMPLATE_CALL = /fc\.renderEmailTemplate\s*\(\s*(['"])([^'"]+)\1/g;
function extractReferences(content) {
const references = [];
const seen = new Set();
for (const match of String(content || '').matchAll(RENDER_EMAIL_TEMPLATE_CALL)) {
const reference = match[2]?.trim();
if (reference && !seen.has(reference)) {
seen.add(reference);
references.push(reference);
}
}
return references;
}
const emailTemplateAttachmentSchema = new Schema(
{
type: { type: String, enum: ['file', 'documentTemplate'], required: true },
file: { type: Schema.Types.ObjectId, refPath: 'attachments.type', required: true },
fileName: { type: String, required: true },
fileType: { type: String, enum: ['pdf', 'jpeg', 'png', 'svg'], required: false },
},
{ _id: true }
);
const emailTemplateSchema = new Schema(
{
_reference: { type: String, default: () => generateId()() },
name: { type: String, required: true, unique: true },
objectType: { type: String, required: false },
tags: [{ type: String }],
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 },
],
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: [] },
},
{ timestamps: true }
);
emailTemplateSchema.index({ name: 'text', tags: 'text', objectType: 'text' });
emailTemplateSchema.virtual('id').get(function () {
return this._id;
});
emailTemplateSchema.set('toJSON', { virtuals: true });
emailTemplateSchema.statics.recalculate = async function (emailTemplate, user) {
const id = emailTemplate?._id || emailTemplate;
if (!id || !(await this.exists({ _id: id }))) return;
const referencedTemplates = [];
for (const reference of extractReferences(emailTemplate?.content)) {
const normalizedReference = reference.replace(/^ETP:/i, '').trim();
const found = await this.findOne({ _reference: normalizedReference }).select('_id').lean();
if (found?._id) referencedTemplates.push(found._id);
}
const { editObject } = await import('../../database.js');
await editObject({
model: this,
id,
updateData: { referencedTemplates },
user,
populate: [{ path: 'referencedTemplates', strictPopulate: false }],
recalculate: false,
});
};
export const emailTemplateModel = mongoose.model('emailTemplate', emailTemplateSchema);