From 10e9a51fb2e08713ea87a8f7809572cb5016f45f Mon Sep 17 00:00:00 2001 From: Jos Groot Lipman Date: Thu, 5 Jan 2017 11:26:11 +0000 Subject: [PATCH] AAIT#36979 FO rechten voor RES-API beter ondersteunen svn path=/Website/trunk/; revision=32223 --- APPL/API2/api2_rest.inc | 14 +++-- APPL/API2/model_reservations.inc | 91 ++++++++++++++++++++------------ 2 files changed, 65 insertions(+), 40 deletions(-) diff --git a/APPL/API2/api2_rest.inc b/APPL/API2/api2_rest.inc index 9763c9e47a..ac26690221 100644 --- a/APPL/API2/api2_rest.inc +++ b/APPL/API2/api2_rest.inc @@ -134,10 +134,14 @@ api2_rest = { var wasCodePage = Session.Codepage; Session.Codepage = 65001; // We doen *uitsluitend* utf-8 Response.Charset = 'utf-8'; + var format = getQParamSafe("format", "invalid").toLowerCase(); + if (format == "json") + /* global */ JSON_Result = true; // Zelf doen we er niets mee maar + // shared.simple_page kijkt er naar api2_rest.authenticate(); // Kip-ei: de omzetting naar new model() mag pas als je geauthenticeerd bent - // Hieroboven willen we heb echter al wel meegeven + // Hierboven willen we het echter al wel meegeven if (typeof model == "function") // Nieuwe stijl is het een function. Even compatible. model = new model(); @@ -163,7 +167,7 @@ api2_rest = { if (/PUT|POST/.test(method)) // Dan is er in de body data meegestuurd { - switch (getQParamSafe("format", "invalid").toLowerCase()) + switch (format) { case "json": { @@ -197,11 +201,11 @@ api2_rest = { var key = getQParamInt("id", -1); // Voor POST/PUT/DELETE var isSingle = /PUT|POST|DELETE/.test(method) || (key > 0); // PUT, POST en DELETE altijd single - if (getQParamSafe("format", "json") == "doc") + if (format == "doc") { // Dan hoeven we verder niets te doen } - else if (getQParamSafe("format", "json") == "api") + else if (format == "api") { // TODO: Onderstaande in een of ander standaardformaat opleveren? var result = { id: model.records_name, @@ -314,7 +318,7 @@ api2_rest = { } } - api2_rest.deliver(data, model, getQParamSafe("format", "json"), isSingle); + api2_rest.deliver(data, model, format, isSingle); }, // Data is een array met 'records' diff --git a/APPL/API2/model_reservations.inc b/APPL/API2/model_reservations.inc index 18ee5bcd55..e059510213 100644 --- a/APPL/API2/model_reservations.inc +++ b/APPL/API2/model_reservations.inc @@ -103,23 +103,29 @@ function model_reservations(rsv_key, params) this.REST_GET = function _GET(params) { - var scope = params.filter.scope || "fe"; - var autfunction = { fe : "WEB_RESUSE", fo : "WEB_RESFOF", bo : "WEB_RESBOF", mi : "WEB_RESBAC" } [scope]; - params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch - - // TODO: Add authorization var query = api2.sqlfields(params, this ); - if (scope == "fe") + if (params.filter.id > 0) { - query.wheres.push(user_key + " IN (res_rsv_ruimte_host_key, res_rsv_ruimte_contact_key)"); // Altijd fe vooralnog - if (!params.filter.id) - query.wheres.push("res_rsv_ruimte_van BETWEEN SYSDATE - " + S("facilitiespast_res") + " AND SYSDATE + " + S("facilitiesfuture_res")); + var this_res = res.func_enabled(params.filter.id); + user.auth_required_or_abort(this_res.canReadAny); } - else + else // lijst { - if (!params.filter.start_from && !params.filter.end_from && !params.filter.start_to && !params.filter.end_to) - query.wheres.push("res_rsv_ruimte_van >= TRUNC(SYSDATE)"); // reserveringen van vandaag en komende dagen! + var scope = params.filter.scope || "fe"; + var autfunction = { fe : "WEB_RESUSE", fo : "WEB_RESFOF", bo : "WEB_RESBOF", mi : "WEB_RESBAC" } [scope]; + params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch + + if (scope == "fe") + { + query.wheres.push(user_key + " IN (res_rsv_ruimte_host_key, res_rsv_ruimte_contact_key)"); + query.wheres.push("res_rsv_ruimte_van BETWEEN SYSDATE - " + S("facilitiespast_res") + " AND SYSDATE + " + S("facilitiesfuture_res")); + } + else + { + if (!params.filter.start_from && !params.filter.end_from && !params.filter.start_to && !params.filter.end_to) + query.wheres.push("res_rsv_ruimte_van >= TRUNC(SYSDATE)"); // reserveringen van vandaag en komende dagen! + } } query.tables.push("res_ruimte_opstelling"); @@ -147,21 +153,24 @@ function model_reservations(rsv_key, params) + " FROM " + query.tables.join(", ") + " WHERE " + query.wheres.join(" AND " ); - // Over het resultaat moet nog de 3D rasp, altijd - sql = discx3d (sql, - "rr.res_discipline_key", - "di.alg_regio_key", - "rg.alg_district_key", - "rg.alg_locatie_key", - "rg.alg_gebouw_key", - "rg.alg_verdieping_key", - "rg.alg_ruimte_key", - "boom.prs_bedrijf_key", - "boom.prs_afdeling_key", - autfunction, - "", - 2,null,3 - ); + if (!(params.filter.id > 0)) + { + // Over het resultaat moet nog de 3D rasp, altijd + sql = discx3d (sql, + "rr.res_discipline_key", + "di.alg_regio_key", + "rg.alg_district_key", + "rg.alg_locatie_key", + "rg.alg_gebouw_key", + "rg.alg_verdieping_key", + "rg.alg_ruimte_key", + "boom.prs_bedrijf_key", + "boom.prs_afdeling_key", + autfunction, + "", + 2,null,3 + ); + } sql += " ORDER BY res_rsv_ruimte.res_rsv_ruimte_key"; // Order by nodig voor includes if (query.orderbys.length) @@ -243,12 +252,14 @@ function model_reservations(rsv_key, params) this.REST_PUT = function (params, jsondata, the_key) /* update reservation */ { var rsv_ruimte_key = the_key; + var this_res = res.func_enabled(rsv_ruimte_key); + user.auth_required_or_abort(this_res.canChange); + var dbfields = api2.update_fields(params, this, jsondata); // Build updater _analyze_fields(dbfields, params, jsondata); _validate_fields(dbfields, params, jsondata); - // bezUpd heeft na afloop eventueel oldjsvals + var wheres = [" res_rsv_ruimte_key = " + rsv_ruimte_key]; - wheres.push(user_key + " IN (res_rsv_ruimte_host_key, res_rsv_ruimte_contact_key)"); // Altijd fe vooralnog // ons eigen tijdstip/zaal is mogelijk gewijzigd waardoor andere *dirty* reserveringen // clean wordt. Even onze oude datum onthouden zodat we niet *alles* hoeven te controleren @@ -305,7 +316,7 @@ function model_reservations(rsv_key, params) _validate_fields(dbfields, params, jsondata); // Eerst een nieuw res_reservering record aanmaken - var resfields = { "id": { dbs: "res_reservering_key", typ: "key", seq: "res_s_res_reservering_key" }, + var resfields = { "id": { dbs: "res_reservering_key", typ: "key", seq: "res_s_res_reservering_key" }, "create": { dbs: "res_reservering_aanmaak", typ: "datetime", val: new Date() } }; var resIns = buildInsert("res_reservering", resfields, { noValidateToken: true }); @@ -313,12 +324,22 @@ function model_reservations(rsv_key, params) var volgnr = 1; Oracle.Execute(resIns.sql); + var host_key = user_key; + var contact_key = user_key; + if (user.has("WEB_RESFOF")) + { + if ("host" in jsondata) + host_key = jsondata.host; + if ("contact" in jsondata) + contact_key = jsondata.contact; + } + // Nu aan de slag met een res_rsv_ruimte record - dbfields["id"] = { dbs: "res_rsv_ruimte_key", typ: "key", seq: "res_s_res_rsv_ruimte_key" }; - dbfields["reskey"] = { dbs: "res_reservering_key", typ: "key", val: reservering_key }; - dbfields["sequence"] = { dbs: "res_rsv_ruimte_volgnr", typ: "number", val: volgnr }; - dbfields["host"] = { dbs: "res_rsv_ruimte_host_key", typ: "key", val: user_key }; - dbfields["contact"] = { dbs: "res_rsv_ruimte_contact_key", typ: "key", val: user_key }; + dbfields["id"] = { dbs: "res_rsv_ruimte_key", typ: "key", seq: "res_s_res_rsv_ruimte_key" }; + dbfields["reskey"] = { dbs: "res_reservering_key", typ: "key", val: reservering_key }; + dbfields["sequence"] = { dbs: "res_rsv_ruimte_volgnr", typ: "number", val: volgnr }; + dbfields["host"] = { dbs: "res_rsv_ruimte_host_key", typ: "key", val: host_key }; + dbfields["contact"] = { dbs: "res_rsv_ruimte_contact_key", typ: "key", val: contact_key }; if (!jsondata.status) dbfields["status"] = { dbs: "res_status_fo_key", typ: "key", val: S("res_default_fe_status_key") }; var resIns = buildInsert("res_rsv_ruimte", dbfields, { noValidateToken: true });