freifunkmanager/public/components/store.js

134 lines
4.0 KiB
JavaScript

'use strict';
angular.module('ffhb')
.factory('store', function($state, $q, $http, $rootScope,config,$interval,$cookieStore,webNotification) {
function notifyNew(nodeid){
webNotification.showNotification('New Node',{
body: '"'+nodeid+'"',
icon: '/favicon.ico',
onClick: function() {
$state.go('app.node', {nodeid: nodeid});
}
},function(){});
}
function notifyOffline(nodeid){
webNotification.showNotification('Offline Node',{
body: '"'+nodeid+'"',
icon: '/favicon.ico',
onClick: function() {
$state.go('app.node', {nodeid: nodeid});
}
},function(){});
}
var myservice = {};
myservice._initialized = false;
myservice._data = $cookieStore.get('data') ||{
nodes: {},nodesCount:0,
merged: {},
aliases: {},aliasesCount:0
};
var geojsonDeferred = $q.defer();
$http.get(config.geojson).success(function(geojson) {
geojsonDeferred.resolve(geojson);
});
myservice.getGeojson = geojsonDeferred.promise;
myservice.refresh = function(notify) {
var dataDeferred = $q.defer();
$http.get(config.api+'/nodes').success(function(nodes) {
$http.get(config.api+'/aliases').success(function(aliases) {
if(notify){
Object.keys(nodes).map(function(key){
if(myservice._data.nodes === undefined || myservice._data.nodes[key] === undefined){
notifyNew(key);
}
if(myservice._data.nodes !== undefined && myservice._data.nodes[key] !== undefined && myservice._data.nodes[key].flags.offline){
notifyOffline(key);
}
myservice._data.nodes[key] = nodes[key];
});
}else {
myservice._data.nodes = nodes;
}
angular.copy(nodes, myservice._data.merged);
Object.keys(aliases).map(function(key){
var node = myservice._data.nodes[key],
alias = aliases[key];
node.nodeinfo.hostname = alias.hostname;
if(!node.nodeinfo.owner){
node.nodeinfo.owner = {};
}
node.nodeinfo.owner.contact = alias.owner;
if(!node.nodeinfo.wireless){
node.nodeinfo.wireless = {};
}
if(alias.wireless){
if(alias.wireless.channel24){
node.nodeinfo.wireless.channel24 = alias.wireless.channel24;
}
if(alias.wireless.channel5){
node.nodeinfo.wireless.channel5 = alias.wireless.channel5;
}
if(alias.wireless.txpower24){
node.nodeinfo.wireless.txpower24 = alias.wireless.txpower24;
}
if(alias.wireless.txpower5){
node.nodeinfo.wireless.txpower5 = alias.wireless.txpower5;
}
}
if(!node.nodeinfo.location){
node.nodeinfo.location = {};
}
if(alias.location){
if(alias.location.latitude){
node.nodeinfo.location.latitude = alias.location.latitude;
}
if(alias.location.longitude){
node.nodeinfo.location.longitude = alias.location.longitude;
}
}
});
myservice._data.nodesCount = Object.keys(nodes).length || 0;
myservice._data.aliases = aliases;
myservice._data.aliasesCount = Object.keys(aliases).length || 0;
myservice._data.lastupdate = new Date();
dataDeferred.resolve(myservice._data);
if (myservice._initialized) {
$rootScope.$broadcast('store', dataDeferred.promise);
}
$cookieStore.put('data',myservice._data);
myservice._initialized = true;
});
});
myservice.getData = dataDeferred.promise;
return dataDeferred.promise;
};
myservice.refresh(false);
myservice.saveNode = function(nodeid){
var result = $q.defer();
if(myservice._data.merged && myservice._data.merged[nodeid]){
var node = myservice._data.merged[nodeid];
$http.post(config.api+'/aliases/alias/'+nodeid,{
'hostname':node.nodeinfo.hostname,
'owner':node.owner.contact
}).then(function(){
result.resolve(true);
myservice.refresh(true);
});
}else{
result.resolve(false);
}
return result.promise;
};
if(config.refresh){
$interval(function () {
myservice.refresh(true);
}, config.refresh);
}
return myservice;
});