# Aktionslivscykel hål, resultat förlängning och administratör guards

> Öva oninput, onoutput, extend, sa och su med giltiga, ogiltiga och misslyckade åtgärder.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: sv
Content-SHA256: 15f1bceaa2f45759e17aa795bc94ad9a4026f790feaa2039f0112dfeec96014b
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`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.

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