# Costruire una pipeline di elaborazione con i transform

> Registra più passaggi sotto un unico nome con NEWTRANSFORM() e fai passare un valore attraverso di essi in ordine con TRANSFORM().

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

Un transform è una catena di passaggi con un nome. `NEWTRANSFORM(name, fn, [id])` aggiunge un passaggio alla catena `name`; i passaggi vengono eseguiti nell'ordine di registrazione, e ciascuno riceve l'oggetto delle opzioni `$` e il valore corrente. Cambia il valore con `$.value = ...` e chiama `$.next()` per proseguire con il passaggio successivo. `$.invalid(message)` aggiunge un errore. `TRANSFORM(name, value)` avvia la catena e restituisce una promise con il valore finale; la promise viene rifiutata quando un passaggio ha segnalato un errore. Con una callback invece, `TRANSFORM(name, value, function(err, value) {})`. Un nome senza alcun passaggio restituisce il valore così com'è.

Usalo per il lavoro che deve poter essere esteso da più punti, come la pulizia di un commento prima di salvarlo: un filtro antispam, un rifilatore di spazi e un controllo dei link possono ciascuno vivere nel proprio file ed essere aggiunti o rimossi senza toccare il codice che chiama `TRANSFORM()`. L'`id` facoltativo permette di rimuovere un passaggio in seguito con `NEWTRANSFORM(name, null, id)`.

```js definitions/transforms.js
NEWTRANSFORM('comment', function($, value) {
	$.value = value.trim();
	$.next();
}, 'trim');

NEWTRANSFORM('comment', function($, value) {
	if (/spam/i.test(value))
		$.invalid('Spam is not allowed');
	$.next();
}, 'spam');

NEWTRANSFORM('comment', function($, value) {
	$.value = value.replace(/\s+/g, ' ');
	$.next();
}, 'spaces');
```

```js controllers/comments.js
exports.install = function() {
	ROUTE('POST /comment/ @json', comment);
	ROUTE('DELETE /comment/spaces/', remove_step);
};

async function comment($) {
	try {
		var text = await TRANSFORM('comment', $.body.text);
		$.json({ text: text });
	} catch (err) {
		$.json({ error: true });
	}
}

function remove_step($) {
	NEWTRANSFORM('comment', null, 'spaces');
	$.success();
}
```
