'use strict'; /** * Partner Service Factory * Dynamically loads and creates partner services based on partner code */ class PartnerServiceFactory { constructor() { this.services = new Map(); this.serviceMapping = { 'SATLOC': '../services/satloc_service', // Add more partner services here as they're implemented // 'AGIDRONEX': '../services/agidronex_service', // 'OTHERPARTER': '../services/other_partner_service' }; } /** * Get partner service instance * @param {string} partnerCode - Partner code (e.g., 'SATLOC') * @returns {object} Partner service instance */ getService(partnerCode) { // Check if service is already instantiated if (this.services.has(partnerCode)) { return this.services.get(partnerCode); } // Check if service mapping exists const servicePath = this.serviceMapping[partnerCode]; if (!servicePath) { throw new Error(`Partner service not implemented for: ${partnerCode}`); } try { // Dynamically require and instantiate the service const ServiceClass = require(servicePath); const serviceInstance = new ServiceClass(); // Cache the instance for reuse this.services.set(partnerCode, serviceInstance); return serviceInstance; } catch (error) { throw new Error(`Failed to load partner service for ${partnerCode}: ${error.message}`); } } /** * Check if a partner service is available * @param {string} partnerCode - Partner code * @returns {boolean} True if service is available */ hasService(partnerCode) { return this.serviceMapping.hasOwnProperty(partnerCode); } /** * Get list of supported partner codes * @returns {string[]} Array of supported partner codes */ getSupportedPartners() { return Object.keys(this.serviceMapping); } /** * Register a new partner service (for dynamic registration) * @param {string} partnerCode - Partner code * @param {string} servicePath - Path to service module */ registerService(partnerCode, servicePath) { this.serviceMapping[partnerCode] = servicePath; } /** * Fetch log file from partner storage using appropriate service * @param {string} logFileName - Name of the log file to fetch * @param {string} partnerCode - Partner code (e.g., 'SATLOC') * @returns {Promise} Log file data with content buffer */ async fetchLogFile(logFileName, partnerCode) { const service = this.getService(partnerCode); if (typeof service.fetchLogFile !== 'function') { throw new Error(`Partner service ${partnerCode} does not support fetchLogFile method`); } return await service.fetchLogFile(logFileName, partnerCode); } } // Export singleton instance module.exports = new PartnerServiceFactory();