@454creative/easy-email
Version:
A framework-agnostic email service library for Node.js with observability and monitoring
156 lines • 6.1 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.TemplateManagerService = void 0;
const email_options_interface_1 = require("../interfaces/email-options.interface");
const sendgrid_template_service_1 = require("./templates/sendgrid-template.service");
const ses_template_service_1 = require("./templates/ses-template.service");
const logger_1 = require("../utils/logger");
const errors_1 = require("../errors");
class TemplateManagerService {
constructor() {
this.templateServices = new Map();
this.logger = logger_1.Logger.getInstance();
}
/**
* Register a template service for a specific provider
*/
registerTemplateService(provider, service) {
this.templateServices.set(provider, service);
this.logger.debug(`Template service registered for provider: ${provider}`);
}
/**
* Register SendGrid template service
*/
registerSendGridService(config) {
const service = new sendgrid_template_service_1.SendGridTemplateService(config);
this.registerTemplateService(email_options_interface_1.EmailProviderType.SENDGRID, service);
}
/**
* Register SES template service
*/
registerSesService(config) {
const service = new ses_template_service_1.SesTemplateService(config);
this.registerTemplateService(email_options_interface_1.EmailProviderType.SES, service);
}
/**
* Check if a template service is available for a provider
*/
hasTemplateService(provider) {
return this.templateServices.has(provider);
}
/**
* Get template service for a specific provider
*/
getTemplateService(provider) {
const service = this.templateServices.get(provider);
if (!service) {
throw new errors_1.ConfigurationError(`Template service not available for provider: ${provider}`);
}
return service;
}
/**
* Render template using the appropriate service
*/
renderTemplate(templateId, data, provider) {
return __awaiter(this, void 0, void 0, function* () {
const service = this.getTemplateService(provider);
return service.renderTemplate(templateId, data, provider);
});
}
/**
* Validate template using the appropriate service
*/
validateTemplate(templateId, provider) {
return __awaiter(this, void 0, void 0, function* () {
const service = this.getTemplateService(provider);
return service.validateTemplate(templateId, provider);
});
}
/**
* Get template info using the appropriate service
*/
getTemplateInfo(templateId, provider) {
return __awaiter(this, void 0, void 0, function* () {
const service = this.getTemplateService(provider);
return service.getTemplateInfo(templateId, provider);
});
}
/**
* Validate template with detailed results
*/
validateTemplateWithDetails(templateId, data, provider) {
return __awaiter(this, void 0, void 0, function* () {
const service = this.getTemplateService(provider);
// Check if the service has the extended validation method
if ('validateTemplateWithDetails' in service) {
return service.validateTemplateWithDetails(templateId, data);
}
// Fallback to basic validation
const isValid = yield service.validateTemplate(templateId, provider);
return {
isValid,
errors: isValid ? [] : [`Template validation failed: ${templateId}`],
warnings: [],
variables: [],
missingVariables: []
};
});
}
/**
* List available templates for a provider
*/
listTemplates(provider) {
return __awaiter(this, void 0, void 0, function* () {
const service = this.getTemplateService(provider);
// Check if the service has the listTemplates method
if ('listTemplates' in service) {
return service.listTemplates();
}
// Fallback: return empty array
this.logger.warn(`Provider ${provider} does not support listing templates`);
return [];
});
}
/**
* Get all available template services
*/
getAvailableProviders() {
return Array.from(this.templateServices.keys());
}
/**
* Clear all registered template services
*/
clearServices() {
this.templateServices.clear();
this.logger.debug('All template services cleared');
}
/**
* Get service statistics
*/
getServiceStats() {
const stats = {
totalServices: this.templateServices.size,
availableProviders: this.getAvailableProviders(),
services: {}
};
for (const [provider, service] of this.templateServices.entries()) {
stats.services[provider] = {
serviceName: service.constructor.name,
hasExtendedValidation: 'validateTemplateWithDetails' in service,
hasListTemplates: 'listTemplates' in service
};
}
return stats;
}
}
exports.TemplateManagerService = TemplateManagerService;
//# sourceMappingURL=template-manager.service.js.map