diff --git a/index.html b/index.html index 0a9e75a08b40600657929c65da5543e45bf24635..0827856b20d78d5cd42a48b12a1bff730647ccd8 100644 --- a/index.html +++ b/index.html @@ -30,6 +30,11 @@ <script src="lib/jquery/jquery-2.2.2.min.js"></script> <script src="lib/bootstrap/js/bootstrap.min.js"></script> + <script> + // set the api url for the amivcore js library + var api_url_config = "https://amiv-apidev.vsos.ethz.ch"; + var spec_url_config = "lib/amiv/spec.json"; + </script> <script src="lib/amiv/amivcore.js"></script> <script src="lib/cust/main.js"></script> diff --git a/lib/amiv/amivcore.js b/lib/amiv/amivcore.js index 019d539f3aa29c9b4a13b11c7651b7cc250ad94e..453ad2e943e15195839412227441f764063e74e7 100644 --- a/lib/amiv/amivcore.js +++ b/lib/amiv/amivcore.js @@ -1,359 +1,452 @@ -(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: 'http://192.168.1.100', - 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).toISOString().split('.')[0]+"Z"; - } - } - } - - // 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({ - username: 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); - checkAuth(); - 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); - checkAuth(); - }); - } - - // 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: api_url_config, + spec_url: spec_url_config, + 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'], + '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); + // send an iso string without the milis, thats what the api expects + return new Date(dt).toISOString().split('.')[0]+"Z"; + } + } + } + + /** + * Utility empty function for no callback + * @constructor + */ + function dummy() {}; + + /** + * Save and get into localStorage + * @constructor + * @param {string} cname + * @param {string} cvalue + */ + function set(cname, cvalue, exdays) { + window.localStorage.setItem('glob-' + cname, cvalue); + } + + /** + * Get from LocalStorage + * @constructor + * @param {string} cname + */ + function get(cname) { + return window.localStorage.getItem('glob-' + cname); + } + + /** + * Remove variable in localStorage + * @param {string} cname + */ + function remove(cname) { + if (window.localStorage.getItem('gloc-' + cname) === null) + window.localStorage.removeItem('glob-' + cname); + } + + /** + * Make general request with all request parameters in attr + * @constructor + * @param {} attr - all request parameters (attr.path, attr.data, attr.method ...) + * @param {} callback + */ + function req(attr, callback) { + callback = callback || function(msg) { + console.log(msg); + }; + // put the json object into form-data + var form = new FormData(); + console.log(attr); + for (var key in attr['data']) + form.append(key, attr['data'][key]); + $.ajax({ + url: core.lib.api_url + attr.path, + data: form, + method: attr.method, + dataType: "json", + contentType: false, + processData: false, + 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); + }); + } + + /** + * Make Function + * @constructor + * @param {string} domain + * @param {string} m - method + */ + function makeFunc(domain, m) { + return function(attr, callback) { + attr = attr || {}; // if attr does not exist use empty object + 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; + }; + } + + /** + * Read spec.json and set all needed parameters + * @constructor + */ + $.ajax({ + url: core.lib.spec_url, + dataType: 'json', + timeout: core.lib.req_time_out, + 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.error(d); + } + }); + + /** + * Check Authentication + * @constructor + * @param {} exec_once + */ + 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 + * @constructor + * @param {string} dom + * @param {string} param + * @example + * // returns type of field "_id" of resource "users" + * amivcore.getParamType("users", "_id") + */ + 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 + * @constructor + * @param {} curDomain + * @param {} curId + * @param {} callback + * @example + * amivcore.getEtag("users", amivcore.cur_user, function(res) { + * console.log(res); + * }); + */ + lib.getEtag = function(curDomain, curId, callback) { + return lib[curDomain].GET({ + id: curId + }, function(res) { + callback(res['_etag']); + }); + } + + /** + * Returns whether user is logged in + * @constructor + */ + lib.authenticated = function() { + return core.lib.authenticated; + } + + /** + * Login function + * @constructor + * @param {} curUser + * @param {} curPass + * @param {} callback + */ + lib.login = function(curUser, curPass, callback) { + callback = callback || dummy; + req({ + path: '/sessions/', + method: 'POST', + data: JSON.stringify({ + username: curUser.toLowerCase(), + password: curPass + }), + headers: { + 'Content-Type': 'application/json', + }, + }, function(msg) { + var reqVar = ['token', 'user', '_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', msg['user'], 1); + callback(true); + } else { + remove('cur_token_id'); + remove('cur_token'); + remove('cur_user_id'); + callback(false); + } + }); + } + + /** + * Logout + * @constructor + */ + lib.logout = function() { + // Deleting token from api and unsetting the vars + lib.sessions.DELETE({ + id: get('cur_token_id') + }, function(res) { + remove('cur_token'); + remove('cur_token_id'); + remove('cur_user_id'); + }); + } + + /** + * Get info about the current user + * @constructor + * @param {} attr + * @param {} callback + */ + 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 + * @constructor + * @param {} domain - resource eg. "/users" + * @param {} type - HTTP request type eg. "PATCH" + * @param {boolean} wId - with id eg. "/users/$id" + * @example + * amivcore.getRequiredFields("users", "POST", false) + */ + 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 + * @constructor + * @param {} trigger + * @param {} callback + */ + 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); diff --git a/lib/amiv/spec.json b/lib/amiv/spec.json index 1191dc5d833a0f85be463a5fe6344d8cba281d9c..bed55ec1efa28010914e5692c9dffb6d447a070f 100644 --- a/lib/amiv/spec.json +++ b/lib/amiv/spec.json @@ -1,1797 +1,1890 @@ - { - "api_name": "API", +{ "domains": { - "events": { + "purchases": { "paths": { - "/events/{_id}": { - "DELETE": { - "label": "Delete a Event", + "/purchases": { + "POST": { "params": [ { - "type": "string", + "unique": false, + "name": "timestamp", + "nullable": false, + "required": true, + "type": "datetime" + }, + { + "not_patchable_unless_admin": true, + "name": "product", + "nullable": false, "required": true, + "allowed": [ + "beer", + "coffee" + ], + "unique": false, + "type": "string", + "maxlength": 6 + }, + { + "required": false, + "type": "objectid", "name": "_id" + }, + { + "name": "user", + "nullable": false, + "required": true, + "data_relation": { + "field": "_id", + "resource": "users", + "embeddable": true + }, + "unique": false, + "type": "objectid" } - ] + ], + "label": "Create a Purchase" }, "GET": { - "label": "Retrieve a Event", + "params": [], + "label": "Retrieve all purchases" + } + }, + "/purchases/{_id}": { + "GET": { "params": [ { - "type": "string", "required": true, + "type": "string", "name": "_id" } - ] - }, + ], + "label": "Retrieve a Purchase" + } + } + }, + "description": { + "fields": {}, + "general": "A beer machine or kaffi machine transaction. Users should be able to get beer or kaffi, if their last timestamp is older than one day and they are AMIV members. This resource is used to log their purchases." + } + }, + "users": { + "paths": { + "/users/{_id}": { "PATCH": { - "label": "Update a Event", "params": [ { - "type": "string", "required": true, + "type": "string", "name": "_id" }, { + "not_patchable_unless_admin": true, + "name": "legi", "nullable": true, - "maxlength": 500, - "type": "string", "required": false, - "name": "catchphrase_de" + "maxlength": 8, + "unique": true, + "type": "string" }, { - "nullable": true, - "maxlength": 500, - "type": "string", "required": false, - "name": "catchphrase_en" + "type": "objectid", + "name": "_id" }, { - "nullable": true, + "not_patchable_unless_admin": true, + "name": "firstname", + "nullable": false, + "required": true, "maxlength": 50, "type": "string", - "required": false, - "name": "location" + "empty": false + }, + { + "not_patchable_unless_admin": true, + "name": "lastname", + "nullable": false, + "required": true, + "maxlength": 50, + "type": "string", + "empty": false }, { + "name": "rfid", "nullable": true, "required": false, - "later_than": "time_start", - "dependencies": [ - "time_start" - ], - "name": "time_end", - "type": "datetime" + "maxlength": 6, + "unique": true, + "type": "string", + "empty": false }, { - "readonly": true, - "type": "integer", + "nullable": true, + "name": "phone", + "maxlength": 20, "required": false, - "name": "signup_count" + "type": "string", + "empty": false }, { - "nullable": false, - "type": "boolean", + "not_patchable_unless_admin": true, + "name": "membership", "required": true, - "name": "show_announce" + "allowed": [ + "none", + "regular", + "extraordinary", + "honorary" + ], + "unique": false, + "type": "string", + "maxlength": 13 }, { - "nullable": false, - "type": "boolean", - "required": true, - "name": "show_infoscreen" + "not_patchable_unless_admin": true, + "name": "nethz", + "nullable": true, + "default": null, + "required": false, + "maxlength": 30, + "unique": true, + "type": "string", + "empty": false }, { - "nullable": true, - "type": "integer", + "not_patchable_unless_admin": true, + "name": "gender", "required": true, - "min": 0, - "requires_if_not_null": [ - "time_register_start", - "time_register_end", - "allow_email_signup" + "allowed": [ + "male", + "female" ], - "name": "spots" + "unique": false, + "type": "string", + "maxlength": 6 }, { "nullable": true, - "maxlength": 100, - "required": false, - "dependencies": [ - "catchphrase_de", - "description_de" + "not_patchable_unless_admin": true, + "name": "department", + "allowed": [ + "itet", + "mavt" ], - "name": "title_de", + "required": false, "type": "string" }, { + "name": "password", "nullable": true, - "maxlength": 100, + "default": null, "required": false, - "dependencies": [ - "catchphrase_en", - "description_en" - ], - "name": "title_en", - "type": "string" + "maxlength": 100, + "type": "string", + "empty": false }, { - "type": "media", - "required": false, - "filetype": [ - "png", - "jpeg" - ], - "name": "img_poster" + "regex": "^.+@.+$", + "name": "email", + "required": true, + "maxlength": 100, + "unique": true, + "type": "string" }, { - "nullable": true, - "min": 0, - "type": "integer", "required": false, - "name": "price" - }, + "type": "boolean", + "name": "send_newsletter", + "nullable": true + } + ], + "label": "Update a User" + }, + "DELETE": { + "params": [ { - "nullable": true, - "maxlength": 10000, + "required": true, "type": "string", - "required": false, - "name": "description_de" - }, + "name": "_id" + } + ], + "label": "Delete a User" + }, + "GET": { + "params": [ { - "type": "media", + "required": true, + "type": "string", + "name": "_id" + } + ], + "label": "Retrieve a User" + } + }, + "/users/{nethz}": { + "GET": { + "params": [ + { + "not_patchable_unless_admin": true, + "name": "nethz", + "nullable": true, + "default": null, "required": false, - "filetype": [ - "png", - "jpeg" - ], - "name": "img_banner" - }, + "maxlength": 30, + "unique": true, + "type": "string", + "empty": false + } + ], + "label": "Retrieve a User" + } + }, + "/users": { + "POST": { + "params": [ { - "type": "media", + "not_patchable_unless_admin": true, + "name": "legi", + "nullable": true, "required": false, - "filetype": [ - "png", - "jpeg" - ], - "name": "img_thumbnail" + "maxlength": 8, + "unique": true, + "type": "string" }, { - "type": "objectid", "required": false, + "type": "objectid", "name": "_id" }, { + "not_patchable_unless_admin": true, + "name": "firstname", "nullable": false, - "depends_any": [ - "title_de", - "title_en" - ], "required": true, - "name": "show_website", - "type": "boolean" + "maxlength": 50, + "type": "string", + "empty": false }, { - "nullable": true, - "only_if_not_null": "spots", - "type": "json_schema", - "required": false, - "name": "additional_fields" + "not_patchable_unless_admin": true, + "name": "lastname", + "nullable": false, + "required": true, + "maxlength": 50, + "type": "string", + "empty": false }, { + "name": "rfid", "nullable": true, - "type": "datetime", "required": false, - "name": "time_start" + "maxlength": 6, + "unique": true, + "type": "string", + "empty": false }, { "nullable": true, - "type": "datetime", + "name": "phone", + "maxlength": 20, "required": false, - "name": "time_register_start" + "type": "string", + "empty": false }, - { - "nullable": true, - "type": "datetime", - "required": false, - "name": "time_advertising_start" + "not_patchable_unless_admin": true, + "name": "membership", + "required": true, + "allowed": [ + "none", + "regular", + "extraordinary", + "honorary" + ], + "unique": false, + "type": "string", + "maxlength": 13 }, { + "not_patchable_unless_admin": true, + "name": "nethz", "nullable": true, - "type": "datetime", + "default": null, "required": false, - "name": "time_advertising_end" + "maxlength": 30, + "unique": true, + "type": "string", + "empty": false }, - - { - "nullable": true, - "maxlength": 10000, + "not_patchable_unless_admin": true, + "name": "gender", + "required": true, + "allowed": [ + "male", + "female" + ], + "unique": false, "type": "string", - "required": false, - "name": "description_en" + "maxlength": 6 }, { - "nullable": false, - "type": "boolean", + "nullable": true, + "not_patchable_unless_admin": true, + "name": "department", + "allowed": [ + "itet", + "mavt" + ], "required": false, - "name": "allow_email_signup" + "type": "string" }, { + "name": "password", "nullable": true, + "default": null, "required": false, - "later_than": "time_register_start", - "dependencies": [ - "time_register_start" - ], - "name": "time_register_end", - "type": "datetime" + "maxlength": 100, + "type": "string", + "empty": false + }, + { + "regex": "^.+@.+$", + "name": "email", + "required": true, + "maxlength": 100, + "unique": true, + "type": "string" }, { - "type": "media", "required": false, - "filetype": [ - "png", - "jpeg" - ], - "name": "img_infoscreen" + "type": "boolean", + "name": "send_newsletter", + "nullable": true } - ] + ], + "label": "Create a User" + }, + "GET": { + "params": [], + "label": "Retrieve all users" } + } + }, + "description": { + "methods": { + "GET": "Authorization is required for most of the fields" }, - "/events": { - "GET": { - "label": "Retrieve all events", - "params": [] + "general": "In general, the user data will be generated from LDAP-Data. However, one might change the RFID-Number or the membership-status. Extraordinary members may not have a LDAP-Account and can therefore access all given fields." + } + }, + "sessions": { + "paths": { + "/sessions/{_id}": { + "DELETE": { + "params": [ + { + "required": true, + "type": "string", + "name": "_id" + } + ], + "label": "Delete a Session" }, + "GET": { + "params": [ + { + "required": true, + "type": "string", + "name": "_id" + } + ], + "label": "Retrieve a Session" + } + }, + "/sessions": { "POST": { - "label": "Create a Event", "params": [ { - "nullable": true, - "maxlength": 500, + "name": "username", + "nullable": false, + "required": true, "type": "string", - "required": false, - "name": "catchphrase_de" + "empty": false }, { - "nullable": true, - "maxlength": 500, - "type": "string", + "readonly": true, "required": false, - "name": "catchphrase_en" + "type": "string", + "name": "token" }, { - "nullable": true, - "maxlength": 50, + "name": "password", + "nullable": false, + "required": true, "type": "string", - "required": false, - "name": "location" + "empty": false }, { - "nullable": true, + "readonly": true, + "name": "user", + "data_relation": { + "field": "_id", + "cascade_delete": true, + "resource": "users", + "embeddable": true + }, "required": false, - "later_than": "time_start", - "dependencies": [ - "time_start" - ], - "name": "time_end", - "type": "datetime" + "type": "objectid" }, { - "readonly": true, - "type": "integer", "required": false, - "name": "signup_count" - }, + "type": "objectid", + "name": "_id" + } + ], + "label": "Create a Session" + }, + "GET": { + "params": [], + "label": "Retrieve all sessions" + } + } + }, + "description": { + "methods": { + "POST": "Login and aquire a login token. Post the fields 'username' and 'password', the response will contain the token. 'username' can be either nethz, mail, or user_id", + "GET": "Check token(s)." + }, + "general": "A session is used to authenticate a user after he provided login data. A POST to /session will return a token you can use in an Authorization header: token <yourtoken>" + } + }, + "groupmemberships": { + "paths": { + "/groupmemberships": { + "POST": { + "params": [ { - "nullable": false, - "type": "boolean", - "required": true, - "name": "show_announce" + "required": false, + "type": "objectid", + "name": "_id" }, { - "nullable": false, - "type": "boolean", + "self_enrollment_required": true, + "name": "group", + "data_relation": { + "field": "_id", + "cascade_delete": true, + "resource": "groups", + "embeddable": true + }, "required": true, - "name": "show_infoscreen" + "type": "objectid" }, { - "nullable": true, - "type": "integer", - "required": true, - "min": 0, - "requires_if_not_null": [ - "time_register_start", - "time_register_end", - "allow_email_signup" + "name": "user", + "unique_combination": [ + "group" ], - "name": "spots" + "required": true, + "only_self_or_moderator": true, + "data_relation": { + "field": "_id", + "cascade_delete": true, + "resource": "users", + "embeddable": true + }, + "type": "objectid" }, - { - "nullable": true, - "type": "integer", "required": false, - "min": 0, - "max": 10, - "name": "priority" - }, - + "type": "datetime", + "name": "expiry" + } + ], + "label": "Create a Groupmembership" + }, + "GET": { + "params": [], + "label": "Retrieve all groupmemberships" + } + }, + "/groupmemberships/{_id}": { + "DELETE": { + "params": [ { - "nullable": true, - "maxlength": 100, - "required": false, - "dependencies": [ - "catchphrase_de", - "description_de" - ], + "required": true, + "type": "string", + "name": "_id" + } + ], + "label": "Delete a Groupmembership" + }, + "GET": { + "params": [ + { + "required": true, + "type": "string", + "name": "_id" + } + ], + "label": "Retrieve a Groupmembership" + } + } + }, + "description": { + "general": "Assignment of registered users to groups." + } + }, + "joboffers": { + "paths": { + "/joboffers": { + "POST": { + "params": [ + { + "dependencies": "description_de", "name": "title_de", + "required_if_not": "title_en", + "required": false, "type": "string" }, { - "nullable": true, - "maxlength": 100, "required": false, - "dependencies": [ - "catchphrase_en", - "description_en" - ], - "name": "title_en", - "type": "string" + "type": "objectid", + "name": "_id" }, { - "type": "media", "required": false, - "filetype": [ - "png", - "jpeg" - ], - "name": "img_poster" + "type": "string", + "name": "company", + "maxlength": 30 }, { - "nullable": true, - "min": 0, - "type": "integer", + "dependencies": "description_en", + "name": "title_en", + "required_if_not": "title_de", "required": false, - "name": "price" + "type": "string" }, { - "nullable": true, - "maxlength": 10000, - "type": "string", "required": false, - "name": "description_de" + "type": "datetime", + "name": "time_end" }, { - "type": "media", "required": false, + "type": "string", + "name": "description_en" + }, + { + "name": "logo", "filetype": [ "png", "jpeg" ], - "name": "img_banner" + "required": true, + "type": "media" }, { - "type": "media", + "default": false, "required": false, - "filetype": [ - "png", - "jpeg" - ], - "name": "img_thumbnail" + "type": "boolean", + "name": "show_website" }, { - "type": "objectid", "required": false, - "name": "_id" + "type": "string", + "name": "description_de" }, { - "nullable": false, - "depends_any": [ - "title_de", - "title_en" - ], + "name": "pdf", + "filetype": [ + "pdf" + ], "required": true, - "name": "show_website", - "type": "boolean" + "type": "media" + } + ], + "label": "Create a Joboffer" + }, + "GET": { + "params": [], + "label": "Retrieve all joboffers" + } + }, + "/joboffers/{_id}": { + "PATCH": { + "params": [ + { + "required": true, + "type": "string", + "name": "_id" }, { - "nullable": true, - "only_if_not_null": "spots", - "type": "json_schema", + "dependencies": "description_de", + "name": "title_de", + "required_if_not": "title_en", "required": false, - "name": "additional_fields" + "type": "string" }, { - "nullable": true, - "type": "datetime", "required": false, - "name": "time_start" + "type": "objectid", + "name": "_id" }, { - "nullable": true, - "type": "datetime", "required": false, - "name": "time_register_start" + "type": "string", + "name": "company", + "maxlength": 30 }, - - { - "nullable": true, - "type": "datetime", + "dependencies": "description_en", + "name": "title_en", + "required_if_not": "title_de", "required": false, - "name": "time_advertising_start" + "type": "string" }, { - "nullable": true, - "type": "datetime", "required": false, - "name": "time_advertising_end" + "type": "datetime", + "name": "time_end" }, - - { - "nullable": true, - "maxlength": 10000, - "type": "string", "required": false, + "type": "string", "name": "description_en" }, { - "nullable": false, - "type": "boolean", - "required": false, - "name": "allow_email_signup" + "name": "logo", + "filetype": [ + "png", + "jpeg" + ], + "required": true, + "type": "media" }, { - "nullable": true, + "default": false, "required": false, - "later_than": "time_register_start", - "dependencies": [ - "time_register_start" - ], - "name": "time_register_end", - "type": "datetime" + "type": "boolean", + "name": "show_website" }, { - "type": "media", "required": false, + "type": "string", + "name": "description_de" + }, + { + "name": "pdf", "filetype": [ - "png", - "jpeg" + "pdf" ], - "name": "img_infoscreen" + "required": true, + "type": "media" + } + ], + "label": "Update a Joboffer" + }, + "DELETE": { + "params": [ + { + "required": true, + "type": "string", + "name": "_id" + } + ], + "label": "Delete a Joboffer" + }, + "GET": { + "params": [ + { + "required": true, + "type": "string", + "name": "_id" } - ] + ], + "label": "Retrieve a Joboffer" } } }, "description": { - "fields": { - "additional_fields": "must be provided in form of a JSON-Schema. You can add here fields you want to know from people signing up going further than their email-address", - "spots": "For no limit, set to '0'. If no signup required, set to '-1'. Otherwise just provide an integer.", - "allow_email_signup": "If False, only AMIV-Members can sign up for this event", - "price": "Price of the event as Integer in Rappen." - }, - "methods": { - "GET": "You are always allowed, even without session, to view AMIV-Events" - }, - "general": "An Event is basically everything happening in the AMIV. All time fields have the format YYYY-MM-DDThh:mmZ, e.g. 2014-12-20T11:50:06Z" + "fields": {}, + "general": "A Job Offer posts repositoryUsers can post a job offer with the necessarycontent to fill out a job offer advertisement" } }, - "groups": { + "eventsignups": { "paths": { - "/groups": { - "GET": { - "label": "Retrieve all groups", - "params": [] - }, - "POST": { - "label": "Create a Group", + "/eventsignups/{_id}": { + "PATCH": { "params": [ { - "type": "list", - "required": false, - "unique_elements": true, - "schema": { - "regex": "^.+@.+$", - "maxlength": 100, - "type": "string" - }, - "name": "forward_to" + "required": true, + "type": "string", + "name": "_id" }, { - "nullable": true, - "propertyschema": { - "api_resources": true, - "type": "string" - }, - "valueschema": { - "allowed": [ - "read", - "readwrite" - ], - "type": "string" - }, "required": false, - "name": "permissions", - "type": "dict" + "type": "json_event_field", + "name": "additional_fields", + "nullable": true }, { - "type": "objectid", + "readonly": true, + "name": "confirmed", + "nullable": true, "required": false, - "name": "_id" + "type": "boolean" }, { - "nullable": true, - "type": "objectid", - "required": false, + "signup_requirements": true, + "name": "event", + "unique_combination": [ + "user", + "email" + ], + "required": true, + "not_patchable": true, "data_relation": { "field": "_id", - "resource": "users" + "resource": "events", + "embeddable": true }, - "name": "moderator" + "type": "objectid" }, { - "unique_elements_for_resource": true, + "name": "user", + "nullable": false, "required": false, - "name": "receive_from", - "unique_elements": true, - "schema": { - "regex": "[a-z0-9_\\.-]+", - "maxlength": 100, - "type": "string" + "not_patchable": true, + "data_relation": { + "field": "_id", + "resource": "users", + "embeddable": true }, - "type": "list" + "only_self_enrollment_for_event": true, + "type": "objectid" }, { - "type": "boolean", "required": false, - "default": false, - "name": "allow_self_enrollment" + "type": "objectid", + "name": "_id" }, { - "type": "boolean", + "regex": "^.+@.+$", + "name": "email", + "email_signup_must_be_allowed": true, + "nullable": false, "required": false, - "default": false, - "name": "has_zoidberg_share" - }, - { + "not_patchable": true, "maxlength": 100, - "unique": true, - "type": "string", - "required": true, - "empty": false, - "name": "name" + "type": "string" } - ] - } - }, - "/groups/{_id}": { + ], + "label": "Update a Eventsignup" + }, "DELETE": { - "label": "Delete a Group", "params": [ { - "type": "string", "required": true, + "type": "string", "name": "_id" } - ] + ], + "label": "Delete a Eventsignup" }, "GET": { - "label": "Retrieve a Group", "params": [ { - "type": "string", "required": true, + "type": "string", "name": "_id" } - ] - }, - "PATCH": { - "label": "Update a Group", + ], + "label": "Retrieve a Eventsignup" + } + }, + "/eventsignups": { + "POST": { "params": [ { - "type": "string", - "required": true, - "name": "_id" - }, - { - "type": "list", "required": false, - "unique_elements": true, - "schema": { - "regex": "^.+@.+$", - "maxlength": 100, - "type": "string" - }, - "name": "forward_to" + "type": "json_event_field", + "name": "additional_fields", + "nullable": true }, { + "readonly": true, + "name": "confirmed", "nullable": true, - "propertyschema": { - "api_resources": true, - "type": "string" - }, - "valueschema": { - "allowed": [ - "read", - "readwrite" - ], - "type": "string" - }, - "required": false, - "name": "permissions", - "type": "dict" - }, - { - "type": "objectid", "required": false, - "name": "_id" + "type": "boolean" }, { - "nullable": true, - "type": "objectid", - "required": false, + "signup_requirements": true, + "name": "event", + "unique_combination": [ + "user", + "email" + ], + "required": true, + "not_patchable": true, "data_relation": { "field": "_id", - "resource": "users" + "resource": "events", + "embeddable": true }, - "name": "moderator" + "type": "objectid" }, { - "unique_elements_for_resource": true, + "name": "user", + "nullable": false, "required": false, - "name": "receive_from", - "unique_elements": true, - "schema": { - "regex": "[a-z0-9_\\.-]+", - "maxlength": 100, - "type": "string" + "not_patchable": true, + "data_relation": { + "field": "_id", + "resource": "users", + "embeddable": true }, - "type": "list" + "only_self_enrollment_for_event": true, + "type": "objectid" }, { - "type": "boolean", "required": false, - "default": false, - "name": "allow_self_enrollment" + "type": "objectid", + "name": "_id" }, { - "type": "boolean", + "regex": "^.+@.+$", + "name": "email", + "email_signup_must_be_allowed": true, + "nullable": false, "required": false, - "default": false, - "name": "has_zoidberg_share" - }, - { + "not_patchable": true, "maxlength": 100, - "unique": true, - "type": "string", - "required": true, - "empty": false, - "name": "name" + "type": "string" } - ] + ], + "label": "Create a Eventsignup" + }, + "GET": { + "params": [], + "label": "Retrieve all eventsignups" } } }, "description": { "fields": { - "permissions": "permissions the group grants. has to be according to the jsonschema available at /notyetavailable", - "allow_self_enrollment": "If true, the group can be seen by all users and they can subscribe themselves", - "has_zoidberg_share": "If the group has a share in the amiv storage" + "additional_fields": "Data-schema depends on 'additional_fields' from the mapped event. Please provide in json-format.", + "email": "For registered users, this is just a projection of your general email-address. External users need to provide their email here.", + "user": "Provide either user or email." }, - "general": "This resource describes the different teams in AMIV.A group can grant API permissions and can be reached with several addresses. To see the addresses of this group, see /groupaddressesTo see the members, have a look at '/groupmembers'. To see the addresses messages are forwarded to, see /groupforwards" + "methods": { + "PATCH": "Only additional_fields can be changed" + }, + "general": "You can signup here for an existing event inside of the registration-window. External Users can only sign up to public events." } }, - "sessions": { + "groups": { "paths": { - "/sessions": { - "DELETE": { - "label": "Delete all sessions", - "params": [] - }, - "GET": { - "label": "Retrieve all sessions", - "params": [] - }, + "/groups": { "POST": { - "label": "Create a Session", "params": [ { - "nullable": false, - "empty": false, + "name": "name", "required": true, - "name": "username", - "type": "string" + "maxlength": 100, + "unique": true, + "type": "string", + "empty": false }, { - "readonly": true, - "type": "objectid", + "default": false, + "required": false, + "type": "boolean", + "name": "has_zoidberg_share" + }, + { + "default": false, "required": false, + "type": "boolean", + "name": "allow_self_enrollment" + }, + { + "name": "moderator", "data_relation": { - "cascade_delete": true, "field": "_id", - "embeddable": true, "resource": "users" }, - "name": "user" + "nullable": true, + "required": false, + "type": "objectid" + }, + { + "name": "forward_to", + "unique_elements": true, + "required": false, + "type": "list", + "schema": { + "regex": "^.+@.+$", + "type": "string", + "maxlength": 100 + } + }, + { + "name": "receive_from", + "unique_elements": true, + "unique_elements_for_resource": true, + "required": false, + "type": "list", + "schema": { + "regex": "[a-z0-9_\\.-]+", + "type": "string", + "maxlength": 100 + } }, { + "required": false, "type": "objectid", + "name": "_id" + }, + { + "propertyschema": { + "api_resources": true, + "type": "string" + }, + "name": "permissions", + "nullable": true, "required": false, + "type": "dict", + "valueschema": { + "type": "string", + "allowed": [ + "read", + "readwrite" + ] + } + } + ], + "label": "Create a Group" + }, + "GET": { + "params": [], + "label": "Retrieve all groups" + } + }, + "/groups/{_id}": { + "PATCH": { + "params": [ + { + "required": true, + "type": "string", "name": "_id" }, { - "readonly": true, + "name": "name", + "required": true, + "maxlength": 100, + "unique": true, "type": "string", + "empty": false + }, + { + "default": false, "required": false, - "name": "token" + "type": "boolean", + "name": "has_zoidberg_share" }, { - "nullable": false, - "empty": false, - "required": true, - "name": "password", - "type": "string" + "default": false, + "required": false, + "type": "boolean", + "name": "allow_self_enrollment" + }, + { + "name": "moderator", + "data_relation": { + "field": "_id", + "resource": "users" + }, + "nullable": true, + "required": false, + "type": "objectid" + }, + { + "name": "forward_to", + "unique_elements": true, + "required": false, + "type": "list", + "schema": { + "regex": "^.+@.+$", + "type": "string", + "maxlength": 100 + } + }, + { + "name": "receive_from", + "unique_elements": true, + "unique_elements_for_resource": true, + "required": false, + "type": "list", + "schema": { + "regex": "[a-z0-9_\\.-]+", + "type": "string", + "maxlength": 100 + } + }, + { + "required": false, + "type": "objectid", + "name": "_id" + }, + { + "propertyschema": { + "api_resources": true, + "type": "string" + }, + "name": "permissions", + "nullable": true, + "required": false, + "type": "dict", + "valueschema": { + "type": "string", + "allowed": [ + "read", + "readwrite" + ] + } } - ] - } - }, - "/sessions/{_id}": { + ], + "label": "Update a Group" + }, "DELETE": { - "label": "Delete a Session", "params": [ { - "type": "string", "required": true, + "type": "string", "name": "_id" } - ] + ], + "label": "Delete a Group" }, "GET": { - "label": "Retrieve a Session", "params": [ { - "type": "string", "required": true, + "type": "string", "name": "_id" } - ] + ], + "label": "Retrieve a Group" + } + }, + "/groups/{name}": { + "GET": { + "params": [ + { + "name": "name", + "required": true, + "maxlength": 100, + "unique": true, + "type": "string", + "empty": false + } + ], + "label": "Retrieve a Group" } } }, "description": { - "methods": { - "GET": "Check token(s).", - "POST": "Login and aquire a login token. Post the fields 'username' and 'password', the response will contain the token. username can be either nethz, mail, or user_id" + "fields": { + "has_zoidberg_share": "If the group has a share in the amiv storage", + "allow_self_enrollment": "If true, the group can be seen by all users and they can subscribe themselves", + "permissions": "permissions the group grants. has to be according to the jsonschema available at /notyetavailable" }, - "general": "A session is used to authenticate a user after he provided login data. A POST to /session will return a token you can use in an Authorization header: token <yourtoken>" + "general": "This resource describes the different teams in AMIV.A group can grant API permissions and can be reached with several addresses. To see the addresses of this group, see /groupaddressesTo see the members, have a look at '/groupmembers'. To see the addresses messages are forwarded to, see /groupforwards" } }, - "joboffers": { + "studydocuments": { "paths": { - "/joboffers/{_id}": { - "DELETE": { - "label": "Delete a Joboffer", + "/studydocuments/{_id}": { + "PATCH": { "params": [ { - "type": "string", "required": true, - "name": "_id" - } - ] - }, - "GET": { - "label": "Retrieve a Joboffer", - "params": [ - { "type": "string", - "required": true, "name": "_id" - } - ] - }, - "PATCH": { - "label": "Update a Joboffer", - "params": [ + }, { - "type": "string", + "name": "files", "required": true, - "name": "_id" + "type": "list", + "schema": { + "type": "media" + } }, { "nullable": true, - "type": "string", + "name": "author", + "maxlength": 100, "required": false, - "name": "description_en" + "type": "string" }, { - "type": "objectid", + "nullable": true, + "name": "professor", + "maxlength": 100, "required": false, - "name": "_id" + "type": "string" }, { - "type": "media", + "name": "title", + "maxlength": 100, "required": false, - "filetype": [ - "pdf" - ], - "name": "pdf" + "type": "string", + "empty": false }, { - "nullable": true, - "maxlength": 30, - "type": "string", - "depends_any": [ - "title_de", - "title_en" + "allowed": [ + "1", + "2", + "3", + "4", + "5+" ], - "required": true, - "name": "company" + "name": "semester", + "nullable": true, + "required": false, + "type": "string" }, { + "readonly": true, + "name": "uploader", + "data_relation": { + "field": "_id", + "resource": "users" + }, "nullable": true, - "type": "string", "required": false, - "name": "title_de" + "type": "objectid" }, { + "allowed": [ + "itet", + "mavt", + "arch", + "baug", + "bsse", + "infk", + "matl", + "biol", + "chab", + "math", + "phys", + "erdw", + "usys", + "hest", + "mtec", + "gess" + ], + "name": "department", "nullable": true, - "type": "string", "required": false, - "name": "title_en" + "type": "string" }, { "nullable": true, - "type": "datetime", + "name": "lecture", + "maxlength": 100, "required": false, - "name": "time_end" + "type": "string" }, { - "type": "media", "required": false, - "filetype": [ - "png", - "jpeg" - ], - "name": "logo" + "type": "integer", + "name": "course_year" }, { - "nullable": true, - "unique": false, - "type": "string", "required": false, - "name": "description_de" + "type": "objectid", + "name": "_id" + }, + { + "required": false, + "type": "string", + "name": "type", + "allowed": [ + "exams", + "cheat sheets", + "lecture documents", + "exercises" + ] } - ] - } - }, - "/joboffers": { - "GET": { - "label": "Retrieve all joboffers", - "params": [] + ], + "label": "Update a Studydocument" }, - "POST": { - "label": "Create a Joboffer", + "DELETE": { "params": [ { - "nullable": true, + "required": true, "type": "string", - "required": false, - "name": "description_en" - }, + "name": "_id" + } + ], + "label": "Delete a Studydocument" + }, + "GET": { + "params": [ { - "type": "objectid", - "required": false, + "required": true, + "type": "string", "name": "_id" + } + ], + "label": "Retrieve a Studydocument" + } + }, + "/studydocuments": { + "POST": { + "params": [ + { + "name": "files", + "required": true, + "type": "list", + "schema": { + "type": "media" + } }, { - "type": "media", + "nullable": true, + "name": "author", + "maxlength": 100, "required": false, - "filetype": [ - "pdf" - ], - "name": "pdf" + "type": "string" }, { "nullable": true, - "maxlength": 30, + "name": "professor", + "maxlength": 100, + "required": false, + "type": "string" + }, + { + "name": "title", + "maxlength": 100, + "required": false, "type": "string", - "depends_any": [ - "title_de", - "title_en" + "empty": false + }, + { + "allowed": [ + "1", + "2", + "3", + "4", + "5+" ], - "required": true, - "name": "company" + "name": "semester", + "nullable": true, + "required": false, + "type": "string" }, { + "readonly": true, + "name": "uploader", + "data_relation": { + "field": "_id", + "resource": "users" + }, "nullable": true, - "type": "string", "required": false, - "name": "title_de" + "type": "objectid" }, { + "allowed": [ + "itet", + "mavt", + "arch", + "baug", + "bsse", + "infk", + "matl", + "biol", + "chab", + "math", + "phys", + "erdw", + "usys", + "hest", + "mtec", + "gess" + ], + "name": "department", "nullable": true, - "type": "string", "required": false, - "name": "title_en" + "type": "string" }, { "nullable": true, - "type": "datetime", + "name": "lecture", + "maxlength": 100, "required": false, - "name": "time_end" + "type": "string" }, { - "type": "media", "required": false, - "filetype": [ - "png", - "jpeg" - ], - "name": "logo" + "type": "integer", + "name": "course_year" }, { - "nullable": true, - "unique": false, - "type": "string", "required": false, - "name": "description_de" + "type": "objectid", + "name": "_id" + }, + { + "required": false, + "type": "string", + "name": "type", + "allowed": [ + "exams", + "cheat sheets", + "lecture documents", + "exercises" + ] } - ] + ], + "label": "Create a Studydocument" + }, + "DELETE": { + "params": [], + "label": "Delete all studydocuments" + }, + "GET": { + "params": [], + "label": "Retrieve all studydocuments" } } }, "description": { - "fields": {}, - "general": "A Job Offer posts repositoryUsers can post a job offer with the necessarycontent to fill out a job offer advertisement" + "fields": { + "semester": "Study-Semester as an Integer starting with first semester Bachelor.", + "course_year": "Course Year", + "uploader": "Read-only field describing which AMIV member uploaded the files", + "author": "Original author of the uploaded files(Prof, Assistant, copyright owner)" + }, + "general": "Study-documents are basically all documents that are connected to a course. All metadata is optional and intended to help finding the file. There are no strict categories, as those do not work well for courses available to many departements and aiming at all levels of experience." } }, - "studydocuments": { + "events": { "paths": { - "/studydocuments": { - "DELETE": { - "label": "Delete all studydocuments", - "params": [] - }, - "GET": { - "label": "Retrieve all studydocuments", - "params": [] - }, + "/events": { "POST": { - "label": "Create a Studydocument", "params": [ { + "name": "title_de", + "required_if_not": "title_en", "nullable": true, - "maxlength": 100, - "type": "string", "required": false, - "name": "lecture" + "dependencies": [ + "catchphrase_de", + "description_de" + ], + "maxlength": 100, + "type": "string" }, { + "name": "time_register_start", "nullable": true, - "type": "integer", + "only_if_not_null": "spots", "required": false, - "name": "semester" + "dependencies": [ + "time_register_end" + ], + "type": "datetime", + "earlier_than": "time_register_end" }, { - "type": "list", - "required": true, - "schema": { - "type": "media" - }, - "name": "files" + "readonly": true, + "required": false, + "type": "integer", + "name": "signup_count" }, { - "nullable": true, - "maxlength": 4, - "type": "string", + "filetype": [ + "png", + "jpeg" + ], "required": false, - "name": "department" + "type": "media", + "name": "img_thumbnail" }, { + "dependencies": [ + "time_start" + ], + "name": "time_end", "nullable": true, - "maxlength": 5, - "type": "string", + "later_than": "time_start", "required": false, - "name": "coursesemester" + "type": "datetime" }, { - "nullable": true, - "maxlength": 100, - "type": "string", + "name": "allow_email_signup", + "nullable": false, + "default": false, + "only_if_not_null": "spots", "required": false, - "name": "professor" + "type": "boolean" }, { "nullable": true, - "maxlength": 100, - "type": "string", + "dependencies": [ + "time_register_start", + "time_register_end" + ], + "name": "spots", + "min": 0, "required": false, - "name": "author" + "type": "integer" }, { + "name": "description_de", "nullable": true, - "maxlength": 100, - "type": "string", "required": false, - "name": "name" + "type": "string", + "maxlength": 10000 }, { + "name": "time_register_end", "nullable": true, - "readonly": true, - "data_relation": { - "field": "_id", - "resource": "users" - }, + "later_than": "time_register_start", "required": false, - "name": "uploader", - "type": "objectid" + "dependencies": [ + "time_register_start" + ], + "type": "datetime", + "only_if_not_null": "spots" }, { - "type": "objectid", + "filetype": [ + "png", + "jpeg" + ], "required": false, - "name": "_id" + "type": "media", + "name": "img_banner" }, { + "dependencies": [ + "time_end" + ], + "name": "time_start", "nullable": true, - "maxlength": 30, - "type": "string", "required": false, - "name": "type" - } - ] - } - }, - "/studydocuments/{_id}": { - "DELETE": { - "label": "Delete a Studydocument", - "params": [ - { - "type": "string", - "required": true, - "name": "_id" - } - ] - }, - "GET": { - "label": "Retrieve a Studydocument", - "params": [ + "type": "datetime", + "earlier_than": "time_end" + }, { + "name": "catchphrase_en", + "nullable": true, + "required": false, "type": "string", - "required": true, - "name": "_id" - } - ] - }, - "PATCH": { - "label": "Update a Studydocument", - "params": [ + "maxlength": 500 + }, { - "type": "string", + "name": "priority", + "min": 0, + "default": 5, + "max": 10, "required": true, - "name": "_id" + "type": "integer" }, { "nullable": true, - "maxlength": 100, - "type": "string", + "name": "location", + "maxlength": 50, "required": false, - "name": "lecture" + "type": "string" }, { - "nullable": true, - "type": "integer", + "name": "show_infoscreen", + "nullable": false, + "default": false, "required": false, - "name": "semester" - }, - { - "type": "list", - "required": true, - "schema": { - "type": "media" - }, - "name": "files" + "type": "boolean" }, { + "name": "additional_fields", "nullable": true, - "maxlength": 4, - "type": "string", + "only_if_not_null": "spots", "required": false, - "name": "department" + "type": "json_schema" }, { - "nullable": true, - "maxlength": 5, - "type": "string", + "filetype": [ + "png", + "jpeg" + ], "required": false, - "name": "coursesemester" + "type": "media", + "name": "img_infoscreen" }, { "nullable": true, - "maxlength": 100, - "type": "string", + "name": "price", + "min": 0, "required": false, - "name": "professor" + "type": "integer" }, { + "name": "title_en", + "required_if_not": "title_de", "nullable": true, - "maxlength": 100, - "type": "string", "required": false, - "name": "author" + "dependencies": [ + "catchphrase_en", + "description_en" + ], + "maxlength": 100, + "type": "string" }, { + "name": "description_en", "nullable": true, - "maxlength": 100, - "type": "string", "required": false, - "name": "name" + "type": "string", + "maxlength": 10000 }, { - "nullable": true, - "readonly": true, - "data_relation": { - "field": "_id", - "resource": "users" - }, - "required": false, - "name": "uploader", - "type": "objectid" + "name": "time_advertising_end", + "nullable": false, + "later_than": "time_advertising_start", + "required": true, + "type": "datetime" }, { - "type": "objectid", + "filetype": [ + "png", + "jpeg" + ], "required": false, - "name": "_id" + "type": "media", + "name": "img_poster" }, { - "nullable": true, - "maxlength": 30, - "type": "string", + "name": "show_announce", + "nullable": false, + "default": false, "required": false, - "name": "type" - } - ] - } - } - }, - "description": { - "fields": { - "author": "Original author of the uploaded files(Prof, Assistant, copyright owner)", - "semester": "Study-Semester as an Integer starting with first semester Bachelor.", - "uploader": "Read-only field describing which AMIV member uploaded the files", - "coursesemester": "Course Semester as Enum(HS/FS)+Integer" - }, - "general": "Study-documents are basically all documents that are connected to a course. All metadata is optional and intended to help finding the file. There are no strict categories, as those do not work well for courses available to many departements and aiming at all levels of experience." - } - }, - "users": { - "paths": { - "/users/{nethz}": { - "GET": { - "label": "Retrieve a User", - "params": [ + "type": "boolean" + }, { - "nullable": true, - "maxlength": 30, - "default": null, - "unique": true, - "type": "string", + "name": "time_advertising_start", + "nullable": false, + "required": true, + "type": "datetime", + "earlier_than": "time_advertising_end" + }, + { + "name": "show_website", + "nullable": false, + "default": false, "required": false, - "not_patchable_unless_admin": true, - "empty": false, - "name": "nethz" - } - ] - } - }, - "/users/{_id}": { - "DELETE": { - "label": "Delete a User", - "params": [ + "type": "boolean" + }, { + "name": "catchphrase_de", + "nullable": true, + "required": false, "type": "string", - "required": true, - "name": "_id" - } - ] - }, - "GET": { - "label": "Retrieve a User", - "params": [ + "maxlength": 500 + }, { - "type": "string", - "required": true, + "required": false, + "type": "objectid", "name": "_id" } - ] + ], + "label": "Create a Event" }, + "GET": { + "params": [], + "label": "Retrieve all events" + } + }, + "/events/{_id}": { "PATCH": { - "label": "Update a User", "params": [ { - "type": "string", "required": true, + "type": "string", "name": "_id" }, { + "name": "title_de", + "required_if_not": "title_en", "nullable": true, - "maxlength": 30, - "default": null, - "unique": true, - "type": "string", "required": false, - "not_patchable_unless_admin": true, - "empty": false, - "name": "nethz" - }, - { + "dependencies": [ + "catchphrase_de", + "description_de" + ], "maxlength": 100, - "unique": true, - "type": "string", - "required": true, - "regex": "^.+@.+$", - "name": "email" + "type": "string" }, { + "name": "time_register_start", "nullable": true, - "empty": false, - "maxlength": 20, + "only_if_not_null": "spots", "required": false, - "name": "phone", - "type": "string" - }, - { - "not_patchable_unless_admin": true, - "allowed": [ - "male", - "female" + "dependencies": [ + "time_register_end" ], - "unique": false, - "type": "string", - "required": true, - "maxlength": 6, - "name": "gender" + "type": "datetime", + "earlier_than": "time_register_end" }, { - "type": "objectid", + "readonly": true, "required": false, - "name": "_id" + "type": "integer", + "name": "signup_count" }, { - "nullable": false, - "maxlength": 50, - "type": "string", - "required": true, - "not_patchable_unless_admin": true, - "empty": false, - "name": "firstname" + "filetype": [ + "png", + "jpeg" + ], + "required": false, + "type": "media", + "name": "img_thumbnail" }, { + "dependencies": [ + "time_start" + ], + "name": "time_end", "nullable": true, - "maxlength": 8, - "unique": true, - "type": "string", + "later_than": "time_start", "required": false, - "not_patchable_unless_admin": true, - "name": "legi" + "type": "datetime" }, { - "nullable": true, - "not_patchable_unless_admin": true, + "name": "allow_email_signup", + "nullable": false, + "default": false, + "only_if_not_null": "spots", "required": false, - "allowed": [ - "itet", - "mavt" - ], - "name": "department", - "type": "string" + "type": "boolean" }, { "nullable": true, - "type": "boolean", + "dependencies": [ + "time_register_start", + "time_register_end" + ], + "name": "spots", + "min": 0, "required": false, - "name": "send_newsletter" + "type": "integer" }, { + "name": "description_de", "nullable": true, - "maxlength": 100, - "default": null, - "type": "string", "required": false, - "empty": false, - "name": "password" + "type": "string", + "maxlength": 10000 }, { - "nullable": false, - "maxlength": 50, - "type": "string", - "required": true, - "not_patchable_unless_admin": true, - "empty": false, - "name": "lastname" + "name": "time_register_end", + "nullable": true, + "later_than": "time_register_start", + "required": false, + "dependencies": [ + "time_register_start" + ], + "type": "datetime", + "only_if_not_null": "spots" }, { - "maxlength": 13, - "allowed": [ - "none", - "regular", - "extraordinary", - "honorary" + "filetype": [ + "png", + "jpeg" ], - "unique": false, - "type": "string", - "required": true, - "not_patchable_unless_admin": true, - "name": "membership" + "required": false, + "type": "media", + "name": "img_banner" }, { + "dependencies": [ + "time_end" + ], + "name": "time_start", "nullable": true, - "maxlength": 6, - "unique": true, - "type": "string", "required": false, - "empty": false, - "name": "rfid" - } - ] - } - }, - "/users": { - "GET": { - "label": "Retrieve all users", - "params": [] - }, - "POST": { - "label": "Create a User", - "params": [ + "type": "datetime", + "earlier_than": "time_end" + }, { + "name": "catchphrase_en", "nullable": true, - "maxlength": 30, - "default": null, - "unique": true, - "type": "string", "required": false, - "not_patchable_unless_admin": true, - "empty": false, - "name": "nethz" + "type": "string", + "maxlength": 500 }, { - "maxlength": 100, - "unique": true, - "type": "string", + "name": "priority", + "min": 0, + "default": 5, + "max": 10, "required": true, - "regex": "^.+@.+$", - "name": "email" + "type": "integer" }, { "nullable": true, - "empty": false, - "maxlength": 20, + "name": "location", + "maxlength": 50, "required": false, - "name": "phone", "type": "string" }, { - "not_patchable_unless_admin": true, - "allowed": [ - "male", - "female" - ], - "unique": false, - "type": "string", - "required": true, - "maxlength": 6, - "name": "gender" + "name": "show_infoscreen", + "nullable": false, + "default": false, + "required": false, + "type": "boolean" }, { - "type": "objectid", + "name": "additional_fields", + "nullable": true, + "only_if_not_null": "spots", "required": false, - "name": "_id" + "type": "json_schema" }, { - "nullable": false, - "maxlength": 50, - "type": "string", - "required": true, - "not_patchable_unless_admin": true, - "empty": false, - "name": "firstname" + "filetype": [ + "png", + "jpeg" + ], + "required": false, + "type": "media", + "name": "img_infoscreen" }, { "nullable": true, - "maxlength": 8, - "unique": true, - "type": "string", + "name": "price", + "min": 0, "required": false, - "not_patchable_unless_admin": true, - "name": "legi" + "type": "integer" }, { + "name": "title_en", + "required_if_not": "title_de", "nullable": true, - "not_patchable_unless_admin": true, "required": false, - "allowed": [ - "itet", - "mavt" - ], - "name": "department", + "dependencies": [ + "catchphrase_en", + "description_en" + ], + "maxlength": 100, "type": "string" }, { + "name": "description_en", "nullable": true, - "type": "boolean", "required": false, - "name": "send_newsletter" - }, - { - "nullable": true, - "maxlength": 100, - "default": null, "type": "string", - "required": false, - "empty": false, - "name": "password" + "maxlength": 10000 }, { + "name": "time_advertising_end", "nullable": false, - "maxlength": 50, - "type": "string", + "later_than": "time_advertising_start", "required": true, - "not_patchable_unless_admin": true, - "empty": false, - "name": "lastname" + "type": "datetime" }, { - "maxlength": 13, - "allowed": [ - "none", - "regular", - "extraordinary", - "honorary" + "filetype": [ + "png", + "jpeg" ], - "unique": false, - "type": "string", - "required": true, - "not_patchable_unless_admin": true, - "name": "membership" - }, - { - "nullable": true, - "maxlength": 6, - "unique": true, - "type": "string", "required": false, - "empty": false, - "name": "rfid" - } - ] - } - } - }, - "description": { - "methods": { - "GET": "Authorization is required for most of the fields" - }, - "general": "In general, the user data will be generated from LDAP-Data. However, one might change the RFID-Number or the membership-status. Extraordinary members may not have a LDAP-Account and can therefore access all given fields." - } - }, - "purchases": { - "paths": { - "/purchases": { - "GET": { - "label": "Retrieve all purchases", - "params": [] - }, - "POST": { - "label": "Create a Purchase", - "params": [ - { - "type": "objectid", - "required": false, - "name": "_id" + "type": "media", + "name": "img_poster" }, { + "name": "show_announce", "nullable": false, - "unique": false, - "required": true, - "name": "timestamp", - "type": "datetime" + "default": false, + "required": false, + "type": "boolean" }, { + "name": "time_advertising_start", "nullable": false, - "not_patchable_unless_admin": true, - "allowed": [ - "beer", - "coffee" - ], - "unique": false, - "type": "string", "required": true, - "maxlength": 6, - "name": "product" + "type": "datetime", + "earlier_than": "time_advertising_end" }, { + "name": "show_website", "nullable": false, - "data_relation": { - "field": "_id", - "embeddable": true, - "resource": "users" - }, - "unique": false, - "type": "objectid", - "required": true, - "name": "user" - } - ] - } - }, - "/purchases/{_id}": { - "GET": { - "label": "Retrieve a Purchase", - "params": [ - { - "type": "string", - "required": true, - "name": "_id" - } - ] - } - } - }, - "description": { - "fields": {}, - "general": "A beer machine or kaffi machine transaction. Users should be able to get beer or kaffi, if their last timestamp is older than one day and they are AMIV members. This resource is used to log their purchases." - } - }, - "groupmemberships": { - "paths": { - "/groupmemberships": { - "GET": { - "label": "Retrieve all groupmemberships", - "params": [] - }, - "POST": { - "label": "Create a Groupmembership", - "params": [ - { - "self_enrollment_required": true, - "data_relation": { - "cascade_delete": true, - "field": "_id", - "embeddable": true, - "resource": "groups" - }, - "required": true, - "name": "group", - "type": "objectid" - }, - { - "type": "objectid", + "default": false, "required": false, - "name": "_id" + "type": "boolean" }, { - "data_relation": { - "cascade_delete": true, - "field": "_id", - "embeddable": true, - "resource": "users" - }, - "type": "objectid", - "required": true, - "only_self_or_moderator": true, - "unique_combination": [ - "group" - ], - "name": "user" - } - ] - } - }, - "/groupmemberships/{_id}": { - "DELETE": { - "label": "Delete a Groupmembership", - "params": [ - { - "type": "string", - "required": true, - "name": "_id" - } - ] - }, - "GET": { - "label": "Retrieve a Groupmembership", - "params": [ - { - "type": "string", - "required": true, - "name": "_id" - } - ] - } - } - }, - "description": { - "general": "Assignment of registered users to groups." - } - }, - "eventsignups": { - "paths": { - "/eventsignups": { - "GET": { - "label": "Retrieve all eventsignups", - "params": [] - }, - "POST": { - "label": "Create a Eventsignup", - "params": [ - { + "name": "catchphrase_de", "nullable": true, - "type": "json_event_field", "required": false, - "name": "additional_fields" - }, - { - "nullable": false, - "email_signup_must_be_allowed": true, - "maxlength": 100, "type": "string", - "required": false, - "regex": "^.+@.+$", - "not_patchable": true, - "name": "email" + "maxlength": 500 }, { - "nullable": true, - "readonly": true, - "type": "boolean", - "required": false, - "name": "confirmed" - }, - { - "nullable": false, - "data_relation": { - "field": "_id", - "embeddable": true, - "resource": "users" - }, - "type": "objectid", - "only_self_enrollment_for_event": true, "required": false, - "not_patchable": true, - "name": "user" - }, - { "type": "objectid", - "required": false, "name": "_id" - }, - { - "data_relation": { - "field": "_id", - "embeddable": true, - "resource": "events" - }, - "signup_requirements": true, - "type": "objectid", - "required": true, - "not_patchable": true, - "unique_combination": [ - "user", - "email" - ], - "name": "event" } - ] - } - }, - "/eventsignups/{_id}": { + ], + "label": "Update a Event" + }, "DELETE": { - "label": "Delete a Eventsignup", "params": [ { - "type": "string", "required": true, + "type": "string", "name": "_id" } - ] + ], + "label": "Delete a Event" }, "GET": { - "label": "Retrieve a Eventsignup", "params": [ { - "type": "string", "required": true, - "name": "_id" - } - ] - }, - "PATCH": { - "label": "Update a Eventsignup", - "params": [ - { "type": "string", - "required": true, - "name": "_id" - }, - { - "nullable": true, - "type": "json_event_field", - "required": false, - "name": "additional_fields" - }, - { - "nullable": false, - "email_signup_must_be_allowed": true, - "maxlength": 100, - "type": "string", - "required": false, - "regex": "^.+@.+$", - "not_patchable": true, - "name": "email" - }, - { - "nullable": true, - "readonly": true, - "type": "boolean", - "required": false, - "name": "confirmed" - }, - { - "nullable": false, - "data_relation": { - "field": "_id", - "embeddable": true, - "resource": "users" - }, - "type": "objectid", - "only_self_enrollment_for_event": true, - "required": false, - "not_patchable": true, - "name": "user" - }, - { - "type": "objectid", - "required": false, "name": "_id" - }, - { - "data_relation": { - "field": "_id", - "embeddable": true, - "resource": "events" - }, - "signup_requirements": true, - "type": "objectid", - "required": true, - "not_patchable": true, - "unique_combination": [ - "user", - "email" - ], - "name": "event" } - ] + ], + "label": "Retrieve a Event" } } }, "description": { "fields": { - "additional_fields": "Data-schema depends on 'additional_fields' from the mapped event. Please provide in json-format.", - "email": "For registered users, this is just a projection of your general email-address. External users need to provide their email here.", - "user": "Provide either user or email." + "additional_fields": "must be provided in form of a JSON-Schema. You can add here fields you want to know from people signing up going further than their email-address", + "price": "Price of the event as Integer in Rappen.", + "allow_email_signup": "If False, only AMIV-Members can sign up for this event", + "spots": "For no limit, set to '0'. If no signup required, set to '-1'. Otherwise just provide an integer." }, "methods": { - "PATCH": "Only additional_fields can be changed" + "GET": "You are always allowed, even without session, to view AMIV-Events" }, - "general": "You can signup here for an existing event inside of the registration-window. External Users can only sign up to public events." + "general": "An Event is basically everything happening in the AMIV. All time fields have the format YYYY-MM-DDThh:mmZ, e.g. 2014-12-20T11:50:06Z" } } }, + "api_name": "API", "base": "http:///", "server_name": null -} \ No newline at end of file +} diff --git a/tools/events.tool b/tools/events.tool index f57a49213bd0b57edce0a77582f95f21379a8419..f10fe6de97369a6d47a0a722123f87722b4f4b57 100644 --- a/tools/events.tool +++ b/tools/events.tool @@ -471,9 +471,12 @@ var newEvent = { data: {} }; - newEvent["data"]["title_de"] = setNullIfEmpty($("#title_de").val()); - newEvent["data"]["description_de"] = setNullIfEmpty($("#description_de").val()); - newEvent["data"]["catchphrase_de"] = setNullIfEmpty($("#catchphrase_de").val()); + if ($("#title_de") !== "") + newEvent["data"]["title_de"] = $("#title_de").val(); + if ($("#description_de") !== "") + newEvent["data"]["description_de"] = $("#description_de").val(); + if ($("#catchphrase_de") !== "") + newEvent["data"]["catchphrase_de"] = $("#catchphrase_de").val(); if (!($("#time_start").data("DateTimePicker").date() == null)) { newEvent["data"]["time_start"] = $("#time_start").data("DateTimePicker").date().toISOString().split('.')[0]+"Z"; @@ -517,38 +520,35 @@ } newEvent["data"]["allow_email_signup"] = $("#allow_email_signup").is(':checked'); } else { - newEvent["data"]["spots"] = null; } + if ($("#location").val() !== "") + newEvent["data"]["location"] = $("#location").val(); - newEvent["data"]["location"] = setNullIfEmpty($("#location").val()); - - if (!($("#price").val() === "")) { + if (!($("#price").val() === "")) newEvent["data"]["price"] = Math.floor((parseFloat($("#price").val()) * 100)); - } newEvent["data"]["show_website"] = $("#show_website").is(':checked'); newEvent["data"]["show_infoscreen"] = $("#show_infoscreen").is(':checked'); newEvent["data"]["show_announce"] = $("#show_announce").is(':checked'); - newEvent["data"]["priority"] = (parseInt($("#priority").val())); - newEvent["data"]["additional_fields"] = setNullIfEmpty($("#additional_fields").val()); - - newEvent["data"]["title_en"] = setNullIfEmpty($("#title_en").val()); - newEvent["data"]["description_en"] = setNullIfEmpty($("#description_en").val()); - newEvent["data"]["catchphrase_en"] = setNullIfEmpty($("#catchphrase_en").val()); - - console.log(newEvent); - - form = new FormData(); - // for (data in newEvent.data){ - // form.append(data, newEvent['data'][data]); - // } - var imageData = ['img_infoscreen', 'img_thumbnail', 'img_poster', 'img_banner']; + newEvent["data"]["priority"] = parseInt($("#priority").val()); + if ($("#additional_fields").val() !== "") + newEvent["data"]["additional_fields"] = $("#additional_fields").val(); + + if ($("#title_en").val !== "") + newEvent["data"]["title_en"] = $("#title_en").val(); + if ($("#description_en").val !== "") + newEvent["data"]["description_en"] = $("#description_en").val(); + if ($("#catchphrase_en").val !== "") + newEvent["data"]["catchphrase_en"] = $("#catchphrase_en").val(); + + var imageData = ['img_infoscreen', 'img_thumbnail', 'img_poster', 'img_banner']; for (i = 0; i < imageData.length; i++){ if ($('#' + imageData[i])[0].files[0] != undefined) - form.append(imageData[i], $('#' + imageData[i])[0].files[0]); + newEvent["data"][imageData[i]] = $('#' + imageData[i])[0].files[0]; } + console.log(newEvent); console.log(JSON.stringify(newEvent)); if(isNew) { @@ -558,7 +558,10 @@ else { console.log(ret); curEventData = ret; - events.uploadCallback(form); + tools.log('Event Added', 's'); + $('#event-modal').modal('hide'); + $("#event-modal-form").trigger('reset'); + events.get(); } }); } @@ -571,35 +574,15 @@ if (!ret.hasOwnProperty('_status') || ret['_status'] != 'OK') tools.log(JSON.stringify(ret.responseJSON['_issues']), 'e'); else { - events.uploadCallback(form); - } - }); - } - console.log(response); - }, - - //images need to be uploaded seperately after POSTing using PATCH - uploadCallback: function(form){ - amivcore.getEtag('events', curEventData._id, function(ret){ - $.ajax({ - url: events.API_url + '/events/' + curEventData._id, - headers: {'Authorization':'amivroot', 'If-Match': ret}, - data: form, - type: 'PATCH', - // THIS MUST BE DONE FOR FILE UPLOADING - contentType: false, - processData: false, - // ... Other options like success and etc - success: function(data){ - console.log(data); - tools.log('Event Added', 's'); + console.log(ret); + curEventData = ret; + tools.log('Event Added', 's'); $('#event-modal').modal('hide'); $("#event-modal-form").trigger('reset'); events.get(); } }); - }); - + } } }