diff --git a/admin/lib/amiv/amivcore.js b/admin/lib/amiv/amivcore.js index 43633f82f9b714e6e2340787f26fe3addefa1914..2a3701047655a3a6a1341c72d53cd1d5b8b3fbf7 100644 --- a/admin/lib/amiv/amivcore.js +++ b/admin/lib/amiv/amivcore.js @@ -1,311 +1,357 @@ -(function(window) { - 'use strict'; - // Library NameSpace - var lns = 'amivcore' - - function libgen() { - // Lib to returned - var lib = {}; - - // Core - var core = { - // Important vars n' stuff - lib: { - //api_url: 'https://amiv-apidev.vsos.ethz.ch', - api_url: 'https://nicco.io/amiv', - spec_url: 'lib/amiv/spec.json', - //spec_url: 'https://nicco.io/amiv/docs/spec.json', - authenticated: false, - ready: false, - req_time_out: 5000, - on_interval: 100, - auth_interval: 5000, - auth_allowed_fails: 5, - auth_fails: 0, - show_errors: false, - }, - // Header Setup - header: { - req: { - 'get': ['Content-Type', 'Authorization'], - 'post': ['Content-Type', 'Authorization'], - 'put': ['Content-Type', 'Authorization', 'If-Match'], - 'patch': ['Content-Type', 'Authorization', 'If-Match'], - 'delete': ['Content-Type', 'Authorization', 'If-Match'], - }, - make: { - 'Content-Type': function() { - return 'application/json' - }, - 'Authorization': function() { - if (get('cur_token') != null) - return 'Basic ' + btoa(get('cur_token') + ':'); - return ''; - }, - 'If-Match': function() { - return null; - } - } - } - } - - // Utility empty function for no callback - function dummy() {}; - - //Save and get into localStorage - function set(cname, cvalue, exdays) { - window.localStorage.setItem('glob-' + cname, cvalue); - } - - function get(cname) { - return window.localStorage.getItem('glob-' + cname); - } - - // Make Request - function req(attr, callback) { - callback = callback || function(msg) { - console.log(msg); - }; - $.ajax({ - url: core.lib.api_url + attr.path, - data: attr.data, - method: attr.method, - dataType: 'json', - timeout: core.lib.req_time_out, - headers: attr.headers, - error: function(res) { - if (core.lib.show_errors) console.log(res); - callback(res); - }, - }).done(function(res) { - callback(res); - }); - } - - function makeFunc(domain, m) { - return function(attr, callback) { - attr = attr || {}; - var curLib = {} - for (var curAttr in attr['data']) - curLib[curAttr] = attr['data'][curAttr]; - - var hdr = {}; - for (var curHdr in attr['header']) - hdr[curHdr] = attr['header'][curHdr]; - - var curPath = '/' + domain; - var curLink = curPath; - if (attr['id'] != undefined) { - curPath += '/' + attr['id']; - curLink += '/{_id}'; - } - - if (get('cur_token') != null) - hdr['Authorization'] = 'Basic ' + btoa(get('cur_token') + ':'); - - if (m != 'GET') { - if (m == 'POST' || m == 'PUT') - for (var param in lib[domain]['methods'][m][curLink]['params']) - if (lib[domain]['methods'][m][curLink]['params'][param]['required'] == true) - if (curLib[lib[domain]['methods'][m][curLink]['params'][param]['name']] == undefined) - return 'Error: Missing ' + lib[domain]['methods'][m][curLink]['params'][param]['name']; - hdr['Content-Type'] = 'application/json'; - curLib = JSON.stringify(curLib); - } - req({ - path: curPath, - method: m, - data: curLib, - headers: hdr, - }, callback); - return true; - }; - } - - $.ajax({ - url: core.lib.spec_url, - dataType: 'json', - timeout: 5000, - success: function(d) { - var data = d['domains']; - for (var domain in data) { - lib[domain] = {}; - lib[domain].methods = []; - for (var p in data[domain]['paths']) { - for (var m in data[domain]['paths'][p]) { - if (lib[domain].methods[m] == undefined) lib[domain].methods[m] = {}; - lib[domain].methods[m][p] = data[domain]['paths'][p][m]; - } - } - for (var m in lib[domain]['methods']) { - lib[domain][m] = makeFunc(domain, m); - } - } - checkAuth(); - }, - error: function(d) { - console.log('Cannot reach initialization spec: ' + core.lib.spec_url); - console.log(d); - } - }); - - function checkAuth() { - if (get('cur_token') != null) { - lib.sessions.GET({ - data: { - where: 'token==["' + get('cur_token') + '"]' - } - }, function(res) { - if (res !== undefined && res.hasOwnProperty('_items') && res['_items'].length > 0) - core.lib.authenticated = true; - else - core.lib.authenticated = false; - core.lib.ready = true; - setTimeout(checkAuth, core.lib.auth_interval); - }); - } else { - core.lib.authenticated = false; - core.lib.ready = true; - setTimeout(checkAuth, core.lib.auth_interval); - } - } - - // Get the etag - lib.getEtag = function(curDomain, curId, callback) { - return lib[curDomain].GET({ - id: curId - }, function(res) { - callback(res['_etag']); - }); - } - - // Returns whether user is logged in - lib.authenticated = function() { - return core.lib.authenticated; - } - - // Login function - lib.login = function(curUser, curPass, callback) { - callback = callback || dummy; - req({ - path: '/sessions/', - method: 'POST', - data: JSON.stringify({ - user: curUser.toLowerCase(), - password: curPass - }), - headers: { - 'Content-Type': 'application/json', - }, - }, function(msg) { - var reqVar = ['token', 'user_id', 'id']; - for (var i in reqVar) { - lib['cur_' + reqVar[i]] = msg[reqVar[i]]; - } - if (msg['_status'] == 'OK') { - set('cur_token_id', msg['id'], 1); - set('cur_token', msg['token'], 1); - set('cur_user_id', parseInt(msg['user_id']), 1); - callback(true); - } else { - set('cur_token_id', null); - set('cur_token', null); - set('cur_user_id', null); - callback(false); - } - }); - } - - // Logout - lib.logout = function() { - // Deleting token from api and unsetting the vars - lib.sessions.DELETE({ - id: get('cur_token_id') - }, function(res) { - set('cur_token', null); - set('cur_token_id', null); - set('cur_user_id', null); - }); - } - - // Get info about the current user - lib.user = function(attr, callback) { - callback = callback || dummy; - lib.users.GET({ - id: get('cur_user_id') - }, function(res) { - if (typeof attr === 'object') { - var ret = {}; - for (var key in attr) - ret[attr[key]] = res[attr[key]]; - callback(ret); - } else { - callback(res[attr]); - } - }); - } - - // Get the necessary field for specific requests - lib.getRequiredFields = function(domain, type, wId) { - var curTree; - var resAttr = {}; - if (wId) - curTree = lib[domain]['methods'][type]['/' + domain + '/{_id}']['params']; - else - curTree = lib[domain]['methods'][type]['/' + domain]['params']; - if (curTree.length == 0) return false; - else { - for (var i = 0; i < curTree.length; i++) - if (curTree[i].required == true) - resAttr[curTree[i].name] = curTree[i]; - } - return resAttr; - } - - //On function - lib.on = function(trigger, callback) { - if (callback) { - lib.on_mem[trigger].callback = callback; - lib.on_mem[trigger].func(); - } - } - lib.on_mem = { - ready: { - func: function() { - if (core.lib.ready) - lib.on_mem.ready.callback(); - else setTimeout(function() { - lib.on_mem.ready.func(); - }, core.lib.on_interval); - } - }, - login: { - func: function() { - if (core.lib.authenticated && !lib.on_mem.login.prev) - lib.on_mem.login.callback(); - lib.on_mem.login.prev = core.lib.authenticated; - setTimeout(lib.on_mem.login.func, core.lib.on_interval); - }, - prev: false, - }, - logout: { - func: function() { - if (!core.lib.authenticated && lib.on_mem.logout.prev) - lib.on_mem.logout.callback(); - lib.on_mem.logout.prev = core.lib.authenticated; - setTimeout(lib.on_mem.logout.func, core.lib.on_interval); - }, - prev: false, - }, - } - - return lib; - } - - if (typeof(window[lns]) === 'undefined') { - window[lns] = libgen(); - } else { - console.log(lns + ' already defined, please solve conflict'); - } - -})(window); +(function(window) { + 'use strict'; + // Library NameSpace + var lns = 'amivcore' + + function libgen() { + // Lib to returned + var lib = {}; + + // Core + var core = { + // Important vars n' stuff + lib: { + //api_url: 'https://amiv-apidev.vsos.ethz.ch', + api_url: 'https://nicco.io/amiv', + spec_url: 'lib/amiv/spec.json', + //spec_url: 'https://nicco.io/amiv/docs/spec.json', + authenticated: false, + ready: false, + req_time_out: 5000, + on_interval: 100, + auth_interval: 5000, + auth_allowed_fails: 5, + auth_fails: 0, + show_errors: false, + }, + // Header Setup + header: { + req: { + 'get': ['Content-Type', 'Authorization'], + 'post': ['Content-Type', 'Authorization'], + 'put': ['Content-Type', 'Authorization', 'If-Match'], + 'patch': ['Content-Type', 'Authorization', 'If-Match'], + 'delete': ['Content-Type', 'Authorization', 'If-Match'], + }, + make: { + 'Content-Type': function() { + return 'application/json' + }, + 'Authorization': function() { + if (get('cur_token') != null) + return 'Basic ' + btoa(get('cur_token') + ':'); + return ''; + }, + 'If-Match': function() { + return null; + } + } + }, + adapter: { + 'none': function(ret) { + return ret; + }, + 'string': function(strg) { + return String(strg); + }, + 'integer': function(int) { + return parseInt(int); + }, + 'boolean': function(bool) { + return (String(bool).trim().toLowerCase() == 'true' || bool === true || bool === 1) + }, + 'datetime': function(dt) { + var tmp = new Date(dt); + return new Date(dt).toJSON(); + } + } + } + + // Utility empty function for no callback + function dummy() {}; + + //Save and get into localStorage + function set(cname, cvalue, exdays) { + window.localStorage.setItem('glob-' + cname, cvalue); + } + + function get(cname) { + return window.localStorage.getItem('glob-' + cname); + } + + // Make Request + function req(attr, callback) { + callback = callback || function(msg) { + console.log(msg); + }; + $.ajax({ + url: core.lib.api_url + attr.path, + data: attr.data, + method: attr.method, + dataType: 'json', + timeout: core.lib.req_time_out, + headers: attr.headers, + error: function(res) { + if (core.lib.show_errors) console.log(res); + callback(res); + }, + }).done(function(res) { + callback(res); + }); + } + + function makeFunc(domain, m) { + return function(attr, callback) { + attr = attr || {}; + var curLib = {} + for (var curAttr in attr['data']) { + var curAttrType = lib.getParamType(domain, curAttr); + if (core.adapter.hasOwnProperty(curAttrType)) + curLib[curAttr] = core.adapter[lib.getParamType(domain, curAttr)](attr['data'][curAttr]); + else + curLib[curAttr] = attr['data'][curAttr]; + } + //curLib[curAttr] = attr['data'][curAttr]; + + var hdr = {}; + for (var curHdr in attr['header']) + hdr[curHdr] = attr['header'][curHdr]; + + var curPath = '/' + domain; + var curLink = curPath; + if (attr['id'] != undefined) { + curPath += '/' + attr['id']; + curLink += '/{_id}'; + } + + if (get('cur_token') != null) + hdr['Authorization'] = 'Basic ' + btoa(get('cur_token') + ':'); + + if (m != 'GET') { + if (m == 'POST' || m == 'PUT') + for (var param in lib[domain]['methods'][m][curLink]['params']) + if (lib[domain]['methods'][m][curLink]['params'][param]['required'] == true) + if (curLib[lib[domain]['methods'][m][curLink]['params'][param]['name']] == undefined) + return 'Error: Missing ' + lib[domain]['methods'][m][curLink]['params'][param]['name']; + hdr['Content-Type'] = 'application/json'; + curLib = JSON.stringify(curLib); + } + req({ + path: curPath, + method: m, + data: curLib, + headers: hdr, + }, callback); + return true; + }; + } + + $.ajax({ + url: core.lib.spec_url, + dataType: 'json', + timeout: 5000, + success: function(d) { + var data = d['domains']; + for (var domain in data) { + lib[domain] = {}; + lib[domain].methods = []; + for (var p in data[domain]['paths']) { + for (var m in data[domain]['paths'][p]) { + if (lib[domain].methods[m] == undefined) lib[domain].methods[m] = {}; + lib[domain].methods[m][p] = data[domain]['paths'][p][m]; + } + } + for (var m in lib[domain]['methods']) { + lib[domain][m] = makeFunc(domain, m); + } + } + checkAuth(); + }, + error: function(d) { + console.log('Cannot reach initialization spec: ' + core.lib.spec_url); + console.log(d); + } + }); + + function checkAuth(exec_once) { + exec_once = exec_once || false; + if (get('cur_token') != null) { + lib.sessions.GET({ + data: { + where: 'token==["' + get('cur_token') + '"]' + } + }, function(res) { + if (res !== undefined && res.hasOwnProperty('_items') && res['_items'].length > 0) { + core.lib.authenticated = true; + core.lib.auth_fails = 0; + } else { + core.lib.auth_allowed_fails++; + if (core.lib.auth_fails > core.lib.auth_allowed_fails) + core.lib.authenticated = false; + } + core.lib.ready = true; + if (!exec_once) + setTimeout(checkAuth, core.lib.auth_interval); + }); + } else { + core.lib.authenticated = false; + core.lib.ready = true; + if (!exec_once) + setTimeout(checkAuth, core.lib.auth_interval); + } + } + + // Get parameter type + lib.getParamType = function(dom, param) { + var tmp = 'none'; + try { + if (Array.isArray(lib[dom].methods.POST['/' + dom].params)) + lib[dom].methods.POST['/' + dom].params.forEach(function(cur) { + if (cur.name == param) { + tmp = cur.type; + } + }); + + } catch (e) {} + return tmp; + } + + // Get the etag + lib.getEtag = function(curDomain, curId, callback) { + return lib[curDomain].GET({ + id: curId + }, function(res) { + callback(res['_etag']); + }); + } + + // Returns whether user is logged in + lib.authenticated = function() { + return core.lib.authenticated; + } + + // Login function + lib.login = function(curUser, curPass, callback) { + callback = callback || dummy; + req({ + path: '/sessions/', + method: 'POST', + data: JSON.stringify({ + user: curUser.toLowerCase(), + password: curPass + }), + headers: { + 'Content-Type': 'application/json', + }, + }, function(msg) { + var reqVar = ['token', 'user_id', 'id']; + for (var i in reqVar) { + lib['cur_' + reqVar[i]] = msg[reqVar[i]]; + } + if (msg['_status'] == 'OK') { + set('cur_token_id', msg['id'], 1); + set('cur_token', msg['token'], 1); + set('cur_user_id', parseInt(msg['user_id']), 1); + callback(true); + } else { + set('cur_token_id', null); + set('cur_token', null); + set('cur_user_id', null); + callback(false); + } + }); + } + + // Logout + lib.logout = function() { + // Deleting token from api and unsetting the vars + lib.sessions.DELETE({ + id: get('cur_token_id') + }, function(res) { + set('cur_token', null); + set('cur_token_id', null); + set('cur_user_id', null); + }); + } + + // Get info about the current user + lib.user = function(attr, callback) { + callback = callback || dummy; + lib.users.GET({ + id: get('cur_user_id') + }, function(res) { + if (typeof attr === 'object') { + var ret = {}; + for (var key in attr) + ret[attr[key]] = res[attr[key]]; + callback(ret); + } else { + callback(res[attr]); + } + }); + } + + // Get the necessary field for specific requests + lib.getRequiredFields = function(domain, type, wId) { + var curTree; + var resAttr = {}; + if (wId) + curTree = lib[domain]['methods'][type]['/' + domain + '/{_id}']['params']; + else + curTree = lib[domain]['methods'][type]['/' + domain]['params']; + if (curTree.length == 0) return false; + else { + for (var i = 0; i < curTree.length; i++) + if (curTree[i].required == true) + resAttr[curTree[i].name] = curTree[i]; + } + return resAttr; + } + + //On function + lib.on = function(trigger, callback) { + if (callback) { + lib.on_mem[trigger].callback = callback; + lib.on_mem[trigger].func(); + } + } + lib.on_mem = { + ready: { + func: function() { + if (core.lib.ready) + lib.on_mem.ready.callback(); + else setTimeout(function() { + lib.on_mem.ready.func(); + }, core.lib.on_interval); + } + }, + login: { + func: function() { + if (core.lib.authenticated && !lib.on_mem.login.prev) + lib.on_mem.login.callback(); + lib.on_mem.login.prev = core.lib.authenticated; + setTimeout(lib.on_mem.login.func, core.lib.on_interval); + }, + prev: false, + }, + logout: { + func: function() { + if (!core.lib.authenticated && lib.on_mem.logout.prev) + lib.on_mem.logout.callback(); + lib.on_mem.logout.prev = core.lib.authenticated; + setTimeout(lib.on_mem.logout.func, core.lib.on_interval); + }, + prev: false, + }, + } + + return lib; + } + + if (typeof(window[lns]) === 'undefined') { + window[lns] = libgen(); + } else { + console.log(lns + ' already defined, please solve conflict'); + } + +})(window);