|
|
define([
|
|
|
"dojo/_base/declare",
|
|
|
"dojo/_base/lang",
|
|
|
"dojo/when",
|
|
|
"implab/safe",
|
|
|
"./NotAllowedException",
|
|
|
"./HttpResponse"
|
|
|
], function (
|
|
|
declare,
|
|
|
lang,
|
|
|
when,
|
|
|
safe,
|
|
|
NotAllowedException,
|
|
|
HttpResponse
|
|
|
) {
|
|
|
let resource = declare(null, {
|
|
|
|
|
|
// instance members
|
|
|
request: null,
|
|
|
|
|
|
// родительский ресурс
|
|
|
parent: null,
|
|
|
|
|
|
// имя текущего ресурса, является фрагментом пути к запрашиваемому
|
|
|
// ресурсу
|
|
|
name: null,
|
|
|
|
|
|
allowedMethods: {
|
|
|
"head": 0,
|
|
|
"options": 0,
|
|
|
"get": 0,
|
|
|
"post": 0,
|
|
|
"put": 1, // extended method
|
|
|
"delete": 1 // extended method
|
|
|
},
|
|
|
|
|
|
constructor: function (options) {
|
|
|
if (options) {
|
|
|
declare.safeMixin(this, options);
|
|
|
}
|
|
|
},
|
|
|
|
|
|
accessCheck: null,
|
|
|
|
|
|
getAllowedMethods: function (cors) {
|
|
|
let methods = [];
|
|
|
for (var m in this.allowedMethods) {
|
|
|
if (m in this && (cors && this.allowedMethods[m] || !cors))
|
|
|
methods.push(m.toUpperCase());
|
|
|
}
|
|
|
return methods;
|
|
|
},
|
|
|
|
|
|
options: function () {
|
|
|
let resp = new HttpResponse(null, {
|
|
|
headers: {
|
|
|
"Access-Control-Allow-Methods": this.getAllowedMethods(true),
|
|
|
"Allowed-Methods": this.getAllowedMethods()
|
|
|
}
|
|
|
});
|
|
|
return resp;
|
|
|
},
|
|
|
|
|
|
invoke: function () {
|
|
|
let method = this.request.method.toLowerCase();
|
|
|
|
|
|
let me = this;
|
|
|
|
|
|
if (!(method in this)) {
|
|
|
throw new NotAllowedException(); // TODO: Возвратить список возможных методов (verbs)
|
|
|
}
|
|
|
|
|
|
if (!safe.isNull(this.accessCheck)) {
|
|
|
return when(this.request.session, function (session) {
|
|
|
me.session = session;
|
|
|
return when(me.accessCheck(), function () {
|
|
|
return me[method]();
|
|
|
});
|
|
|
}, function (err) {
|
|
|
console.log(err);
|
|
|
throw err;
|
|
|
});
|
|
|
} else {
|
|
|
return this[method]();
|
|
|
}
|
|
|
},
|
|
|
|
|
|
render: function (view, model, mimeType) {
|
|
|
return function (resp) {
|
|
|
if (mimeType)
|
|
|
resp.type(mimeType);
|
|
|
resp.render(view, {
|
|
|
model: model
|
|
|
});
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
getChild: function (name) {
|
|
|
if (this.children && name in this.children) {
|
|
|
let child = this.children[name];
|
|
|
|
|
|
if (typeof child == "function") {
|
|
|
return child({
|
|
|
request: this.request,
|
|
|
parent: this,
|
|
|
name: name
|
|
|
});
|
|
|
} else if (child.hasOwnProperty("isInstanceOf") && child.isInstanceOf(resource)) {
|
|
|
return lang.mixin(child, {
|
|
|
request: this.request,
|
|
|
parent: this,
|
|
|
name: name
|
|
|
});
|
|
|
} else {
|
|
|
return new resource(lang.mixin(child, {
|
|
|
request: this.request,
|
|
|
parent: this,
|
|
|
name: name
|
|
|
}));
|
|
|
}
|
|
|
} else {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
|
|
|
return resource;
|
|
|
});
|