Aktionslivscykel hål, resultat förlängning och administratör guards
oninput($) körs efter indatavalideringen och den deklarerade middleware, strax före åtgärdens funktion. onoutput(error,response,$) körs på den lyckade avslutningsvägen, efter utdatafiltrering och den valfria utvidgningen. I 0.0.19 anropar en ogiltig indata eller $.invalid() inte den här hooken; behandla den inte som en universell fel- eller finally-hook.
extend:'result' lägger till åtgärdens resultat till dess validerade indata under den nyckeln och returnerar den utvidgade indatan. En sökväg med punkter använder nästlad tilldelning. Det är användbart för avsiktlig sammansättning av åtgärder; det ändrar svarets publika kontrakt.
Antingen sa:true eller su:true kräver en användare med antingen administratörs flagga. De definierar inte två olika privilegier. Normala tillståndskontroller förblir separata.
MAIN.hooks = [];
AUTH(function($) {
var role = $.headers['x-demo-role'];
if (role === 'sa' || role === 'su') $.success({ id:'admin', [role]:true });
else if (role === 'member') $.success({id:'member'});
else $.invalid();
});
NEWACTION('Hooks|extend', {
input: '*name:String',
extend: 'result',
oninput: function($) { MAIN.hooks.push('input:' + $.payload.name); },
onoutput: function(err, response) { MAIN.hooks.push('output:' + response.result.greeting); },
action: function($, model) { $.callback({greeting:'Hello ' + model.name}); }
});
NEWACTION('Hooks|fail', {
onoutput: function() { MAIN.hooks.push('unexpected'); },
action: function($) { $.invalid('failed'); }
});
for (var flag of ['sa','su']) {
var action = { action:function($) { $.success(); } };
action[flag] = true;
NEWACTION('Hooks|' + flag, action);
}exports.install = function() {
ROUTE('POST /extend/ @json --> Hooks|extend');
ROUTE('GET /fail/ --> Hooks|fail');
ROUTE('GET /sa/ --> Hooks|sa');
ROUTE('GET /su/ --> Hooks|su');
ROUTE('GET /hook-events/', $ => $.json(MAIN.hooks));
};