Skip to content

Type de ressource : Schéma Sanity (Document)
Fichier source : apps/studio/schemaTypes/submission.ts
Statut : Actif
Slice : 4 (Formulaire contact)
Version : 1.0


Schéma pour les soumissions de formulaire de contact. Contient les informations du soumetteur (nom, email, message), le statut de traitement, et les horodatages de soumission et de traitement. Créé automatiquement par le worker submission-processor.

  • ModĂ©liser les soumissions du formulaire de contact
  • Permettre le suivi du statut de traitement
  • Faciliter la gestion des soumissions dans le Sanity Studio
  • Supporter l’historique des soumissions avec horodatage
  • Stockage des soumissions du formulaire de contact
  • Suivi du statut de traitement (pending, processed, rejected)
  • Historique des soumissions avec horodatage
  • Interface pour la gestion des soumissions dans le Sanity Studio
Relation Schéma Type Description
Dépend de Aucun - Schéma indépendant
Utilisé par Aucun - Créé automatiquement par workers, non référencé

Nom du champ Type Obligatoire Description Validation
name string ✅ Nom du soumetteur Rule.required().min(2).max(100)
email string ✅ Email du soumetteur Rule.required().email()
message text ✅ Message du formulaire de contact Rule.required().min(10).max(2000)
status string ✅ Statut de traitement Options: pending, processed, rejected
submittedAt datetime ✅ Date et heure de soumission initialValue: new Date().toISOString()
processedAt datetime ❌ Date et heure de traitement Aucune

Aucun champ SEO spĂ©cifique n’est implĂ©mentĂ© dans ce schĂ©ma.

Aucun champ de contenu riche n’est implĂ©mentĂ© dans ce schĂ©ma.


Champ Type Validation Description
name string Rule.required().min(2).max(100) Nom du soumetteur
email string Rule.required().email() Email du soumetteur
message text Rule.required().min(10).max(2000) Message du formulaire
status string Options: pending, processed, rejected Statut de traitement
submittedAt datetime initialValue: new Date().toISOString() Date de soumission
processedAt datetime Aucune Date de traitement (optionnel)
Champ Type Description
_id string ID unique du document
_type string Type du document (submission)
_createdAt string Date de création (généré par Sanity)
_updatedAt string Date de derniÚre modification (généré par Sanity)
name string Nom du soumetteur
email string Email du soumetteur
message string Message du formulaire
status string Statut de traitement
submittedAt string Date et heure de soumission
processedAt string Date et heure de traitement (optionnel)
État Description Transition
pending Soumission en attente de traitement → processed ou rejected
processed Soumission traitĂ©e avec succĂšs → pending (retraitement)
rejected Soumission rejetĂ©e → pending (rĂ©examen)

apps/studio/schemaTypes/submission.ts
import { defineType, defineField } from 'sanity'
export default defineType({
name: 'submission',
title: 'Form Submission',
type: 'document',
fields: [
defineField({
name: 'name',
title: 'Name',
type: 'string',
description: 'Nom du soumetteur',
validation: (Rule) => Rule.required().min(2).max(100),
}),
defineField({
name: 'email',
title: 'Email',
type: 'string',
description: 'Email du soumetteur',
validation: (Rule) => Rule.required().email(),
}),
defineField({
name: 'message',
title: 'Message',
type: 'text',
description: 'Message du formulaire de contact',
validation: (Rule) => Rule.required().min(10).max(2000),
}),
defineField({
name: 'status',
title: 'Status',
type: 'string',
options: {
list: [
{ title: 'Pending', value: 'pending' },
{ title: 'Processed', value: 'processed' },
{ title: 'Rejected', value: 'rejected' },
],
layout: 'radio',
},
initialValue: 'pending',
}),
defineField({
name: 'submittedAt',
title: 'Submitted At',
type: 'datetime',
description: 'Date et heure de soumission',
initialValue: () => new Date().toISOString(),
}),
defineField({
name: 'processedAt',
title: 'Processed At',
type: 'datetime',
description: 'Date et heure de traitement',
}),
],
preview: {
select: {
title: 'name',
subtitle: 'email',
description: 'message',
},
prepare({ title, subtitle, description }) {
return {
title,
subtitle: `${subtitle} - ${description?.substring(0, 50)}...`,
}
},
},
orderings: [
{
title: 'Submitted At (Newest)',
name: 'submittedAtDesc',
by: [{field: 'submittedAt', direction: 'desc'}],
},
{
title: 'Submitted At (Oldest)',
name: 'submittedAtAsc',
by: [{field: 'submittedAt', direction: 'asc'}],
},
],
})
*[_type == "submission" && status == "pending"] {
_id,
name,
email,
message,
submittedAt
} | order(submittedAt desc)
*[_type == "submission" && _id == $id][0] {
_id,
name,
email,
message,
status,
submittedAt,
processedAt
}

Non implĂ©mentĂ© - sanity-typegen n’est pas configurĂ© dans le projet actuel.

// Types à implémenter manuellement si nécessaire
export type Submission = {
_id: string;
_type: 'submission';
name: string;
email: string;
message: string;
status: 'pending' | 'processed' | 'rejected';
submittedAt: string;
processedAt?: string;
};

