Vues
Une vue est une classe de schéma créée à partir d'une entité :
/** Ce qu'un auteur peut écrire. */
export class PostDraft extends Post.pick('slug', 'title', 'summary', 'body') {}
/** Ce que l'index public montre — pas de body. */
export class PostCard extends Post.pick('id', 'slug', 'title', 'summary', 'publishedAt') {}
/** L'entrée d'une opération de lecture custom. */
export class BySlugInput extends Post.pick('slug') {}
Une vue est une classe de schéma complète : elle a getFields(), validate(), et
s'utilise comme type TypeScript. Les vues se chaînent : Post.pick(…).partial().
Les quatre dérivations
| Dérivation | Produit |
|---|---|
Post.pick('a', 'b') | ces champs seulement |
Post.omit('a') | tous les champs sauf ceux-là |
Post.partial() | chaque champ optionnel : un champ absent n'est pas mis à jour |
Post.extend({ extra: text() }) | l'entité plus des champs — c'est ainsi que User étend AuthUser |
Le mode partial est conservé lorsque la vue est utilisée comme entrée d'une opération.
Où les vues se branchent
- Entrées de handler — déclarez la vue comme type du paramètre ; la façade valide le body du fil contre elle avant votre code (Handlers).
- Sorties de handler —
Crud(Post, { list: PostCard })nomme la vue d'une opération ;Crud(Post, PostPublic)restreint tout le handler (Handlers). - Formulaires —
useFormFor(PostDraft)dérive ses champs de la vue (Formulaires).
Les projections io
L'axe boundary dérive deux ensembles de champs que toutes les surfaces utilisent :
inputFields(Post.getFields()) // les champs qu'un client peut ÉCRIRE — readOnly exclus
outputFields(Post.getFields()) // les champs qu'un client peut LIRE — writeOnly exclus
C'est pourquoi un formulaire bâti sur Post n'affiche pas d'inputs status ou
publishedAt, sans configuration supplémentaire par formulaire.
Choisir entre un champ et une vue
readOnly / writeOnly et pick / omit peuvent tous retirer un champ d'une surface,
mais leur portée diffère.
- boundary (sur le champ) définit une règle globale. Avec
writeOnly(password), le mot de passe est exclu de toutes les sorties. - pick / omit (sur une vue) choisit les champs d'un usage précis. Par exemple,
Post.pick('id', 'title')définit la réponse de l'index public.
Ces deux mécanismes sont complémentaires.
- Sans
writeOnlysur le champ, chaque vue de sortie devrait penser à omettrepassword. La règle globale évite cet oubli. - Une réponse publique (
id,title) et une réponse admin (+ authorEmail) ont en revanche besoin de vues différentes :authorEmailest inclus ou exclu selon l'usage.
Le critère est la portée de la règle : globale ou propre à un usage.
| Le fait est… | Il vit… | Exemple |
|---|---|---|
| vrai partout (invariant) | sur le champ — readOnly / writeOnly | un mot de passe ne sort jamais |
| vrai pour un usage (local) | en dérivation — pick / omit | cet endpoint ne renvoie que id + titre |
Une règle boundary est sérialisée dans la carte sous
x-fougere.boundary. Un consommateur dans un autre langage peut donc l'appliquer. Une vue
dérivée en TypeScript n'est pas sérialisée.
Suite : La carte d'identité — la forme portable du schéma.