Type de ressource : Schéma Sanity (Document)
Fichier source :apps/studio/schemaTypes/post.ts
Statut : Actif
Slice : 2 (Blog)
Version : 1.0
1. Vue dâensemble (DOC)
Section titled â1. Vue dâensemble (DOC)â1.1. Description
Section titled â1.1. DescriptionâSchĂ©ma principal pour les articles de blog du site. Contient les mĂ©tadonnĂ©es de lâarticle (titre, slug, auteur, image, catĂ©gories, date de publication) et le corps du texte en Portable Text.
1.2. Objectif
Section titled â1.2. Objectifâ- ModĂ©liser les articles de blog avec toutes les mĂ©tadonnĂ©es nĂ©cessaires
- Permettre lâassociation dâauteurs et de catĂ©gories aux articles
- Supporter le contenu riche via Portable Text
- Faciliter le rendu et lâindexation des articles
1.3. Cas dâusage
Section titled â1.3. Cas dâusageâ- CrĂ©ation et Ă©dition dâarticles de blog
- Affichage des articles sur la page dâindex du blog
- Rendu des articles individuels avec leur contenu complet
- Filtrage et tri des articles par auteur, catégories et date
1.4. Relations avec dâautres schĂ©mas
Section titled â1.4. Relations avec dâautres schĂ©masâ| Relation | SchĂ©ma | Type | Description |
|---|---|---|---|
| Dépend de | author |
Référence | Chaque article a un auteur obligatoire |
| Dépend de | category |
Référence | Un article peut avoir plusieurs catégories |
| Dépend de | blockContent |
Composition | Le champ body utilise le schéma blockContent |
| UtilisĂ© par | Aucun | - | SchĂ©ma racine, non rĂ©fĂ©rencĂ© par dâautres |
2. Structure des données (DOC)
Section titled â2. Structure des donnĂ©es (DOC)â2.1. Champs principaux
Section titled â2.1. Champs principauxâ| Nom du champ | Type | Obligatoire | Description | Validation |
|---|---|---|---|---|
title |
string |
â | Titre de lâarticle de blog | Aucune |
slug |
slug |
â | Slug URL gĂ©nĂ©rĂ© depuis le titre | source: 'title', maxLength: 96 |
author |
reference |
â | RĂ©fĂ©rence vers un auteur | RĂ©fĂ©rence vers author |
mainImage |
image |
â | Image principale de lâarticle | Hotspot activĂ© |
categories |
array |
â | Liste des catĂ©gories | RĂ©fĂ©rences vers category |
publishedAt |
datetime |
â | Date et heure de publication | Aucune |
body |
blockContent |
â | Corps du texte en Portable Text | Utilise le schĂ©ma blockContent |
2.2. Champs SEO
Section titled â2.2. Champs SEOâAucun champ SEO spĂ©cifique nâest implĂ©mentĂ© dans ce schĂ©ma.
2.3. Champs de contenu riche
Section titled â2.3. Champs de contenu richeâ| Nom du champ | Type | Description |
|---|---|---|
body |
array |
Contenu Portable Text (blocs + spans) via le schéma blockContent |
3. Contrats dâEntrĂ©e/Sortie (SPEC)
Section titled â3. Contrats dâEntrĂ©e/Sortie (SPEC)â3.1. Inputs (crĂ©ation/modification)
Section titled â3.1. Inputs (crĂ©ation/modification)â| Champ | Type | Validation | Description |
|---|---|---|---|
title |
string |
Aucune | Titre de lâarticle |
slug |
slug |
source: 'title', maxLength: 96 |
Généré automatiquement depuis le titre |
author |
reference |
Référence vers author |
Auteur obligatoire |
publishedAt |
datetime |
Aucune | Date de publication |
body |
blockContent |
Aucune | Contenu de lâarticle |
3.2. Outputs (structure du document)
Section titled â3.2. Outputs (structure du document)â| Champ | Type | Description |
|---|---|---|
_id |
string |
ID unique du document |
_type |
string |
Type du document (post) |
_createdAt |
string |
Date de création (généré par Sanity) |
_updatedAt |
string |
Date de derniÚre modification (généré par Sanity) |
title |
string |
Titre de lâarticle |
slug |
{ _type: 'slug'; current: string } |
Slug URL |
author |
Author |
Référence vers le schéma author |
mainImage |
ImageAsset |
Image principale (optionnel) |
categories |
Category[] |
Liste des catégories (optionnel) |
publishedAt |
string |
Date de publication |
body |
PortableTextBlock[] |
Contenu Portable Text |
3.3. Ătats du document
Section titled â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)
Section titled â4. ImplĂ©mentation (CODE)â4.1. Code du schĂ©ma
Section titled â4.1. Code du schĂ©maâimport {defineField, defineType} from 'sanity'
export default defineType({ name: 'post', title: 'Post', type: 'document', fields: [ defineField({ name: 'title', title: 'Title', type: 'string', }), defineField({ name: 'slug', title: 'Slug', type: 'slug', options: { source: 'title', maxLength: 96, }, }), defineField({ name: 'author', title: 'Author', type: 'reference', to: {type: 'author'}, }), defineField({ name: 'mainImage', title: 'Main image', type: 'image', options: { hotspot: true, }, }), defineField({ name: 'categories', title: 'Categories', type: 'array', of: [{type: 'reference', to: {type: 'category'}}], }), defineField({ name: 'publishedAt', title: 'Published at', type: 'datetime', }), defineField({ name: 'body', title: 'Body', type: 'blockContent', }), ],
preview: { select: { title: 'title', author: 'author.name', media: 'mainImage', }, prepare(selection) { const {author} = selection return {...selection, subtitle: author && `by ${author}`} }, },})4.2. RequĂȘtes GROQ associĂ©es
Section titled â4.2. RequĂȘtes GROQ associĂ©esâRequĂȘte principale (listing)
Section titled âRequĂȘte principale (listing)â*[_type == "post"] { _id, title, slug, publishedAt, mainImage, author->{name, slug}, categories[]->{title, slug}} | order(publishedAt desc)RequĂȘte dĂ©taillĂ©e (page unitaire)
Section titled âRequĂȘte dĂ©taillĂ©e (page unitaire)â*[_type == "post" && slug.current == $slug][0] { _id, title, slug, publishedAt, mainImage, author->{name, slug, image, bio}, categories[]->{title, slug, description}, body}4.3. Types TypeScript (gĂ©nĂ©ration automatique)
Section titled â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 Post = { _id: string; _type: 'post'; title: string; slug: { _type: 'slug'; current: string }; author: Author; mainImage?: ImageAsset; categories?: Category[]; publishedAt: string; body: PortableTextBlock[];};5. Tests attendus (TEST)
Section titled â5. Tests attendus (TEST)â5.1. Tests unitaires
Section titled â5.1. Tests unitairesâ| ScĂ©nario | Description | RĂ©sultat attendu |
|---|---|---|
| Validation du titre | Créer un document sans titre | Erreur de validation |
| Validation de lâauteur | CrĂ©er un document sans auteur | Erreur de validation |
| Génération du slug | Créer un document avec titre | Slug généré automatiquement depuis le titre |
| Limite du slug | Créer un titre de plus de 96 caractÚres | Slug tronqué à 96 caractÚres |
5.2. Tests dâintĂ©gration
Section titled â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 |
| Indexation Pagefind | Build Astro + Pagefind | Indexation du contenu généré | Contenu des articles indexé et searchable |
| Preview Sanity | Sanity Studio + Preview API | Mode preview pour les drafts | Preview fonctionne avec le secret |
5.3. Tests E2E
Section titled â5.3. Tests E2Eâ| ScĂ©nario | Parcours utilisateur | Description | RĂ©sultat attendu |
|---|---|---|---|
| CrĂ©ation â Publication | Sanity Studio â Build â Site | CrĂ©er et publier un article | Article visible sur le site avec toutes les mĂ©tadonnĂ©es |
| Filtrage par catĂ©gorie | Blog â Filtre catĂ©gorie | Cliquer sur une catĂ©gorie | Articles filtrĂ©s par catĂ©gorie |
6. IntĂ©gration (INTĂG)
Section titled â6. IntĂ©gration (INTĂG)â6.1. IntĂ©gration avec les composants
Section titled â6.1. IntĂ©gration avec les composantsâ| Composant | Type | RĂŽle | MĂ©thode dâintĂ©gration |
|---|---|---|---|
| Route Astro (blog/index.astro) | L2 | Listing des articles | RequĂȘte GROQ via getSanityClient() |
| Route Astro (blog/[âŠslug].astro) | L2 | Page article individuelle | RequĂȘte GROQ dĂ©taillĂ©e via getSanityClient() |
| Layout (BlogPost.astro) | L2 | Rendu de lâarticle | Props passĂ©es depuis la route |
| Pagefind | L2 | Indexation | Indexation du HTML généré par Astro |
6.2. Points dâattention
Section titled â6.2. Points dâattentionâ- Le schĂ©ma ne supporte pas les drafts (pas de champ status)
- Les requĂȘtes GROQ doivent utiliser les projections explicites
- Le slug est utilisé pour générer les URLs des articles
- Lâauteur est obligatoire pour chaque article
6.3. Vérification de cohérence
Section titled â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 tests E2E passent
7. Sécurité
Section titled â7. SĂ©curitĂ©â7.1. MĂ©canismes de sĂ©curitĂ©
Section titled â7.1. MĂ©canismes de sĂ©curitĂ©â- â Les rĂ©fĂ©rences vers author et category sont validĂ©es par Sanity
- â Les images sont stockĂ©es dans Sanity Asset API avec accĂšs contrĂŽlĂ©
- â Les permissions Sanity sont configurĂ©es par rĂŽle
7.2. Validation des entrées
Section titled â7.2. Validation des entrĂ©esâ- â Les champs obligatoires (title, author, publishedAt, body) sont validĂ©s cĂŽtĂ© Sanity
- â Les slugs sont uniques et valides
- â Les rĂ©fĂ©rences vers author et category pointent vers des documents existants
8. Performance et limites
Section titled â8. Performance et limitesâ8.1. Limites Sanity
Section titled â8.1. Limites Sanityâ| Limite | Valeur | StratĂ©gie dâoptimisation |
|---|---|---|
| Taille du document | 16 MB | Ăviter les champs body trop volumineux |
| Profondeur des rĂ©fĂ©rences | 10 niveaux | Limiter les rĂ©fĂ©rences imbriquĂ©es (author â categories) |
8.2. Optimisations appliquées
Section titled â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
- â Preview configurĂ© pour dĂ©sactiver le CDN en mode draft
9. Débogage et troubleshooting
Section titled â9. DĂ©bogage et troubleshootingâ9.1. ProblĂšmes courants
Section titled â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) |
| RequĂȘte GROQ vide | Filtre incorrect | VĂ©rifier la syntaxe GROQ |
| Auteur non affichĂ© | RĂ©fĂ©rence cassĂ©e | VĂ©rifier que lâauteur existe et nâest pas supprimĂ© |
9.2. Commandes de debug
Section titled â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
Section titled â10. Bonnes pratiquesâ10.1. Architecture
Section titled â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
Section titled â10.2. Codeâ- â
Utiliser
defineFieldpour chaque champ - â Configurer le preview pour une meilleure UX dans Studio
- â Utiliser des validations appropriĂ©es
10.3. Maintenance
Section titled â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
Section titled â11. Ăvolutions et roadmapâ11.1. AmĂ©liorations planifiĂ©es
Section titled â11.1. AmĂ©liorations planifiĂ©esâ- Ajout de champs SEO (metaTitle, metaDescription, ogImage)
- Implémentation de sanity-typegen pour la génération de types
- Ajout dâun champ status pour supporter les drafts
- Centralisation des requĂȘtes GROQ dans un fichier dĂ©diĂ©
11.2. Limitations connues
Section titled â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
12. Ressources liées
Section titled â12. Ressources liĂ©esâ- Documentation Sanity : Schema Types
- DAT L1 : §4 - Modélisation et Schémas des Données
- Schémas dépendants :
author,category,blockContent - Pages Astro consommatrices :
apps/web/src/pages/blog/index.astro,apps/web/src/pages/blog/[...slug].astro - Composants dâaffichage :
apps/web/src/layouts/BlogPost.astro
13. Historique des modifications
Section titled â13. Historique des modificationsâ| Date | Version | Description | Auteur |
|---|---|---|---|
| 2026-09-15 | 1.0 | Création initiale | Devin |