AAIT#36979 FO rechten voor RES-API beter ondersteunen

svn path=/Website/trunk/; revision=32223
This commit is contained in:
Jos Groot Lipman
2017-01-05 11:26:11 +00:00
parent 7bf213c53e
commit 10e9a51fb2
2 changed files with 65 additions and 40 deletions

View File

@@ -134,10 +134,14 @@ api2_rest = {
var wasCodePage = Session.Codepage; var wasCodePage = Session.Codepage;
Session.Codepage = 65001; // We doen *uitsluitend* utf-8 Session.Codepage = 65001; // We doen *uitsluitend* utf-8
Response.Charset = '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(); api2_rest.authenticate();
// Kip-ei: de omzetting naar new model() mag pas als je geauthenticeerd bent // 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. if (typeof model == "function") // Nieuwe stijl is het een function. Even compatible.
model = new model(); model = new model();
@@ -163,7 +167,7 @@ api2_rest = {
if (/PUT|POST/.test(method)) // Dan is er in de body data meegestuurd if (/PUT|POST/.test(method)) // Dan is er in de body data meegestuurd
{ {
switch (getQParamSafe("format", "invalid").toLowerCase()) switch (format)
{ {
case "json": case "json":
{ {
@@ -197,11 +201,11 @@ api2_rest = {
var key = getQParamInt("id", -1); // Voor POST/PUT/DELETE var key = getQParamInt("id", -1); // Voor POST/PUT/DELETE
var isSingle = /PUT|POST|DELETE/.test(method) || (key > 0); // PUT, POST en DELETE altijd single 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 // 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? // TODO: Onderstaande in een of ander standaardformaat opleveren?
var result = { id: model.records_name, 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' // Data is een array met 'records'

View File

@@ -103,23 +103,29 @@ function model_reservations(rsv_key, params)
this.REST_GET = function _GET(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 ); 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 var this_res = res.func_enabled(params.filter.id);
if (!params.filter.id) user.auth_required_or_abort(this_res.canReadAny);
query.wheres.push("res_rsv_ruimte_van BETWEEN SYSDATE - " + S("facilitiespast_res") + " AND SYSDATE + " + S("facilitiesfuture_res"));
} }
else else // lijst
{ {
if (!params.filter.start_from && !params.filter.end_from && !params.filter.start_to && !params.filter.end_to) var scope = params.filter.scope || "fe";
query.wheres.push("res_rsv_ruimte_van >= TRUNC(SYSDATE)"); // reserveringen van vandaag en komende dagen! 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"); query.tables.push("res_ruimte_opstelling");
@@ -147,21 +153,24 @@ function model_reservations(rsv_key, params)
+ " FROM " + query.tables.join(", ") + " FROM " + query.tables.join(", ")
+ " WHERE " + query.wheres.join(" AND " ); + " WHERE " + query.wheres.join(" AND " );
// Over het resultaat moet nog de 3D rasp, altijd if (!(params.filter.id > 0))
sql = discx3d (sql, {
"rr.res_discipline_key", // Over het resultaat moet nog de 3D rasp, altijd
"di.alg_regio_key", sql = discx3d (sql,
"rg.alg_district_key", "rr.res_discipline_key",
"rg.alg_locatie_key", "di.alg_regio_key",
"rg.alg_gebouw_key", "rg.alg_district_key",
"rg.alg_verdieping_key", "rg.alg_locatie_key",
"rg.alg_ruimte_key", "rg.alg_gebouw_key",
"boom.prs_bedrijf_key", "rg.alg_verdieping_key",
"boom.prs_afdeling_key", "rg.alg_ruimte_key",
autfunction, "boom.prs_bedrijf_key",
"", "boom.prs_afdeling_key",
2,null,3 autfunction,
); "",
2,null,3
);
}
sql += " ORDER BY res_rsv_ruimte.res_rsv_ruimte_key"; // Order by nodig voor includes sql += " ORDER BY res_rsv_ruimte.res_rsv_ruimte_key"; // Order by nodig voor includes
if (query.orderbys.length) if (query.orderbys.length)
@@ -243,12 +252,14 @@ function model_reservations(rsv_key, params)
this.REST_PUT = function (params, jsondata, the_key) /* update reservation */ this.REST_PUT = function (params, jsondata, the_key) /* update reservation */
{ {
var rsv_ruimte_key = the_key; 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 var dbfields = api2.update_fields(params, this, jsondata); // Build updater
_analyze_fields(dbfields, params, jsondata); _analyze_fields(dbfields, params, jsondata);
_validate_fields(dbfields, params, jsondata); _validate_fields(dbfields, params, jsondata);
// bezUpd heeft na afloop eventueel oldjsvals
var wheres = [" res_rsv_ruimte_key = " + rsv_ruimte_key]; 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 // 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 // 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); _validate_fields(dbfields, params, jsondata);
// Eerst een nieuw res_reservering record aanmaken // 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() } "create": { dbs: "res_reservering_aanmaak", typ: "datetime", val: new Date() }
}; };
var resIns = buildInsert("res_reservering", resfields, { noValidateToken: true }); var resIns = buildInsert("res_reservering", resfields, { noValidateToken: true });
@@ -313,12 +324,22 @@ function model_reservations(rsv_key, params)
var volgnr = 1; var volgnr = 1;
Oracle.Execute(resIns.sql); 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 // 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["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["reskey"] = { dbs: "res_reservering_key", typ: "key", val: reservering_key };
dbfields["sequence"] = { dbs: "res_rsv_ruimte_volgnr", typ: "number", val: volgnr }; 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["host"] = { dbs: "res_rsv_ruimte_host_key", typ: "key", val: host_key };
dbfields["contact"] = { dbs: "res_rsv_ruimte_contact_key", typ: "key", val: user_key }; dbfields["contact"] = { dbs: "res_rsv_ruimte_contact_key", typ: "key", val: contact_key };
if (!jsondata.status) if (!jsondata.status)
dbfields["status"] = { dbs: "res_status_fo_key", typ: "key", val: S("res_default_fe_status_key") }; 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 }); var resIns = buildInsert("res_rsv_ruimte", dbfields, { noValidateToken: true });