Skip to content

[Nom de la Configuration API Sanity]

Type de ressource : Configuration API Sanity (Client / Token / RequĂȘte)
Fichier source : src/lib/sanity.ts ou configuration associée
Statut : [Actif / Déprécié / En développement]

[Description concise du rîle de cette configuration API dans l’architecture du site]

  • [Objectif principal : ex. fournir un client Sanity typĂ© pour les requĂȘtes GROQ]
  • [BĂ©nĂ©fice pour l’architecture]
  • Environnements : [Development / Staging / Production]
  • Couches utilisatrices : [L2 (Astro) / L3 (Workers) / Les deux]
  • Types de requĂȘtes : [CDN / Preview / Mutations / etc.]
[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]
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
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) ❌ -
src/lib/sanity.ts
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);
}
services/[worker-name]/src/index.ts
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,
});
}
sanity-typegen.config.json
{
"path": "./src/**/*.{ts,tsx,astro}",
"schema": "./schema.json",
"generates": "./src/types/sanity.d.ts"
}
Terminal window
# Générer le schéma depuis Sanity
npx sanity schema extract --enforce-required-fields
# Générer les types TypeScript
npx sanity typegen generate
// 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 types
src/lib/queries.ts
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}
}`;
// Utilisation
const client = getSanityClient(Astro);
const posts = await client.fetch<Post[]>(POSTS_QUERY);
const post = await client.fetch<Post>(POST_BY_SLUG_QUERY, { slug: 'mon-article' });
  • ✅ 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
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 ❌
  • ✅ 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

Configuration dans Sanity Studio :

  • Settings → API → Tokens
  • CrĂ©er des tokens avec des scopes spĂ©cifiques :
    • read : Lecture uniquement
    • write : Écriture (crĂ©ation, modification, suppression)
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
  • ✅ 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
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
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
// Logs à vérifier en cas de problÚme
console.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 → Activity
Terminal window
# Test de requĂȘte GROQ via curl
curl "https://[project-id].api.sanity.io/v2025-01-01/data/query/[dataset]?query=*[_type=='post'][0...5]" \
-H "Authorization: Bearer [token]"
  • ✅ 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Ă©)
  • ✅ Utiliser async/await pour 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
  • ✅ Utiliser des variables d’environnement diffĂ©rentes par environnement
  • ✅ Tester en staging avant production
  • ✅ Documenter les diffĂ©rences de configuration entre environnements
  • [É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]
  • ❌ 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)
  • 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.ts
    • src/lib/queries.ts
    • src/types/sanity.d.ts
    • sanity-typegen.config.json
Date Version Description Auteur
YYYY-MM-DD 1.0 Création initiale [Nom]
YYYY-MM-DD 1.1 [Modification] [Nom]
Edit page

Last updated: