95 lines
2.7 KiB
JavaScript
95 lines
2.7 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': './satloc_service',
|
|
// Add more partner services here as they're implemented
|
|
// 'AGIDRONEX': './agidronex_service',
|
|
// 'OTHERPARTER': './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();
|