Scaffold V1: auth, profils et leaderboard
Next.js 16 + Tailwind + Supabase (Auth, Postgres, Storage). Connexion par pseudo/mot de passe via email interne dérivé, RLS avec points protégés au niveau colonne, pages login/signup/leaderboard/profile. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -29,7 +29,7 @@ Application web pour animer et scorer le jeu **« Le Tribunal »** entre amis pe
|
||||
|
||||
## Prérequis
|
||||
|
||||
- [Node.js](https://nodejs.org/) 18 ou supérieur
|
||||
- [Node.js](https://nodejs.org/) 20.19+ (Next.js 16 / React 19)
|
||||
- Un compte [Supabase](https://supabase.com/) (offre gratuite suffisante)
|
||||
- Un compte [Vercel](https://vercel.com/) pour le déploiement (optionnel en local)
|
||||
|
||||
@@ -40,17 +40,17 @@ Application web pour animer et scorer le jeu **« Le Tribunal »** entre amis pe
|
||||
### 1. Cloner et installer
|
||||
|
||||
```bash
|
||||
git clone https://github.com/<votre-compte>/le-tribunal.git
|
||||
cd le-tribunal
|
||||
git clone ssh://git@git.alxczl.fr:7878/valentin/tribunal-app.git
|
||||
cd tribunal-app
|
||||
npm install
|
||||
```
|
||||
|
||||
### 2. Créer le projet Supabase
|
||||
|
||||
1. Créez un nouveau projet sur [supabase.com](https://supabase.com/).
|
||||
2. Dans **SQL Editor**, exécutez le contenu de [`supabase/schema.sql`](supabase/schema.sql) (table `profiles` + policies RLS).
|
||||
3. Dans **Storage**, créez un bucket **public** nommé `avatars`.
|
||||
4. Récupérez l'URL du projet et la clé `anon` dans **Project Settings → API**.
|
||||
2. Dans **SQL Editor**, exécutez le contenu de [`supabase/schema.sql`](supabase/schema.sql) (table `profiles`, policies RLS, bucket `avatars`).
|
||||
3. Récupérez l'URL du projet et la clé `anon` dans **Project Settings → API**.
|
||||
4. Dans **Authentication → Providers → Email**, **désactivez "Confirm email"**. L'app utilise des adresses techniques fictives (`pseudo@letribunal.test`) qui ne peuvent recevoir aucun email : si la confirmation reste activée, personne ne peut se connecter après inscription.
|
||||
|
||||
### 3. Variables d'environnement
|
||||
|
||||
@@ -99,18 +99,21 @@ L'application tourne sur [http://localhost:3000](http://localhost:3000).
|
||||
## Structure du projet
|
||||
|
||||
```
|
||||
le-tribunal/
|
||||
├─ app/
|
||||
│ ├─ login/page.tsx # Connexion (pseudo + mot de passe)
|
||||
│ ├─ signup/page.tsx # Création de compte + upload photo
|
||||
│ ├─ leaderboard/page.tsx # Classement de tous les inscrits
|
||||
│ ├─ profile/page.tsx # Édition du profil + déconnexion
|
||||
│ ├─ layout.tsx # Layout + navigation
|
||||
│ └─ page.tsx # Redirection selon l'état de connexion
|
||||
├─ components/ # Composants UI réutilisables
|
||||
├─ lib/supabase/ # Clients Supabase (browser / server)
|
||||
├─ supabase/schema.sql # Schéma + policies RLS (versionné)
|
||||
├─ middleware.ts # Protection des routes + session
|
||||
tribunal-app/
|
||||
├─ src/
|
||||
│ ├─ app/
|
||||
│ │ ├─ login/page.tsx # Connexion (pseudo + mot de passe)
|
||||
│ │ ├─ signup/page.tsx # Création de compte + upload photo
|
||||
│ │ ├─ leaderboard/page.tsx # Classement de tous les inscrits
|
||||
│ │ ├─ profile/ # Édition du profil + déconnexion
|
||||
│ │ ├─ layout.tsx # Layout + navigation
|
||||
│ │ └─ page.tsx # Redirection selon l'état de connexion
|
||||
│ ├─ components/ # Composants UI réutilisables (Avatar, NavBar)
|
||||
│ ├─ lib/
|
||||
│ │ ├─ auth.ts # slugify / email interne dérivé du pseudo
|
||||
│ │ └─ supabase/ # Clients Supabase (browser / server / proxy)
|
||||
│ └─ proxy.ts # Protection des routes + rafraîchissement session
|
||||
├─ supabase/schema.sql # Schéma + policies RLS + bucket avatars (versionné)
|
||||
├─ .env.local.example
|
||||
└─ README.md
|
||||
```
|
||||
@@ -119,7 +122,7 @@ le-tribunal/
|
||||
|
||||
## Authentification
|
||||
|
||||
La connexion se fait par **pseudo + mot de passe**, sans email visible. En interne, un email technique est dérivé du pseudo (`slug@letribunal.local`) pour s'appuyer sur Supabase Auth. Le pseudo affiché est stocké dans la table `profiles`, et son unicité est vérifiée à l'inscription.
|
||||
La connexion se fait par **pseudo + mot de passe**, sans email visible. En interne, un email technique est dérivé du pseudo (`slug@letribunal.test`) pour s'appuyer sur Supabase Auth — `.test` est un TLD réservé (RFC 2606), accepté par le validateur d'email de Supabase (`.local` est rejeté). Le pseudo affiché est stocké dans la table `profiles`, et son unicité est vérifiée à l'inscription.
|
||||
|
||||
> Pas de réinitialisation de mot de passe par email en V1 (cercle d'amis, pas d'email réel collecté). Un administrateur peut réinitialiser un mot de passe depuis la console Supabase si nécessaire.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user