Technique/Architecture technique

Architecture technique

Vue d'ensemble du code Check Kit : stack, structure du dépôt, schéma de données Convex, routes et tests

Check Kit est construit sur le boilerplate NowStack : TanStack Start (React 19, rendu SSR + prérendu), Convex comme backend unique (base de données, fonctions, crons, HTTP) et Better Auth pour l'authentification et les organisations. L'application est multi-tenant : chaque table métier porte organizationId et tout accès passe par les wrappers d'autorisation de convex/auth/functions.ts.

Stack

CoucheTechnologie
FrontendTanStack Start + TanStack Router (routes fichiers), React 19, TailwindCSS v4, shadcn/base-ui
BackendConvex uniquement (pas de Prisma/PostgreSQL)
AuthBetter Auth via @convex-dev/better-auth (plugins organization, apiKey, emailOTP, admin)
FacturationStripe (actions Convex "use node" + webhook httpAction)
EmailsResend via composant @convex-dev/resend, templates react-email
FichiersCloudflare R2 (@aws-sdk/client-s3) pour photos et avatars
PDF@react-pdf/renderer (étiquettes, registre sanitaire, stocks)

Structure du dépôt

convex/           # Backend : schéma, fonctions, crons, routeur HTTP
src/routes/       # Routes TanStack (file-based)
src/features/     # Logique UI transverse (dialogs, formulaires, billing…)
content/docs|posts|changelog/   # Contenu MDX (docs, blog, changelog)
e2e/              # Tests Playwright
mobile-app/       # Projet Expo autonome (app mobile, backend Convex partagé)
scripts/          # Outillage (start-all, deploy Vercel, webhook Stripe…)
.agents/          # Skills et règles pour les agents IA

Schéma de données HACCP

Tout le schéma vit dans convex/schema.ts. Les tables cœur du métier :

TableRôleChamps clés
sitesÉtablissementnom, offre (light/premium/premium_pack)
lieuxZone d'un sitetype (froid/chaud/ambiant/nettoyage/stockage), seuilMin/seuilMax (consignes de température)
temperatureReadingsRelevés de températuretemperature, anomalie (calculée vs seuils du lieu), userId (ou iot:<deviceId>)
nettoyagesRelevés de nettoyagetaches[{libelle, fait}], debutAt/finAt
tracabiliteRéceptions et fabricationstype (reception/fabrication), numLot, dlc, photoUrls[] (R2), ingredients[], origine viande bovine, sortie
stockMouvementsHistorique de traçabilitétype (entree/mouvement/sortie/retour/modification)
capteursSondes IoTdeviceId (unique), token (secret serveur), lastTemperature
misesEnTemperatureRefroidissement / remise / cuissontempDebut/tempFin, anomalie
controlesHuileTests d'huile de friturefriteuse, conforme, action
nettoyagesPlanifies, controlesPlanifies, tachesPlanifieesRécurrences et rappelsfrequenceJours, prochaineEcheance, statut
denrees, fournisseurs, recettes, nettoyageZonesRéférentiels de paramétrage
optionsCheckKitModules optionnels par organisationallergenes, decongelation, origineViande, expeditions
alerteParametresSeuil d'alerte DLCjoursAvant (1–5)

Côté SaaS : subscriptions (abonnements Stripe, overrideLimits, remises admin_free), feedbacks, orgOnboarding, memberWelcome, demoRegistry (purge des données de démo), publicTokens (liens publics 256-bit).

Le dépôt contient aussi des tables héritées du socle « Formation Now » (trainings, sessions, learners, invoices, qualiopi…) : elles ne font pas partie du produit Check Kit mais restent dans le schéma.

Modules Convex

  • sites/, lieux/, temperatures/, nettoyages/, tracabilite/, misesEnTemperature/, controlesHuile/, capteurs/ — CRUD métier HACCP. Convention : mutations createX/updateX/deleteX, queries listBySite/getById. sites/helpers.ts expose requireSiteAccess.
  • denrees/, fournisseurs/, recettes/, nettoyageZones/, optionsCheckKit/, controlesPlanifies/, nettoyagesPlanifies/, tachesPlanifiees/ — paramétrage et planification (advancerProgramme, countDueByOrg, listDueBySite).
  • auth/ — configuration Better Auth (config.ts), wrappers orgQuery/orgMutation/orgAction (functions.ts), rôles et permissions (permissions.ts).
  • billing/plans.ts — définitions des plans, limites et helpers (voir la page Paramétrage & environnements).
  • stripe/actions.ts — checkout, portail de facturation, webhook (processWebhook).
  • email/ — envoi via Resend (sendMarkdownEmail), templates markdown avec logo.
  • apiKeys/ — résolution clé API → organisation pour l'API publique v1.
  • export/getFullExportData (export complet d'une organisation).
  • demo/ — jeu de données de démonstration (seedDemoData/removeDemoData).
  • admin/ — back-office SaaS (organisations, abonnements, feedbacks).

Crons (convex/crons.ts) : auto-complete expired sessions à 03:00 UTC et notify expiring DLC à 07:00 UTC (email quotidien d'alerte péremption aux admins, voir tracabilite/crons.ts).

Routeur HTTP (convex/http.ts) : POST /sensors/reading (ingestion capteurs), POST /stripe/webhook, et les endpoints GET /api/v1/* (API publique par clé API).

Routes frontend

  • (layout)/ — site public : docs, blog, changelog, contact, pages légales.
  • auth/ — connexion split-screen (code email + mot de passe + providers), inscription, ban, réinitialisation.
  • orgs/$orgSlug/(navigation)/l'application métier : temperatures/, nettoyages/, tracabilite/, stocks/, alertes/, recherche/ (+ registre PDF), parametres/ (sites, lieux, denrées, fournisseurs, recettes, capteurs, planifications), settings/ (billing, membres, clés API, export, danger), demo/, aide/.
  • admin/ — back-office SaaS (organisations, utilisateurs, MRR).
  • (logged-in)/account/ — profil, email, mot de passe, suppression de compte.
  • Routes spéciales : favicon.ts (pastille d'environnement dev/preview), sitemap.xml.ts, robots.txt.ts, feed.xml.ts, og.png.ts.

Chaque page métier suit le même motif : une route index.tsx avec pendingComponent (skeleton fidèle au layout final), des dialogs open-*-dialog.tsx pilotés par le dialog manager, et des schémas de validation *.schema.ts (zod).

Tests

  • Vitest (src/__tests__/, happy-dom) : socle NowStack — auth (plans, permissions, sessions, formulaires signin/signup), dialog manager, formulaires, utilitaires (dates françaises, slugs réservés, hooks). Lancer avec pnpm test:ci.
  • Playwright (e2e/) : parcours compte, admin, organisations (création, slug, membres, invitations), reset mot de passe, connexion en modal. Lancer avec pnpm test:e2e:ci.

Les modules HACCP (températures, traçabilité, capteurs) n'ont pas encore de couverture de test dédiée — les vérifications passent par le typecheck (pnpm ts) et les tests manuels en navigateur.