@454creative/easy-email
Version:
A framework-agnostic email service library for Node.js with observability and monitoring
142 lines • 6.94 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SendGridTemplateService = void 0;
const email_options_interface_1 = require("../../interfaces/email-options.interface");
const logger_1 = require("../../utils/logger");
const errors_1 = require("../../errors");
class SendGridTemplateService {
constructor(_config) {
this.logger = logger_1.Logger.getInstance();
}
renderTemplate(templateId, data, provider) {
return __awaiter(this, void 0, void 0, function* () {
if (provider !== email_options_interface_1.EmailProviderType.SENDGRID) {
throw new errors_1.TemplateError(`Provider ${provider} not supported by SendGridTemplateService`);
}
try {
this.logger.debug(`Rendering SendGrid template: ${templateId}`, { data });
// In a real implementation, you would call SendGrid's template API
// For now, we'll simulate template rendering
const template = yield this.getTemplate(templateId);
const renderedContent = this.renderWithData(template, data);
this.logger.debug(`SendGrid template rendered successfully: ${templateId}`);
return renderedContent;
}
catch (error) {
this.logger.error(`Failed to render SendGrid template: ${templateId}`, { error });
throw new errors_1.TemplateError(`Failed to render SendGrid template: ${templateId}`, { error });
}
});
}
validateTemplate(templateId, provider) {
return __awaiter(this, void 0, void 0, function* () {
if (provider !== email_options_interface_1.EmailProviderType.SENDGRID) {
return false;
}
try {
yield this.getTemplate(templateId);
return true;
}
catch (_a) {
return false;
}
});
}
getTemplateInfo(templateId, provider) {
return __awaiter(this, void 0, void 0, function* () {
if (provider !== email_options_interface_1.EmailProviderType.SENDGRID) {
throw new errors_1.TemplateError(`Provider ${provider} not supported by SendGridTemplateService`);
}
try {
const template = yield this.getTemplate(templateId);
return {
id: templateId,
name: template.name || templateId,
version: template.version || '1.0.0',
variables: template.variables || [],
lastModified: template.updated_at ? new Date(template.updated_at) : new Date(),
provider: email_options_interface_1.EmailProviderType.SENDGRID
};
}
catch (error) {
throw new errors_1.TemplateError(`Failed to get template info: ${templateId}`, { error });
}
});
}
validateTemplateWithDetails(templateId, data) {
return __awaiter(this, void 0, void 0, function* () {
try {
const template = yield this.getTemplate(templateId);
const templateVariables = template.variables || [];
const providedVariables = Object.keys(data);
const missingVariables = templateVariables.filter((v) => !providedVariables.includes(v));
const warnings = providedVariables.filter((v) => !templateVariables.includes(v));
return {
isValid: missingVariables.length === 0,
errors: missingVariables.length > 0 ? [`Missing required variables: ${missingVariables.join(', ')}`] : [],
warnings: warnings.length > 0 ? [`Unused variables provided: ${warnings.join(', ')}`] : [],
variables: templateVariables,
missingVariables
};
}
catch (error) {
return {
isValid: false,
errors: [`Template not found or invalid: ${templateId}`],
warnings: [],
variables: [],
missingVariables: []
};
}
});
}
getTemplate(templateId) {
return __awaiter(this, void 0, void 0, function* () {
// In a real implementation, this would call SendGrid's template API
// For now, we'll return a mock template structure
if (!templateId.startsWith('d-')) {
throw new errors_1.InvalidTemplateError(`Invalid SendGrid template ID format: ${templateId}`);
}
// Mock template data - in production this would come from SendGrid API
return {
id: templateId,
name: `Template ${templateId}`,
version: '1.0.0',
variables: ['name', 'activationLink', 'email'],
updated_at: new Date().toISOString(),
content: {
html: '<h1>Hello {{name}}!</h1><p>Click here: {{activationLink}}</p>',
text: 'Hello {{name}}! Click here: {{activationLink}}'
}
};
});
}
renderWithData(template, data) {
// Simple template rendering - in production you might use a more sophisticated engine
let content = template.content.html || template.content.text || '';
// Replace variables with data
Object.entries(data).forEach(([key, value]) => {
const regex = new RegExp(`{{${key}}}`, 'g');
content = content.replace(regex, String(value));
});
// Replace any remaining variables with empty strings
const remainingVariables = content.match(/\{\{([^}]+)\}\}/g) || [];
remainingVariables.forEach((variable) => {
const key = variable.slice(2, -2); // Remove {{ }}
const regex = new RegExp(`{{${key}}}`, 'g');
content = content.replace(regex, '');
});
return content;
}
}
exports.SendGridTemplateService = SendGridTemplateService;
//# sourceMappingURL=sendgrid-template.service.js.map