agmission/Development/server/helpers/partner_service_factory.js

95 lines
2.8 KiB
JavaScript

'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<Object>} 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();