# Construire un pipeline de traitement avec des transforms

> Enregistrez plusieurs étapes sous un même nom avec NEWTRANSFORM() et faites passer une valeur par elles dans l'ordre avec TRANSFORM().

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

Un transform est une chaîne d'étapes nommée. `NEWTRANSFORM(name, fn, [id])` ajoute une étape à la chaîne `name` ; les étapes s'exécutent dans l'ordre de leur enregistrement, et chacune reçoit l'objet d'options `$` et la valeur courante. Changez la valeur avec `$.value = ...` et appelez `$.next()` pour passer à l'étape suivante. `$.invalid(message)` ajoute une erreur. `TRANSFORM(name, value)` démarre la chaîne et renvoie une promesse avec la valeur finale ; la promesse est rejetée quand une étape a signalé une erreur. Avec un callback à la place, `TRANSFORM(name, value, function(err, value) {})`. Un nom sans aucune étape renvoie la valeur telle quelle.

Utilisez-le pour un travail qui doit pouvoir être étendu depuis plusieurs endroits, comme le nettoyage d'un commentaire avant son enregistrement : un filtre anti-spam, un nettoyeur d'espaces et un vérificateur de liens peuvent chacun vivre dans leur propre fichier et être ajoutés ou retirés sans toucher au code qui appelle `TRANSFORM()`. L'`id` facultatif permet de retirer une étape plus tard avec `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();
}
```
