123 lines
4.2 KiB
TypeScript
123 lines
4.2 KiB
TypeScript
|
|
import { EmailTemplate } from '../types';
|
|
|
|
// Fallback for crypto.randomUUID in non-secure (HTTP) contexts
|
|
export const generateUUID = () => {
|
|
if (typeof crypto !== 'undefined' && crypto.randomUUID) {
|
|
try {
|
|
return crypto.randomUUID();
|
|
} catch (e) {
|
|
// Fallback if it exists but fails
|
|
}
|
|
}
|
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
|
const r = Math.random() * 16 | 0;
|
|
const v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
return v.toString(16);
|
|
});
|
|
};
|
|
|
|
export const generateTemplateKey = (name: string): string => {
|
|
return name.trim().toLowerCase().replace(/\s+/g, '_').replace(/[^a-z0-9_]/g, '');
|
|
};
|
|
|
|
export const generateSQL = (template: EmailTemplate): string => {
|
|
const fullHtml = `${template.header}${template.body}${template.footer}`.replace(/'/g, "''");
|
|
const header = template.header.replace(/'/g, "''");
|
|
const body = template.body.replace(/'/g, "''");
|
|
const footer = template.footer.replace(/'/g, "''");
|
|
const subject = template.subject.replace(/'/g, "''");
|
|
const vars = JSON.stringify(template.variables).replace(/'/g, "''");
|
|
const key = generateTemplateKey(template.name);
|
|
const name = template.name.replace(/'/g, "''");
|
|
const desc = (template.description || '').replace(/'/g, "''");
|
|
|
|
return `INSERT INTO email_templates (id, template_key, name, description, subject, header_html, body_html, footer_html, full_html, required_variables)
|
|
VALUES ('${template.id}', '${key}', '${name}', '${desc}', '${subject}', '${header}', '${body}', '${footer}', '${fullHtml}', '${vars}')
|
|
ON DUPLICATE KEY UPDATE
|
|
template_key = VALUES(template_key),
|
|
name = VALUES(name),
|
|
description = VALUES(description),
|
|
subject = VALUES(subject),
|
|
header_html = VALUES(header_html),
|
|
body_html = VALUES(body_html),
|
|
footer_html = VALUES(footer_html),
|
|
full_html = VALUES(full_html),
|
|
required_variables = VALUES(required_variables);`;
|
|
};
|
|
|
|
export const generateSelectSQL = (template: EmailTemplate): string => {
|
|
const key = generateTemplateKey(template.name);
|
|
return `SELECT * FROM email_templates WHERE template_key = '${key}';`;
|
|
};
|
|
|
|
export const generateN8nCode = (template: EmailTemplate): string => {
|
|
const varsMap = template.variables.map(v => ` "${v}": "REPLACE_WITH_VALUE"`).join(',\n');
|
|
const hasVars = template.variables.length > 0;
|
|
|
|
return `// Nodo Code n8n - Popolatore Template
|
|
for (const item of items) {
|
|
const templateHtml = item.json.full_html;
|
|
const templateSubject = item.json.subject;
|
|
|
|
const replacements = {
|
|
${hasVars ? varsMap : ' // Nessuna variabile rilevata'}
|
|
};
|
|
|
|
let finalHtml = templateHtml;
|
|
let finalSubject = templateSubject;
|
|
|
|
for (const [key, value] of Object.entries(replacements)) {
|
|
const regex = new RegExp('{{' + key + '}}', 'g');
|
|
finalHtml = finalHtml.replace(regex, value);
|
|
if (finalSubject) {
|
|
finalSubject = finalSubject.replace(regex, value);
|
|
}
|
|
}
|
|
|
|
item.json.processed_html = finalHtml;
|
|
item.json.processed_subject = finalSubject;
|
|
}
|
|
return items;`;
|
|
};
|
|
|
|
export const getTemplates = async (): Promise<EmailTemplate[]> => {
|
|
console.log("Fetching templates from /api/templates...");
|
|
const response = await fetch('/api/templates');
|
|
if (!response.ok) {
|
|
const errorBody = await response.text();
|
|
throw new Error(`Errore API (${response.status}): ${errorBody || response.statusText}`);
|
|
}
|
|
return await response.json();
|
|
};
|
|
|
|
export const saveTemplate = async (template: EmailTemplate): Promise<void> => {
|
|
console.log("Saving template to /api/templates...", template.name);
|
|
const response = await fetch('/api/templates', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(template),
|
|
});
|
|
|
|
if (!response.ok) {
|
|
let errorMessage = `Errore HTTP ${response.status}`;
|
|
try {
|
|
const errorData = await response.json();
|
|
errorMessage = errorData.details || errorData.error || errorMessage;
|
|
} catch (e) {
|
|
const textError = await response.text();
|
|
if (textError) errorMessage = textError;
|
|
}
|
|
throw new Error(errorMessage);
|
|
}
|
|
};
|
|
|
|
export const deleteTemplate = async (id: string): Promise<void> => {
|
|
const response = await fetch(`/api/templates/${id}`, {
|
|
method: 'DELETE',
|
|
});
|
|
if (!response.ok) throw new Error('Eliminazione fallita');
|
|
};
|