<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>LeHub on LaDoc</title><link>https://docs.fresquesystemique.org/lehub/</link><description>Recent content in LeHub on LaDoc</description><generator>Hugo</generator><language>fr-FR</language><atom:link href="https://docs.fresquesystemique.org/lehub/index.xml" rel="self" type="application/rss+xml"/><item><title>Fonctionnalités</title><link>https://docs.fresquesystemique.org/lehub/fonctionnalites/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/lehub/fonctionnalites/</guid><description>&lt;h1 id="fonctionnalités"&gt;Fonctionnalités&lt;a class="anchor" href="#fonctionnalit%c3%a9s"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;LeHub couvre toute la vie de l&amp;rsquo;association : gestion des membres et de leurs parcours, organisation des ateliers, paiements, contenus éditoriaux, e-mails transactionnels et badges numériques. Ce catalogue suit le découpage de l&amp;rsquo;application en deux espaces, membres et admin.&lt;/p&gt;
&lt;h2 id="espace-membres"&gt;Espace membres&lt;a class="anchor" href="#espace-membres"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="tableau-de-bord"&gt;Tableau de bord&lt;a class="anchor" href="#tableau-de-bord"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Chaque membre arrive sur un tableau de bord personnalisé qui s&amp;rsquo;adapte à son rôle (adhérent, animateur·ice, formateur·ice) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;statut de cotisation en pastille cliquable (À jour, Expirée, Interne, Exempt), synchronisé automatiquement avec HelloAsso ;&lt;/li&gt;
&lt;li&gt;progression dans les parcours (deux axes indépendants : animateur·ice / formateur·ice, chacun décliné citoyen·ne / pro) ;&lt;/li&gt;
&lt;li&gt;badges Open Badges obtenus.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="profil"&gt;Profil&lt;a class="anchor" href="#profil"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Photo personnalisée ou Gravatar, bio, tagline « En une ligne », genre, localisation, téléphone, liaison LinkedIn (OAuth), changement de mot de passe et suppression de compte.&lt;/p&gt;</description></item><item><title>Stack technique</title><link>https://docs.fresquesystemique.org/lehub/stack/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/lehub/stack/</guid><description>&lt;h1 id="stack-technique"&gt;Stack technique&lt;a class="anchor" href="#stack-technique"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="technologies"&gt;Technologies&lt;a class="anchor" href="#technologies"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Couche&lt;/th&gt;
					&lt;th&gt;Technologie&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Framework&lt;/td&gt;
					&lt;td&gt;Next.js 16 (App Router, React Server Components)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Langage&lt;/td&gt;
					&lt;td&gt;TypeScript, React 19&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Authentification&lt;/td&gt;
					&lt;td&gt;NextAuth v5 (sessions JWT, LinkedIn OAuth)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Base de données&lt;/td&gt;
					&lt;td&gt;PostgreSQL 18, ORM Prisma 5&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Styles&lt;/td&gt;
					&lt;td&gt;Tailwind CSS 4, composants shadcn/ui&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Paiements&lt;/td&gt;
					&lt;td&gt;HelloAsso (checkout intents et webhooks)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;E-mails&lt;/td&gt;
					&lt;td&gt;Resend&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Tests&lt;/td&gt;
					&lt;td&gt;Jest (environnement jsdom), Testing Library&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Infra&lt;/td&gt;
					&lt;td&gt;Docker, Nginx, GitHub Actions&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="structure-du-code"&gt;Structure du code&lt;a class="anchor" href="#structure-du-code"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="trois-espaces-de-routes"&gt;Trois espaces de routes&lt;a class="anchor" href="#trois-espaces-de-routes"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;L&amp;rsquo;App Router organise l&amp;rsquo;application en espaces, chacun avec son &lt;code&gt;layout.tsx&lt;/code&gt; qui fait le contrôle d&amp;rsquo;accès :&lt;/p&gt;</description></item><item><title>Modèle de données</title><link>https://docs.fresquesystemique.org/lehub/donnees/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/lehub/donnees/</guid><description>&lt;h1 id="modèle-de-données"&gt;Modèle de données&lt;a class="anchor" href="#mod%c3%a8le-de-donn%c3%a9es"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Le schéma Prisma (&lt;code&gt;prisma/schema.prisma&lt;/code&gt;) est la source de vérité : 28 modèles, que l&amp;rsquo;on peut regrouper en cinq domaines. La base est partagée avec LeBoard, qui possède ses propres tables dans le même schéma.&lt;/p&gt;