Scénario Description Résultat attendu
Validation du nom Créer une soumission sans nom Erreur de validation
Validation de l’email CrĂ©er une soumission avec email invalide Erreur de validation
Validation du message Créer une soumission avec message < 10 caractÚres Erreur de validation
Limite du message Créer une soumission avec message > 2000 caractÚres Erreur de validation
Status par défaut Créer une soumission sans status Valeur par défaut pending appliquée
Scénario Dépendances Description Résultat attendu
CrĂ©ation par worker Form-handler → Queue → Submission-processor Soumettre un formulaire via l’API Document créé dans Sanity
Validation Zod Frontend + Worker Validation des entrées cÎté frontend Erreur retournée si validation échoue
Stockage dans Sanity Submission-processor + Sanity API Création du document dans Sanity Document créé avec tous les champs
Scénario Parcours utilisateur Description Résultat attendu
Soumission → Traitement Formulaire → API → Sanity → Studio Soumettre un formulaire complet Document visible dans Sanity Studio
Traitement manuel Studio → Changement status Passer le status de pending Ă  processed Status changĂ© avec succĂšs
Tri par date Studio → Ordering Trier les soumissions par date Soumissions triĂ©es correctement

Composant Type RĂŽle MĂ©thode d’intĂ©gration
Form-handler Worker L3 Validation et mise en queue Reçoit la soumission et l’envoie dans la Queue
Submission-processor Worker L3 Création du document Sanity Consomme la Queue et crée le document
Sanity Studio L1 Gestion des soumissions Interface pour visualiser et traiter les soumissions
Formulaire contact L2 Soumission du formulaire Envoie les donnĂ©es vers l’API submit
  • Ce schĂ©ma est créé automatiquement par le worker submission-processor
  • Le champ submittedAt est initialisĂ© par le frontend, processedAt par le worker
  • Les orderings personnalisĂ©s permettent un tri par date de soumission
  • Le preview affiche un rĂ©sumĂ© du message (50 premiers caractĂšres)
  • Validation stricte des entrĂ©es cĂŽtĂ© frontend (Zod) et backend (Sanity)
  • Le flux complet : Formulaire → API → form-handler → Queue → submission-processor → Sanity
  • 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)
  • Le flux de soumission fonctionne de bout en bout

  • ✅ Validation stricte des entrĂ©es cĂŽtĂ© frontend (Zod)
  • ✅ Validation des entrĂ©es cĂŽtĂ© backend (Sanity)
  • ✅ Les permissions Sanity sont configurĂ©es par rĂŽle
  • ✅ Les emails sont validĂ©s automatiquement
  • ✅ Le champ name est validĂ© (min 2, max 100 caractĂšres)
  • ✅ Le champ email est validĂ© (format email)
  • ✅ Le champ message est validĂ© (min 10, max 2000 caractĂšres)
  • ✅ Le champ status est limitĂ© aux options valides

Limite Valeur StratĂ©gie d’optimisation
Taille du document 16 MB Éviter les messages trop volumineux
Profondeur des références 10 niveaux Pas applicable (pas de références)
  • ✅ Utilisation de Queue Cloudflare pour le traitement asynchrone
  • ✅ Limitation de la taille du message (max 2000 caractĂšres)
  • ✅ Orderings personnalisĂ©s pour un tri efficace

SymptĂŽme Cause probable Solution
Soumission non créée Queue non configurée Vérifier la configuration Queue dans wrangler.toml
Document sans processedAt Worker échoué Vérifier les logs du worker submission-processor
Validation échoue Données invalides Vérifier les rÚgles de validation Zod et Sanity
Status ne change pas Permissions insuffisantes Vérifier les permissions Sanity Studio
Terminal window
# Extraire le schéma depuis Sanity
npx sanity schema extract
# Générer les types TypeScript (à implémenter)
npx sanity typegen generate
# Logs du worker submission-processor
wrangler tail submission-processor

  • ✅ 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
  • ✅ Utiliser defineField pour chaque champ
  • ✅ Configurer le preview pour une meilleure UX dans Studio
  • ✅ Utiliser des validations appropriĂ©es
  • ✅ Configurer les orderings pour un tri efficace
  • ✅ Mettre Ă  jour ce fichier lors de toute modification du schĂ©ma
  • ✅ RĂ©gĂ©nĂ©rer les types aprĂšs modification (Ă  implĂ©menter)
  • ✅ Tester le flux de soumission aprĂšs modification

  • ImplĂ©mentation de sanity-typegen pour la gĂ©nĂ©ration de types
  • Ajout de champs pour les piĂšces jointes
  • Notification automatique lors de nouvelles soumissions
  • Centralisation des requĂȘtes GROQ dans un fichier dĂ©diĂ©
  • ❌ Pas de champs SEO spĂ©cifiques
  • ❌ Types TypeScript non gĂ©nĂ©rĂ©s automatiquement
  • ❌ Pas de support pour les piĂšces jointes
  • ❌ Pas de notification automatique

  • Documentation Sanity : Schema Types
  • DAT L1 : §4 - ModĂ©lisation et SchĂ©mas des DonnĂ©es
  • SchĂ©mas dĂ©pendants : Aucun (schĂ©ma indĂ©pendant)
  • Workers associĂ©s : services/form-handler, services/submission-processor
  • Pages Astro : apps/web/src/pages/contact.astro, apps/web/src/pages/api/submit.ts
  • Queue Cloudflare : submissions-queue-dev / submissions-queue-prod
  • Configuration : services/form-handler/wrangler.toml, services/submission-processor/wrangler.toml

Date Version Description Auteur
2026-09-15 1.0 Création initiale Devin
Edit page

Last updated: