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érivationProduit
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 handlerCrud(Post, { list: PostCard }) nomme la vue d'une opération ; Crud(Post, PostPublic) restreint tout le handler (Handlers).
  • FormulairesuseFormFor(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 writeOnly sur le champ, chaque vue de sortie devrait penser à omettre password. 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 : authorEmail est 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 / writeOnlyun mot de passe ne sort jamais
vrai pour un usage (local)en dérivation — pick / omitcet 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.

Construit avec Fougere — ce site tourne sur le framework qu'il documente.