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;
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'

View File

@@ -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 });