UNPKG

@454creative/easy-email

Version:

A framework-agnostic email service library for Node.js with observability and monitoring

142 lines 6.94 kB
"use strict"; 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