# Actie levenscyclus hooks, resultaat uitbreiding en administrator wachten

> Exerciseer oninput, onoutput, extend, sa en su met geldig, ongeldig en mislukte acties.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: nl
Content-SHA256: 65561a04e796fa67c3a9faa502dc61488c4fc5bab2d8f32963809cd94bf1860c
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`oninput($)` draait na de invoervalidatie en de gedeclareerde middleware, vlak vóór de actiefunctie. `onoutput(error,response,$)` draait op het pad van succesvolle afronding, na het filteren van de uitvoer en de optionele uitbreiding. In 0.0.19 roept een ongeldige invoer of `$.invalid()` deze hook niet aan; behandel hem niet als een universele fout- of finally-hook.

`extend:'result'` voegt het resultaat van de actie onder die sleutel toe aan zijn gevalideerde invoer en geeft de uitgebreide invoer terug. Een pad met punten gebruikt geneste toewijzing. Het is nuttig voor bewuste samenstelling van acties; het wijzigt het publieke contract van het antwoord.

Of `sa:true` of `su:true` vereist een gebruiker met een administratorvlag. Ze definiëren geen twee verschillende privileges. Normale toelating checks blijven gescheiden. Set deze administrator vlaggen alleen van vertrouwde server authenticatie.

```js 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);
}
```

```js 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));
};
```