&lt;h2 id="les-relations-au-cœur-du-système"&gt;Les relations au cœur du système&lt;a class="anchor" href="#les-relations-au-c%c5%93ur-du-syst%c3%a8me"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid" &gt;
erDiagram
 Member ||--o{ WorkshopAnimator : anime
 Workshop ||--o{ WorkshopAnimator : &amp;#34;animé par (lead/co)&amp;#34;
 Workshop ||--o{ Registration : &amp;#34;reçoit&amp;#34;
 Participant ||--o{ Registration : &amp;#34;s&amp;#39;inscrit&amp;#34;
 Workshop ||--o{ WaitlistEntry : &amp;#34;liste d&amp;#39;attente&amp;#34;
 Workshop }o--|| Organisation : &amp;#34;rattaché à (optionnel)&amp;#34;
 Member ||--o{ OrganisationManager : &amp;#34;gère&amp;#34;
 Organisation ||--o{ OrganisationManager : &amp;#34;gérée par&amp;#34;
 Member ||--o{ CotisationPayment : &amp;#34;cotise&amp;#34;
 Member ||--o{ BadgeAssertion : &amp;#34;reçoit des badges&amp;#34;
 Workshop }o--|| WorkshopModel : &amp;#34;modèle de plateau&amp;#34;
 Workshop ||--o| Board : &amp;#34;plateau en ligne&amp;#34;
&lt;/pre&gt;
&lt;p&gt;Deux entités jouent des rôles proches mais distincts :&lt;/p&gt;</description></item><item><title>Lancer en local</title><link>https://docs.fresquesystemique.org/lehub/developpement/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/lehub/developpement/</guid><description>&lt;h1 id="lancer-en-local"&gt;Lancer en local&lt;a class="anchor" href="#lancer-en-local"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="prérequis"&gt;Prérequis&lt;a class="anchor" href="#pr%c3%a9requis"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Node.js 20 ou plus récent&lt;/li&gt;
&lt;li&gt;Docker (pour PostgreSQL) ou une instance PostgreSQL locale&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="installation"&gt;Installation&lt;a class="anchor" href="#installation"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone &amp;lt;dépôt LeHub&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd LeHub
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp .env.example .env.local
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# remplir les variables (voir tableau ci-dessous)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx prisma migrate dev &lt;span style="color:#75715e"&gt;# crée la base et applique les migrations&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run db:seed &lt;span style="color:#75715e"&gt;# données de démarrage (optionnel)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run dev &lt;span style="color:#75715e"&gt;# http://localhost:3000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="variables-denvironnement"&gt;Variables d&amp;rsquo;environnement&lt;a class="anchor" href="#variables-denvironnement"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les valeurs ne sont jamais documentées ici ; seul le nom et le rôle de chaque variable le sont. Les variables e-mail et HelloAsso peuvent aussi se configurer depuis l&amp;rsquo;admin (la valeur en base prime alors sur la variable d&amp;rsquo;environnement).&lt;/p&gt;</description></item><item><title>Déploiement</title><link>https://docs.fresquesystemique.org/lehub/deploiement/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://docs.fresquesystemique.org/lehub/deploiement/</guid><description>&lt;h1 id="déploiement"&gt;Déploiement&lt;a class="anchor" href="#d%c3%a9ploiement"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;h2 id="le-pipeline"&gt;Le pipeline&lt;a class="anchor" href="#le-pipeline"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Le déploiement est automatique : chaque push sur &lt;code&gt;main&lt;/code&gt; déclenche le workflow GitHub Actions &lt;code&gt;deploy.yml&lt;/code&gt;, qui se connecte au VPS en SSH et exécute :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;git pull&lt;/code&gt; du dépôt&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose build --no-cache app&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;npx prisma migrate deploy&lt;/code&gt; sur le conteneur PostgreSQL&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker compose up -d --no-deps app&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo systemctl reload nginx&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="mermaid" &gt;
flowchart LR
 DEV[Commit sur main] --&amp;gt; GH[GitHub Actions]
 GH -- SSH --&amp;gt; VPS[VPS]
 VPS --&amp;gt; B[build de l&amp;#39;image]
 B --&amp;gt; M[migrations Prisma]
 M --&amp;gt; U[remplacement du conteneur]
 U --&amp;gt; N[reload Nginx]
&lt;/pre&gt;&lt;script src="https://docs.fresquesystemique.org/mermaid.min.js" onload="mermaid.initialize({&amp;#34;flowchart&amp;#34;:{&amp;#34;useMaxWidth&amp;#34;:true},&amp;#34;theme&amp;#34;:&amp;#34;default&amp;#34;})"&gt;&lt;/script&gt;
&lt;p&gt;Si une migration échoue, le déploiement s&amp;rsquo;arrête avant le remplacement du conteneur : la version précédente continue de tourner.&lt;/p&gt;</description></item></channel></rss>