freifunkmanager/public/components/store.js

157 lines
4.8 KiB
JavaScript

'use strict';
angular.module('ffhb')
.factory('store', function($state, $q, $http, $rootScope,config,$interval,storage,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 = {}, autorefresher;
myservice._initialized = false;
myservice._data = storage.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.merged[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);
}
storage.set('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],
obj = {
'hostname':node.nodeinfo.hostname,
'owner':node.nodeinfo.owner.contact||'',
'location': {},
'wireless': {}
};
if(node.nodeinfo.location){
obj.location = {
'latitude': node.nodeinfo.location.latitude||0,
'longitude': node.nodeinfo.location.longitude||0
};
}
if(node.nodeinfo.wireless){
obj.wireless = {
'channel24': parseInt(node.nodeinfo.wireless.channel24)||0,
'channel5': parseInt(node.nodeinfo.wireless.channel5)||0,
'txpower24': parseInt(node.nodeinfo.wireless.txpower24)||0,
'txpower5': parseInt(node.nodeinfo.wireless.txpower5)||0
};
}
$http.post(config.api+'/aliases/alias/'+nodeid,obj).then(function(){
result.resolve(true);
myservice.refresh(true);
},function(){
$rootScope.globals.passphrase = '';
});
}else{
result.resolve(false);
}
return result.promise;
};
myservice.autorefresh = function(time){
if(autorefresher !== undefined){
autorefresher.cancel();
}
if(time){
autorefresher = $interval(function () {
myservice.refresh(true);
}, time);
}
};
return myservice;
});