# Acties groeperen in een schema en input-definities hergebruiken

> Gebruik NEWSCHEMA() om samenhangende acties onder één naam te declareren en deel een input-definitie tussen acties met een bestand in jsonschemas/.

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

`NEWSCHEMA(name, fn)` groepeert de acties van één entiteit. De functie krijgt het schema-object en `schema.action(name, meta)` registreert een actie met de naam `Name/action`, met dezelfde opties als `NEWACTION()` (`input`, `output`, `params`, `user`, `permissions`, `action`...). Overal elders wordt de actie met zijn volledige naam gebruikt, precies alsof hij met `NEWACTION('Users/insert', ...)` was gedeclareerd: `ROUTE('POST /users/ --> *Users/insert')` of `ACTION('Users/insert', payload)`.

Een fragment van een input-definitie dat meerdere acties delen, zoals een adres, komt in een eigen bestand in `jsonschemas/`. Een `.txt`-bestand bevat dezelfde `name:Type`-lijst als `input`; de bestandsnaam is de naam van het schema. Verwijs er vanuit een `input` naar met `@Name`, en de velden (en welke daarvan verplicht zijn) worden bij de eigen velden van de actie gevoegd.

```text jsonschemas/Address.txt
*street:String, *city:String, zip:String
```

```js schemas/users.js
NEWSCHEMA('Users', function(schema) {

	schema.action('insert', {
		name: 'Create a user',
		input: '*name:String, @Address',
		output: 'id:UID, name:String, city:String',
		action: function($, model) {
			$.callback({ id: UID(), name: model.name, city: model.city });
		}
	});

	schema.action('count', {
		name: 'Count users',
		action: function($) {
			$.callback({ count: 2 });
		}
	});

});
```

```js controllers/users.js
exports.install = function() {
	ROUTE('POST /users/ --> *Users/insert');
	ROUTE('GET /users/count/ --> *Users/count');
};
```
