corporate-frontend-mithril
Version:
Corporate frontend MithrilJS modules
132 lines (109 loc) • 3.56 kB
JavaScript
const io = require('socket.io-client');
const _ = require('lodash');
const config = require('../../../applications/aem-board/config');
const AbstractDataService = require('../../../lib/abstract-data-service');
const AemBoardHelper = require('../aem-board-helper');
const socket = io(config.apiRootPath);
/**
* Centralised data, which is shared by all other components
*/
let _data = {
//Component states object
ams: {},
updatedBundles: [],
currentServerKey: '',
currentInstanceKey: '',
state :{
isWatchingProdBundles : false,
},
watchingProdBundlesRemaining: 0,
};
let service = AbstractDataService({data: _data});
/*---------------------- helpers -------------------------*/
let _syncUpdatedBundles = function(updatedBundles) {
_.each(_data.ams, (server, name)=> {
let matchedBundles = _.filter(updatedBundles, (bundle)=> {
return bundle.server === name;
});
if(!Object.is(matchedBundles, undefined)) {
_.each(matchedBundles, (candidate)=> {
let targetPair = _.find(server.bundleGroups, (item)=> {
return item[0] === candidate.name;
});
let targetBundle = _.find(targetPair[1], (bundle)=> {
return bundle.instance === candidate.instance;
});
Object.assign(targetBundle, candidate);
});
}
});
};
Object.assign(service, {
handleUpdatedBundles(bundles) {
_data.updatedBundles.length = 0;
Object.assign(_data.updatedBundles, bundles);
_syncUpdatedBundles(bundles);
service.broadcastDataChanges('updatedBundles');
m.redraw();
},
fetchAllBundles() {
return new Promise((resolve, reject)=> {
Promise.all(config.ams.map((env)=> {
return service.fetchBundles(env.server, env.instance);
})).then((results)=> {
let data = AemBoardHelper.groupByServers(results);
data = AemBoardHelper.groupByBundles(data);
Object.assign(_data.ams, data);
resolve(data);
}).catch(reject);
});
},
/**
* Get global configuration from the remote server
*/
fetchBundles(server, instance) {
return new Promise((resolve, reject)=> {
m.request({
method: 'GET',
url: `${config.apiRootPath}/aem-bundles?server=${server}&instance=${instance}`,
}).then((result)=> {
let data = {
server: server,
instance: instance,
data: result,
};
resolve(data);
}).catch((err)=> {
console.warn('fetchBundles error', err);
reject(err);
});
});
},
listResults() {
return _data.ams;
},
set currentServerKey(value) {
_data.currentServerKey = value;
},
set currentInstanceKey(value) {
_data.currentInstanceKey = value;
},
get currentServerKey() {
return _data.currentServerKey;
},
get currentInstanceKey() {
return _data.currentInstanceKey;
},
get state() {
return _data.state;
},
});
/**
* register socket events
*/
socket.on('connect', function(){
console.log('socket connected');
});
socket.emit('join', 'aem-board client');
socket.on('updated_bundles', service.handleUpdatedBundles);
module.exports = service;