# Le cycle de vie d'action, l'extension du résultat et les gardes administrateurs

> Exercer l'entrée, la sortie, l'extension, le sa et le su avec des actions valides, inexistantes et échouées.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: fr
Content-SHA256: 8b800bd9e3b9694acb10a7547d513e503626c027e09e207e4f88790ddf680939
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`oninput($)` s'exécute après la validation de l'entrée et le middleware déclaré, juste avant la fonction de l'action. `onoutput(error,response,$)` s'exécute sur le chemin de fin réussie, après le filtrage de la sortie et l'extension facultative. Dans 0.0.19, une entrée invalide ou `$.invalid()` n'appelle pas ce hook ; ne le traitez pas comme un hook universel d'erreur ou de finally.

`extend:'result'` ajoute le résultat de l'action à son entrée validée sous cette clé et renvoie l'entrée étendue. Un chemin avec des points utilise une affectation imbriquée. C'est utile pour une composition délibérée d'actions ; cela change le contrat public de la réponse.

Que ce soit `sa:true` ou `su:true` nécessite un utilisateur avec une bande d'administrateur. Ils ne définissent pas deux tiers de privilège différents. Les vérifications normales restent séparées.

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