ForgeTotal.js 5
de

Total.js 5

Action-Lebenszyklus, Ergebnisverlängerung und Administrator Guards

Total.js 5 · total5@0.0.19 total5reference Mit Total.js 5 ausgeführt

oninput($) läuft nach der Eingabevalidierung und der deklarierten Middleware, unmittelbar vor der Aktionsfunktion. onoutput(error,response,$) läuft auf dem Pfad des erfolgreichen Abschlusses, nach der Ausgabefilterung und der optionalen Erweiterung. In 0.0.19 ruft eine ungültige Eingabe oder $.invalid() diesen Hook nicht auf; behandle ihn nicht als universellen Fehler- oder Finally-Hook.

extend:'result' fügt das Ergebnis der Aktion unter diesem Schlüssel zu ihrer validierten Eingabe hinzu und gibt die erweiterte Eingabe zurück. Ein Pfad mit Punkten verwendet verschachtelte Zuweisung. Es ist nützlich für die bewusste Komposition von Aktionen; es ändert den öffentlichen Vertrag der Antwort.

Egal ob sa:true oder su:true erfordert einen Benutzer mit einer Administrator-Flagge. Sie definieren keine zwei verschiedene Privileg-Tier. Normale Genehmigungsprüfungen bleiben getrennt.

definitions/hooks.js
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);
}
controllers/hooks.js
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));
};