[Nom de la Configuration API Sanity]
Type de ressource : Configuration API Sanity (Client / Token / RequĂȘte)
Fichier source :src/lib/sanity.tsou configuration associée
Statut : [Actif / Déprécié / En développement]
1. Vue dâensemble
Section titled â1. Vue dâensembleâ1.1. Description
Section titled â1.1. Descriptionâ[Description concise du rĂŽle de cette configuration API dans lâarchitecture du site]
1.2. Objectif
Section titled â1.2. Objectifâ- [Objectif principal : ex. fournir un client Sanity typĂ© pour les requĂȘtes GROQ]
- [BĂ©nĂ©fice pour lâarchitecture]
1.3. PérimÚtre concerné
Section titled â1.3. PĂ©rimĂštre concernĂ©â- Environnements : [Development / Staging / Production]
- Couches utilisatrices : [L2 (Astro) / L3 (Workers) / Les deux]
- Types de requĂȘtes : [CDN / Preview / Mutations / etc.]
2. Architecture et flux
Section titled â2. Architecture et fluxâ2.1. Diagramme de flux
Section titled â2.1. Diagramme de fluxâ[Astro / Worker] â âŒ[Client Sanity (configurĂ©)] â âą DĂ©tection du mode preview â âą SĂ©lection du token appropriĂ© â âą Configuration du CDN âŒ[Sanity Content Lake API] â âą RequĂȘte GROQ â âą Validation des permissions âŒ[RĂ©ponse JSON typĂ©e]2.2. Composants impliquĂ©s
Section titled â2.2. Composants impliquĂ©sâ| Composant | RĂŽle | Couche |
|---|---|---|
getSanityClient() |
Factory de client Sanity avec détection de mode | L2 (Astro) |
createClient() |
Client Sanity de base (@sanity/client) | L2/L3 |
sanity-typegen |
Génération automatique de types TypeScript | Build time |
| Variables dâenvironnement | Configuration des tokens et IDs | Runtime |
3. Configuration
Section titled â3. Configurationâ3.1. Variables dâenvironnement requises
Section titled â3.1. Variables dâenvironnement requisesâ| Variable | Description | Obligatoire | Valeur par dĂ©faut |
|---|---|---|---|
PUBLIC_SANITY_PROJECT_ID |
ID du projet Sanity | â | - |
PUBLIC_SANITY_DATASET |
Nom du dataset (ex: production) |
â | - |
PUBLIC_SANITY_API_VERSION |
Version de lâAPI (ex: 2025-01-01) |
â | - |
SANITY_API_READ_TOKEN |
Token de lecture (pour preview) | â (en preview) | - |
SANITY_API_WRITE_TOKEN |
Token dâĂ©criture (pour mutations) | â | - |
3.2. Configuration du client (L2 - Astro)
Section titled â3.2. Configuration du client (L2 - Astro)âimport { createClient, type ClientConfig } from '@sanity/client';import type { AstroGlobal } from 'astro';
export function getSanityClient(astro: AstroGlobal) { const isPreview = astro.cookies.get('sanity-preview')?.value === 'true' || astro.request.headers.get('x-sanity-preview') === 'true';
const config: ClientConfig = { projectId: import.meta.env.PUBLIC_SANITY_PROJECT_ID, dataset: import.meta.env.PUBLIC_SANITY_DATASET, apiVersion: import.meta.env.PUBLIC_SANITY_API_VERSION, useCdn: !isPreview, // Désactive le CDN en preview perspective: isPreview ? 'previewDrafts' : 'published', token: isPreview ? import.meta.env.SANITY_API_READ_TOKEN : undefined, };
return createClient(config);}3.3. Configuration du client (L3 - Workers)
Section titled â3.3. Configuration du client (L3 - Workers)âimport { createClient } from '@sanity/client';
export interface Env { PUBLIC_SANITY_PROJECT_ID: string; PUBLIC_SANITY_DATASET: string; PUBLIC_SANITY_API_VERSION: string; SANITY_API_READ_TOKEN?: string;}
export function getSanityClient(env: Env, isPreview: boolean = false) { return createClient({ projectId: env.PUBLIC_SANITY_PROJECT_ID, dataset: env.PUBLIC_SANITY_DATASET, apiVersion: env.PUBLIC_SANITY_API_VERSION, useCdn: !isPreview, perspective: isPreview ? 'previewDrafts' : 'published', token: isPreview ? env.SANITY_API_READ_TOKEN : undefined, });}4. Typage et génération automatique
Section titled â4. Typage et gĂ©nĂ©ration automatiqueâ4.1. Configuration de sanity-typegen
Section titled â4.1. Configuration de sanity-typegenâ{ "path": "./src/**/*.{ts,tsx,astro}", "schema": "./schema.json", "generates": "./src/types/sanity.d.ts"}4.2. Commandes de gĂ©nĂ©ration
Section titled â4.2. Commandes de gĂ©nĂ©rationâ# GĂ©nĂ©rer le schĂ©ma depuis Sanitynpx sanity schema extract --enforce-required-fields
# Générer les types TypeScriptnpx sanity typegen generate4.3. Types générés (exemple)
Section titled â4.3. Types gĂ©nĂ©rĂ©s (exemple)â// src/types/sanity.d.ts (gĂ©nĂ©rĂ© automatiquement)export type Post = { _id: string; _type: 'post'; _createdAt: string; _updatedAt: string; title: string; slug: { _type: 'slug'; current: string }; publishedAt: string; status: 'draft' | 'published' | 'archived'; mainImage?: ImageAsset; excerpt?: string; body: PortableTextBlock[]; author?: Author; categories?: Category[]; seo?: SeoObject;};
export type Author = { _id: string; _type: 'author'; name: string; image?: ImageAsset; bio?: string;};
// ... autres types5. RequĂȘtes GROQ
Section titled â5. RequĂȘtes GROQâ5.1. RequĂȘte typĂ©e (exemple)
Section titled â5.1. RequĂȘte typĂ©e (exemple)âimport type { Post } from '../types/sanity';
export const POSTS_QUERY = `*[_type == "post" && status == "published"] { _id, title, slug, publishedAt, mainImage, excerpt} | order(publishedAt desc)`;
export const POST_BY_SLUG_QUERY = `*[_type == "post" && slug.current == $slug][0] { ..., author->{name, image}, categories[]->{title, slug}}`;
// Utilisationconst client = getSanityClient(Astro);const posts = await client.fetch<Post[]>(POSTS_QUERY);const post = await client.fetch<Post>(POST_BY_SLUG_QUERY, { slug: 'mon-article' });5.2. Bonnes pratiques GROQ
Section titled â5.2. Bonnes pratiques GROQâ- â
Toujours typer les résultats avec
client.fetch<T>() - â
Utiliser des projections explicites (éviter
*non filtrĂ©) - â
Filtrer par
status == "published"sauf en mode preview - â
Utiliser
order()pour trier les rĂ©sultats - â
Limiter les résultats avec
[0...10]si nécessaire
6. Sécurité
Section titled â6. SĂ©curitĂ©â6.1. Gestion des tokens
Section titled â6.1. Gestion des tokensâ| Token | Permissions | Stockage | Exposition |
|---|---|---|---|
PUBLIC_SANITY_PROJECT_ID |
Lecture publique | .env |
CĂŽtĂ© client â |
PUBLIC_SANITY_DATASET |
Lecture publique | .env |
CĂŽtĂ© client â |
SANITY_API_READ_TOKEN |
Lecture des drafts | Cloudflare Secrets | Runtime uniquement â |
SANITY_API_WRITE_TOKEN |
Ăcriture (mutations) | Cloudflare Secrets | Runtime uniquement â |
6.2. RÚgles de sécurité
Section titled â6.2. RĂšgles de sĂ©curitĂ©â- â
Les tokens publics (
PUBLIC_*) peuvent ĂȘtre exposĂ©s cĂŽtĂ© client - â
Les tokens privés (
SANITY_API_*) ne doivent jamais ĂȘtre exposĂ©s cĂŽtĂ© client - â Utiliser des tokens avec les permissions minimales nĂ©cessaires
- â Rotation rĂ©guliĂšre des tokens (tous les 90 jours recommandĂ©)
- â RĂ©voquer immĂ©diatement les tokens compromis
6.3. Permissions Sanity
Section titled â6.3. Permissions SanityâConfiguration dans Sanity Studio :
- Settings â API â Tokens
- Créer des tokens avec des scopes spécifiques :
read: Lecture uniquementwrite: Ăcriture (crĂ©ation, modification, suppression)
7. Performance
Section titled â7. Performanceâ7.1. StratĂ©gie de cache
Section titled â7.1. StratĂ©gie de cacheâ| Mode | useCdn |
Rationale |
|---|---|---|
| Production (SSG) | true |
Contenu mis en cache par Sanity CDN |
| Preview | false |
Contenu draft non caché |
| Mutations | false |
Données fraßches aprÚs écriture |
7.2. Optimisation des requĂȘtes
Section titled â7.2. Optimisation des requĂȘtesâ- â Utiliser des projections pour rĂ©duire la taille des rĂ©ponses
- â Filtrer cĂŽtĂ© serveur plutĂŽt que cĂŽtĂ© client
- â
Mettre en cache les résultats fréquents (Astro
getStaticPaths) - â
Utiliser
stega(string encoding) pour les éditeurs visuels si nécessaire
7.3. Limites et quotas
Section titled â7.3. Limites et quotasâ| Limite | Valeur | Rationale |
|---|---|---|
| Taille max requĂȘte | 16 KB | Limite Sanity API |
| Taille max réponse | 100 MB | Limite Sanity API |
| RequĂȘtes par seconde | 100 (Free) / 1000 (Pro) | Quota Sanity |
| Temps de réponse | < 5s recommandé | UX optimale |
8. Débogage et troubleshooting
Section titled â8. DĂ©bogage et troubleshootingâ8.1. ProblĂšmes courants
Section titled â8.1. ProblĂšmes courantsâ| SymptĂŽme | Cause probable | Solution |
|---|---|---|
| âMissing project IDâ | Variable dâenv manquante | VĂ©rifier PUBLIC_SANITY_PROJECT_ID |
| âInvalid tokenâ | Token expirĂ© ou incorrect | RĂ©gĂ©nĂ©rer le token dans Sanity Studio |
| âPermission deniedâ | Token sans les bonnes permissions | VĂ©rifier les scopes du token |
| Contenu draft en production | Mode preview activé par erreur | Vérifier le cookie sanity-preview |
| Types TypeScript incorrects | Schéma Sanity modifié | Régénérer les types avec sanity typegen generate |
8.2. Logs et monitoring
Section titled â8.2. Logs et monitoringâ// Logs Ă vĂ©rifier en cas de problĂšmeconsole.log('Sanity client config', { projectId: config.projectId, dataset: config.dataset, useCdn: config.useCdn, perspective: config.perspective});
// VĂ©rifier les requĂȘtes dans l'onglet Network du navigateur// VĂ©rifier les logs Sanity Studio â Settings â API â Activity8.3. Tests manuels
Section titled â8.3. Tests manuelsâ# Test de requĂȘte GROQ via curlcurl "https://[project-id].api.sanity.io/v2025-01-01/data/query/[dataset]?query=*[_type=='post'][0...5]" \ -H "Authorization: Bearer [token]"9. Bonnes pratiques
Section titled â9. Bonnes pratiquesâ9.1. Architecture
Section titled â9.1. Architectureâ- â
Centraliser la configuration du client dans
src/lib/sanity.ts - â
SĂ©parer les requĂȘtes GROQ dans
src/lib/queries.ts - â
Toujours typer les résultats avec
sanity-typegen - â Utiliser des factory functions pour crĂ©er les clients (flexibilitĂ©)
9.2. Code
Section titled â9.2. Codeâ- â
Utiliser
async/awaitpour les requĂȘtes - â
Gérer les erreurs avec
try/catch - â Logger les erreurs de requĂȘte pour le debugging
- â Ne jamais hardcoder les IDs de projet ou datasets
9.3. Environnements
Section titled â9.3. Environnementsâ- â Utiliser des variables dâenvironnement diffĂ©rentes par environnement
- â Tester en staging avant production
- â Documenter les diffĂ©rences de configuration entre environnements
10. Ăvolutions et roadmap
Section titled â10. Ăvolutions et roadmapâ10.1. AmĂ©liorations planifiĂ©es
Section titled â10.1. AmĂ©liorations planifiĂ©esâ- [Ăvolution 1 : ex. ImplĂ©mentation de revalidation Ă la demande (ISR)]
- [Ăvolution 2 : ex. Cache distribuĂ© avec Cloudflare KV]
- [Ăvolution 3 : ex. Monitoring des performances des requĂȘtes]
10.2. Limitations connues
Section titled â10.2. Limitations connuesâ- â Le CDN Sanity ne peut pas ĂȘtre invalidĂ© manuellement (TTL de 60s)
- â Les mutations ne sont pas disponibles cĂŽtĂ© client (SSG uniquement)
- â Le mode preview dĂ©sactive le CDN (impact sur les performances)
11. Ressources liées
Section titled â11. Ressources liĂ©esâ- Documentation Sanity : API Reference
- Documentation @sanity/client : npm package
- sanity-typegen : Documentation
- DAT L1 : §4.5 - API Sanity et StratĂ©gie de RequĂȘtes
- DAT L2 : §5.2 - Intégration Sanity dans Astro
- Fichiers concernés :
src/lib/sanity.tssrc/lib/queries.tssrc/types/sanity.d.tssanity-typegen.config.json
12. Historique des modifications
Section titled â12. Historique des modificationsâ| Date | Version | Description | Auteur |
|---|---|---|---|
| YYYY-MM-DD | 1.0 | Création initiale | [Nom] |
| YYYY-MM-DD | 1.1 | [Modification] | [Nom] |