From 8685471e62eeb64387c664e3935f251ec79960a6 Mon Sep 17 00:00:00 2001 From: CupCakeArmy <nicco.borgioli@gmail.com> Date: Sat, 2 Apr 2016 13:09:42 +0200 Subject: [PATCH] A whole night of coding.... final result of the JS Library for accessing the API --- admin/lib/amiv/amivcore.js | 303 +++++++++++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 admin/lib/amiv/amivcore.js diff --git a/admin/lib/amiv/amivcore.js b/admin/lib/amiv/amivcore.js new file mode 100644 index 0000000..7d1a209 --- /dev/null +++ b/admin/lib/amiv/amivcore.js @@ -0,0 +1,303 @@ +(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', + spec_url: 'lib/amiv/spec.json', + authenticated: false, + ready: false, + req_time_out: 5000, + on_interval: 100, + 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; + checkAuth(); + }); + } else { + core.lib.authenticated = false; + core.lib.ready = true; + checkAuth(); + } + } + + // 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); -- GitLab