Author
Author
Documentation technique
Type de ressource : Schéma Sanity (Document)
Fichier source :apps/studio/schemaTypes/author.ts
Statut : Actif
Slice : 2 (Blog)
Version : 1.0
1. Vue d’ensemble (DOC)
1.1. Description
Schéma pour les profils d’auteurs d’articles de blog. Contient le nom, le slug, l’image de profil et une biographie en Portable Text simplifié.
1.2. Objectif
- Modéliser les profils d’auteurs avec leurs informations de base
- Permettre l’association d’auteurs aux articles de blog
- Supporter une biographie simple pour présenter les auteurs
- Faciliter l’affichage des informations d’auteur sur les articles
1.3. Cas d’usage
- Création de profils d’auteurs
- Association aux articles de blog via le champ
authordu schémapost - Affichage des informations de l’auteur sur les pages d’articles
- Gestion des biographies d’auteurs
1.4. Relations avec d’autres schémas
| Relation | Schéma | Type | Description |
|---|---|---|---|
| Utilisé par | post |
Référence | Les articles référencent les auteurs via le champ author |
| Dépend de | Aucun | - | Schéma indépendant |
2. Structure des données (DOC)
2.1. Champs principaux
| Nom du champ | Type | Obligatoire | Description | Validation |
|---|---|---|---|---|
name |
string |
✅ | Nom complet de l’auteur | Aucune |
slug |
slug |
✅ | Slug URL généré depuis le nom | source: 'name', maxLength: 96 |
image |
image |
❌ | Photo de profil de l’auteur | Hotspot activé |
bio |
array |
❌ | Biographie de l’auteur | Portable Text simplifié |
2.2. Champs SEO
Aucun champ SEO spécifique n’est implémenté dans ce schéma.
2.3. Champs de contenu riche
| Nom du champ | Type | Description |
|---|---|---|
bio |
array |
Biographie en Portable Text simplifié (style normal uniquement, pas de listes) |
3. Contrats d’Entrée/Sortie (SPEC)
3.1. Inputs (création/modification)
| Champ | Type | Validation | Description |
|---|---|---|---|
name |
string |
Aucune | Nom complet de l’auteur |
slug |
slug |
source: 'name', maxLength: 96 |
Généré automatiquement depuis le nom |
image |
image |
Aucune | Photo de profil (optionnel) |
bio |
array |
Aucune | Biographie en Portable Text simplifié (optionnel) |
3.2. Outputs (structure du document)1/2
| Champ | Type | Description |
|---|---|---|
_id |
string |
ID unique du document |
_type |
string |
Type du document (author) |
_createdAt |
string |
Date de création (généré par Sanity) |
_updatedAt |
string |
Date de dernière modification (généré par Sanity) |
3.2. Outputs (structure du document)2/2
| Champ | Type | Description |
|---|---|---|
name |
string |
Nom complet de l’auteur |
slug |
{ _type: 'slug'; current: string } |
Slug URL |
image |
ImageAsset |
Photo de profil (optionnel) |
bio |
PortableTextBlock[] |
Biographie (optionnel) |
3.3. États du document
Non implémenté - ce schéma n’a pas de champ status. Les documents sont toujours considérés comme publiés.
4. Implémentation (CODE)
4.1. Code du schéma1/2
4.1. Code du schéma2/2
import {defineField, defineType} from 'sanity'
export default defineType({ name: 'author', title: 'Author', type: 'document', fields: [ defineField({ name: 'name', title: 'Name', type: 'string', }), defineField({ name: 'slug', title: 'Slug', type: 'slug', options: { source: 'name', maxLength: 96, }, }), defineField({ name: 'image', title: 'Image', type: 'image', options: { hotspot: true, }, }), defineField({ name: 'bio', title: 'Bio', type: 'array', of: [ { title: 'Block', type: 'block', styles: [{title: 'Normal', value: 'normal'}], lists: [], }, ], }), ], preview: { select: { title: 'name', media: 'image', }, },})4.2. Requêtes GROQ associées
Requête principale (listing)
*[_type == "author"] { _id, name, slug, image} | order(name asc)Requête détaillée (page unitaire)
*[_type == "author" && slug.current == $slug][0] { _id, name, slug, image, bio}4.3. Types TypeScript (génération automatique)
Non implémenté - sanity-typegen n’est pas configuré dans le projet actuel.
// Types à implémenter manuellement si nécessaireexport type Author = { _id: string; _type: 'author'; name: string; slug: { _type: 'slug'; current: string }; image?: ImageAsset; bio?: PortableTextBlock[];};5. Tests attendus (TEST)
5.1. Tests unitaires
| Scénario | Description | Résultat attendu |
|---|---|---|
| Validation du nom | Créer un document sans nom | Erreur de validation |
| Génération du slug | Créer un document avec nom | Slug généré automatiquement depuis le nom |
| Limite du slug | Créer un nom de plus de 96 caractères | Slug tronqué à 96 caractères |
| Bio simplifiée | Créer une bio avec listes | Les listes ne sont pas disponibles (style normal uniquement) |
5.2. Tests d’intégration
| Scénario | Dépendances | Description | Résultat attendu |
|---|---|---|---|
| Consommation Astro | Route Astro + Sanity API | Récupération des données via GROQ | Données récupérées et typées correctement |
| Référence depuis post | Schéma post + author | Créer un article avec cet auteur | Référence fonctionnelle |
| Affichage dans article | Route blog/[…slug].astro | Afficher les infos de l’auteur | Nom et image affichés correctement |
5.3. Tests E2E
| Scénario | Parcours utilisateur | Description | Résultat attendu |
|---|---|---|---|
| Création → Association | Sanity Studio → Article | Créer un auteur et l’associer à un article | Auteur visible sur l’article |
| Modification → Propagation | Studio → Build → Site | Modifier la bio de l’auteur | Modification visible sur tous les articles |
6. Intégration (INTÉG)
6.1. Intégration avec les composants
| Composant | Type | Rôle | Méthode d’intégration |
|---|---|---|---|
| Schéma post | L1 | Référence vers l’auteur | Champ author de type reference |
| Route Astro (blog/[…slug].astro) | L2 | Affichage de l’auteur | Requête GROQ avec jointure vers author |
| Layout (BlogPost.astro) | L2 | Rendu des infos auteur | Props passées depuis la route |
6.2. Points d’attention
- Le champ
bioutilise un Portable Text simplifié (style normal uniquement, pas de listes) - Ce schéma n’a pas de slug dans l’URL actuelle (utilise l’_id pour les références)
- L’image est optionnelle mais recommandée pour l’affichage dans les articles
- Les auteurs peuvent être associés à plusieurs articles
6.3. Vérification de cohérence
- Le schéma ne casse aucun schéma existant
- Les requêtes GROQ retournent les données attendues
- Les types TypeScript sont générés correctement (à implémenter)
- Les références depuis post fonctionnent correctement
7. Sécurité
7.1. Mécanismes de sécurité
- ✅ Les images sont stockées dans Sanity Asset API avec accès contrôlé
- ✅ Les permissions Sanity sont configurées par rôle
- ✅ Les références depuis post sont validées par Sanity
7.2. Validation des entrées
- ✅ Le champ name est obligatoire
- ✅ Les slugs sont uniques et valides
- ✅ Les références depuis post pointent vers des documents existants
8. Performance et limites
8.1. Limites Sanity
| Limite | Valeur | Stratégie d’optimisation |
|---|---|---|
| Taille du document | 16 MB | Éviter les champs bio trop volumineux |
| Profondeur des références | 10 niveaux | Limiter les références imbriquées |
8.2. Optimisations appliquées
- ✅ Utilisation de projections GROQ pour réduire la taille des réponses
- ✅ Mise en cache CDN pour les requêtes en production
- ✅ Portable Text simplifié pour réduire la complexité
9. Débogage et troubleshooting
9.1. Problèmes courants
| Symptôme | Cause probable | Solution |
|---|---|---|
| Schéma non visible dans Studio | Cache du navigateur | Vider le cache et rafraîchir |
| Types TypeScript incorrects | Schéma modifié sans régénération | Exécuter sanity typegen generate (à implémenter) |
| Auteur non affiché dans article | Référence cassée | Vérifier que l’auteur existe et n’est pas supprimé |
| Bio avec listes ne fonctionne pas | Limitation du schéma simplifié | Utiliser uniquement le style normal |
9.2. Commandes de debug
# Extraire le schéma depuis Sanitynpx sanity schema extract
# Générer les types TypeScript (à implémenter)npx sanity typegen generate10. Bonnes pratiques
10.1. Architecture
- ✅ Toujours utiliser des types générés par sanity-typegen (à implémenter)
- ✅ Centraliser les requêtes GROQ dans
src/lib/queries.ts(à implémenter) - ✅ Documenter les champs et leurs validations
10.2. Code
- ✅ Utiliser
defineFieldpour chaque champ - ✅ Configurer le preview pour une meilleure UX dans Studio
- ✅ Utiliser des validations appropriées
10.3. Maintenance
- ✅ Mettre à jour ce fichier lors de toute modification du schéma
- ✅ Régénérer les types après modification (à implémenter)
- ✅ Tester les requêtes GROQ après modification
11. Évolutions et roadmap
11.1. Améliorations planifiées
- Implémentation de sanity-typegen pour la génération de types
- Ajout de champs SEO pour les profils d’auteurs
- Support de la bio avec Portable Text complet (listes, styles)
- Centralisation des requêtes GROQ dans un fichier dédié
11.2. Limitations connues
- ❌ Pas de support pour les drafts (pas de champ status)
- ❌ Pas de champs SEO spécifiques
- ❌ Types TypeScript non générés automatiquement
- ❌ Bio simplifiée (pas de listes ni styles avancés)
12. Ressources liées
- Documentation Sanity : Schema Types
- DAT L1 : §4 - Modélisation et Schémas des Données
- Schémas dépendants : Aucun (schéma indépendant)
- Schémas référençant :
post - Pages Astro consommatrices :
apps/web/src/pages/blog/[...slug].astro - Composants d’affichage :
apps/web/src/layouts/BlogPost.astro
13. Historique des modifications
| Date | Version | Description | Auteur |
|---|---|---|---|
| 2026-09-15 | 1.0 | Création initiale | Devin |