@lastbrain/module-auth 0.1.10 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -498
- package/dist/auth.build.config.d.ts.map +1 -1
- package/dist/auth.build.config.js +25 -1
- package/dist/components/Doc.d.ts +8 -1
- package/dist/components/Doc.d.ts.map +1 -1
- package/dist/components/Doc.js +20 -3
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/web/admin/user-detail.d.ts +10 -1
- package/dist/web/admin/user-detail.d.ts.map +1 -1
- package/dist/web/admin/user-detail.js +10 -2
- package/dist/web/admin/users/[id].d.ts.map +1 -1
- package/dist/web/admin/users/[id].js +2 -1
- package/dist/web/auth/dashboard.d.ts.map +1 -1
- package/dist/web/auth/folder.d.ts +2 -0
- package/dist/web/auth/folder.d.ts.map +1 -0
- package/dist/web/auth/folder.js +43 -0
- package/package.json +2 -2
- package/src/auth.build.config.ts +25 -1
- package/src/components/Doc.tsx +255 -187
- package/src/index.ts +4 -1
- package/src/web/admin/user-detail.tsx +38 -1
- package/src/web/admin/users/[id].tsx +3 -1
- package/src/web/auth/dashboard.tsx +1 -0
- package/src/web/auth/folder.tsx +101 -0
package/README.md
CHANGED
|
@@ -1,554 +1,128 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 📦 Module auth
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> @lastbrain/module-auth
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 📋 Informations
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
- **Nom du package**: `@lastbrain/module-auth`
|
|
8
|
+
- **Slug**: `module-auth`
|
|
9
|
+
- **Type**: Module LastBrain
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
- 🛠️ **API routes** - Gestion utilisateur et administration
|
|
11
|
-
- 🗄️ **Schema DB** - Tables et permissions Supabase
|
|
12
|
-
- 👤 **Gestion profils** - Informations personnelles et préférences
|
|
13
|
-
- 🛡️ **Sécurité** - Protection RLS et rôles admin
|
|
11
|
+
## 📄 Pages Disponibles
|
|
14
12
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
> **Recommandé :** Utilisez le CLI LastBrain pour créer une application complète avec le module auth
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
# Créer une nouvelle application avec le module auth inclus
|
|
21
|
-
pnpx @lastbrain/app@latest init mon-app
|
|
22
|
-
# Sélectionner "🔐 Authentication" lors de la création
|
|
23
|
-
|
|
24
|
-
cd mon-app
|
|
25
|
-
pnpm db:init # Applique automatiquement les migrations
|
|
26
|
-
pnpm dev
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## 📦 Installation manuelle
|
|
30
|
-
|
|
31
|
-
Si vous intégrez LastBrain dans un projet existant :
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
pnpm add @lastbrain/module-auth @lastbrain/core @lastbrain/ui
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Puis ajoutez le module à votre projet LastBrain :
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
pnpm lastbrain add-module auth
|
|
41
|
-
pnpm build:modules
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## Configuration
|
|
45
|
-
|
|
46
|
-
### Prérequis
|
|
47
|
-
|
|
48
|
-
1. **Supabase configuré** : Vous devez avoir un projet Supabase avec les variables d'environnement suivantes :
|
|
49
|
-
|
|
50
|
-
```env
|
|
51
|
-
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
|
|
52
|
-
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
2. **Migrations appliquées** : Appliquez la migration fournie dans `supabase/migrations/20251112000000_user_init.sql` pour créer les tables nécessaires.
|
|
56
|
-
|
|
57
|
-
3. **Fonction RPC is_superadmin** : Assurez-vous que la fonction `is_superadmin` est disponible (généralement fournie par la migration de base de l'app).
|
|
58
|
-
|
|
59
|
-
### Configuration de la fonction is_superadmin
|
|
60
|
-
|
|
61
|
-
La fonction `is_superadmin` vérifie si un utilisateur a le rôle d'administrateur. Elle est définie dans la migration de base et examine les métadonnées utilisateur :
|
|
62
|
-
|
|
63
|
-
```sql
|
|
64
|
-
CREATE OR REPLACE FUNCTION public.is_superadmin(user_id uuid)
|
|
65
|
-
RETURNS boolean
|
|
66
|
-
LANGUAGE sql
|
|
67
|
-
STABLE
|
|
68
|
-
SECURITY DEFINER
|
|
69
|
-
SET search_path = public, auth
|
|
70
|
-
AS $function$
|
|
71
|
-
SELECT COALESCE((
|
|
72
|
-
SELECT
|
|
73
|
-
COALESCE((raw_app_meta_data ->> 'is_super_admin')::boolean, FALSE)
|
|
74
|
-
OR COALESCE((raw_user_meta_data ->> 'is_super_admin')::boolean, FALSE)
|
|
75
|
-
OR COALESCE((raw_app_meta_data -> 'roles') ? 'admin', FALSE)
|
|
76
|
-
OR COALESCE((raw_user_meta_data -> 'roles') ? 'admin', FALSE)
|
|
77
|
-
FROM auth.users
|
|
78
|
-
WHERE id = user_id
|
|
79
|
-
), FALSE);
|
|
80
|
-
$function$;
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## Pages Web Fournies
|
|
84
|
-
|
|
85
|
-
Le module fournit plusieurs composants React prêts à l'emploi utilisant HeroUI :
|
|
86
|
-
|
|
87
|
-
### Pages Utilisateur Authentifié
|
|
88
|
-
|
|
89
|
-
#### 1. Dashboard (`/auth/dashboard`)
|
|
90
|
-
|
|
91
|
-
**Component**: `DashboardPage`
|
|
92
|
-
|
|
93
|
-
Tableau de bord utilisateur affichant :
|
|
94
|
-
|
|
95
|
-
- Résumé du profil avec avatar
|
|
96
|
-
- Email et date de création du compte
|
|
97
|
-
- Statut du compte
|
|
98
|
-
- Statistiques rapides (projets, tâches, etc.)
|
|
99
|
-
|
|
100
|
-
**Usage** :
|
|
101
|
-
|
|
102
|
-
```tsx
|
|
103
|
-
import { DashboardPage } from "@lastbrain/module-auth";
|
|
104
|
-
|
|
105
|
-
export default function Dashboard() {
|
|
106
|
-
return <DashboardPage />;
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
#### 2. Profil (`/auth/profile`)
|
|
111
|
-
|
|
112
|
-
**Component**: `ProfilePage`
|
|
13
|
+
### Pages Publiques
|
|
113
14
|
|
|
114
|
-
|
|
15
|
+
- **GET** `/signin` - SignInPage
|
|
16
|
+
- **GET** `/signup` - SignUpPage
|
|
17
|
+
- **GET** `/reset-password` - ResetPassword
|
|
115
18
|
|
|
116
|
-
|
|
117
|
-
- Informations professionnelles (entreprise, site web, localisation)
|
|
118
|
-
- Préférences (langue, timezone, avatar)
|
|
19
|
+
### Pages Protégées (Auth)
|
|
119
20
|
|
|
120
|
-
**
|
|
21
|
+
- **GET** `/dashboard` - DashboardPage
|
|
22
|
+
- **GET** `/folder` - FolderPage
|
|
23
|
+
- **GET** `/reglage` - ReglagePage
|
|
24
|
+
- **GET** `/profile` - ProfilePage
|
|
121
25
|
|
|
122
|
-
|
|
123
|
-
import { ProfilePage } from "@lastbrain/module-auth";
|
|
26
|
+
### Pages Admin
|
|
124
27
|
|
|
125
|
-
|
|
126
|
-
return <ProfilePage />;
|
|
127
|
-
}
|
|
128
|
-
```
|
|
28
|
+
- **GET** `/users` - AdminUsersPage
|
|
129
29
|
|
|
130
|
-
|
|
30
|
+
## 🔌 API Routes
|
|
131
31
|
|
|
132
|
-
|
|
32
|
+
### `/api/auth/signin`
|
|
133
33
|
|
|
134
|
-
|
|
34
|
+
**Méthodes supportées**: GET, POST, PUT, DELETE
|
|
135
35
|
|
|
136
|
-
|
|
137
|
-
- Apparence (thème)
|
|
138
|
-
- Langue et région (langue, timezone)
|
|
36
|
+
### `/api/auth/profile`
|
|
139
37
|
|
|
140
|
-
**
|
|
38
|
+
**Méthodes supportées**: GET, POST, PUT, DELETE
|
|
141
39
|
|
|
142
|
-
|
|
143
|
-
import { ReglagePage } from "@lastbrain/module-auth";
|
|
40
|
+
### `/api/auth/me`
|
|
144
41
|
|
|
145
|
-
|
|
146
|
-
return <ReglagePage />;
|
|
147
|
-
}
|
|
148
|
-
```
|
|
42
|
+
**Méthodes supportées**: GET, POST, PUT, DELETE
|
|
149
43
|
|
|
150
|
-
###
|
|
44
|
+
### `/api/admin/users`
|
|
151
45
|
|
|
152
|
-
|
|
46
|
+
**Méthodes supportées**: GET, POST, PUT, DELETE
|
|
153
47
|
|
|
154
|
-
|
|
48
|
+
## 🗄️ Base de Données
|
|
155
49
|
|
|
156
|
-
|
|
50
|
+
### Tables
|
|
157
51
|
|
|
158
|
-
|
|
52
|
+
#### `user_profil`
|
|
159
53
|
|
|
160
54
|
```tsx
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
55
|
+
<TableStructure
|
|
56
|
+
tableName="user_profil"
|
|
57
|
+
title="user_profil"
|
|
58
|
+
description="Table user_profil du module auth"
|
|
59
|
+
/>
|
|
166
60
|
```
|
|
167
61
|
|
|
168
|
-
####
|
|
169
|
-
|
|
170
|
-
**Component**: `SignUpPage`
|
|
171
|
-
|
|
172
|
-
Page d'inscription avec validation des champs.
|
|
173
|
-
|
|
174
|
-
**Usage** :
|
|
62
|
+
#### `user_address`
|
|
175
63
|
|
|
176
64
|
```tsx
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
65
|
+
<TableStructure
|
|
66
|
+
tableName="user_address"
|
|
67
|
+
title="user_address"
|
|
68
|
+
description="Table user_address du module auth"
|
|
69
|
+
/>
|
|
182
70
|
```
|
|
183
71
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
#### 6. Gestion des Utilisateurs (`/admin/users`)
|
|
187
|
-
|
|
188
|
-
**Component**: `AdminUsersPage`
|
|
189
|
-
|
|
190
|
-
Page d'administration pour lister et gérer tous les utilisateurs.
|
|
191
|
-
**Accès réservé aux super admins uniquement.**
|
|
192
|
-
|
|
193
|
-
Fonctionnalités :
|
|
194
|
-
|
|
195
|
-
- Liste de tous les utilisateurs
|
|
196
|
-
- Recherche par email ou nom
|
|
197
|
-
- Pagination
|
|
198
|
-
- Affichage des informations (email, rôle, date de création)
|
|
199
|
-
|
|
200
|
-
**Usage** :
|
|
72
|
+
#### `user_notifications`
|
|
201
73
|
|
|
202
74
|
```tsx
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
## Routes API
|
|
211
|
-
|
|
212
|
-
Le module expose plusieurs routes API pour la gestion des utilisateurs et profils.
|
|
213
|
-
|
|
214
|
-
### API Authentification (`/api/auth/*`)
|
|
215
|
-
|
|
216
|
-
#### GET `/api/auth/me`
|
|
217
|
-
|
|
218
|
-
Récupère les informations de l'utilisateur connecté et son profil.
|
|
219
|
-
|
|
220
|
-
**Réponse** :
|
|
221
|
-
|
|
222
|
-
```json
|
|
223
|
-
{
|
|
224
|
-
"data": {
|
|
225
|
-
"id": "uuid",
|
|
226
|
-
"email": "user@example.com",
|
|
227
|
-
"created_at": "2024-01-01T00:00:00Z",
|
|
228
|
-
"profile": {
|
|
229
|
-
"first_name": "John",
|
|
230
|
-
"last_name": "Doe",
|
|
231
|
-
"avatar_url": "https://...",
|
|
232
|
-
"bio": "...",
|
|
233
|
-
"phone": "...",
|
|
234
|
-
"company": "...",
|
|
235
|
-
"website": "...",
|
|
236
|
-
"location": "...",
|
|
237
|
-
"language": "en",
|
|
238
|
-
"timezone": "UTC",
|
|
239
|
-
"preferences": {}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
}
|
|
75
|
+
<TableStructure
|
|
76
|
+
tableName="user_notifications"
|
|
77
|
+
title="user_notifications"
|
|
78
|
+
description="Table user_notifications du module auth"
|
|
79
|
+
/>
|
|
243
80
|
```
|
|
244
81
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
- `401` : Utilisateur non authentifié
|
|
82
|
+
### Migrations
|
|
248
83
|
|
|
249
|
-
|
|
84
|
+
- `20251112000000_user_init.sql`
|
|
85
|
+
- `20251112000001_auto_profile_and_admin_view.sql`
|
|
86
|
+
- `20251112000002_sync_avatars.sql`
|
|
87
|
+
- `20251124000001_add_get_admin_user_details.sql`
|
|
250
88
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
**Réponse** :
|
|
254
|
-
|
|
255
|
-
```json
|
|
256
|
-
{
|
|
257
|
-
"data": {
|
|
258
|
-
"id": "uuid",
|
|
259
|
-
"owner_id": "uuid",
|
|
260
|
-
"first_name": "John",
|
|
261
|
-
"last_name": "Doe",
|
|
262
|
-
...
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
#### PUT/PATCH `/api/auth/profile`
|
|
268
|
-
|
|
269
|
-
Met à jour le profil de l'utilisateur. Crée le profil s'il n'existe pas.
|
|
270
|
-
|
|
271
|
-
**Body** :
|
|
272
|
-
|
|
273
|
-
```json
|
|
274
|
-
{
|
|
275
|
-
"first_name": "John",
|
|
276
|
-
"last_name": "Doe",
|
|
277
|
-
"avatar_url": "https://...",
|
|
278
|
-
"bio": "...",
|
|
279
|
-
"phone": "...",
|
|
280
|
-
"company": "...",
|
|
281
|
-
"website": "...",
|
|
282
|
-
"location": "...",
|
|
283
|
-
"language": "fr",
|
|
284
|
-
"timezone": "Europe/Paris",
|
|
285
|
-
"preferences": {
|
|
286
|
-
"email_notifications": true,
|
|
287
|
-
"theme": "dark"
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
**Réponse** :
|
|
293
|
-
|
|
294
|
-
```json
|
|
295
|
-
{
|
|
296
|
-
"data": {
|
|
297
|
-
"id": "uuid",
|
|
298
|
-
"owner_id": "uuid",
|
|
299
|
-
"first_name": "John",
|
|
300
|
-
...
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
### API Administration (`/api/admin/*`)
|
|
306
|
-
|
|
307
|
-
⚠️ **Toutes les routes admin nécessitent un accès super admin.**
|
|
308
|
-
|
|
309
|
-
#### GET `/api/admin/users`
|
|
310
|
-
|
|
311
|
-
Liste tous les utilisateurs (paginé).
|
|
312
|
-
|
|
313
|
-
**Query Parameters** :
|
|
314
|
-
|
|
315
|
-
- `page` (optionnel, défaut: 1) : Numéro de page
|
|
316
|
-
- `per_page` (optionnel, défaut: 20) : Nombre d'éléments par page
|
|
317
|
-
- `search` (optionnel) : Recherche par email ou nom
|
|
318
|
-
|
|
319
|
-
**Réponse** :
|
|
320
|
-
|
|
321
|
-
```json
|
|
322
|
-
{
|
|
323
|
-
"data": [
|
|
324
|
-
{
|
|
325
|
-
"id": "uuid",
|
|
326
|
-
"email": "user@example.com",
|
|
327
|
-
"created_at": "2024-01-01T00:00:00Z",
|
|
328
|
-
"profile": {
|
|
329
|
-
"first_name": "John",
|
|
330
|
-
"last_name": "Doe",
|
|
331
|
-
...
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
],
|
|
335
|
-
"pagination": {
|
|
336
|
-
"page": 1,
|
|
337
|
-
"per_page": 20,
|
|
338
|
-
"total": 100,
|
|
339
|
-
"total_pages": 5
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
**Erreurs** :
|
|
345
|
-
|
|
346
|
-
- `401` : Utilisateur non authentifié
|
|
347
|
-
- `403` : Accès refusé (non super admin)
|
|
348
|
-
|
|
349
|
-
### Utilisation dans une API Route Next.js
|
|
350
|
-
|
|
351
|
-
```typescript
|
|
352
|
-
// app/api/auth/me/route.ts
|
|
353
|
-
export { GET } from "@lastbrain/module-auth/api/auth/me";
|
|
354
|
-
|
|
355
|
-
// app/api/auth/profile/route.ts
|
|
356
|
-
export { GET, PUT, PATCH } from "@lastbrain/module-auth/api/auth/profile";
|
|
357
|
-
|
|
358
|
-
// app/api/admin/users/route.ts
|
|
359
|
-
export { GET } from "@lastbrain/module-auth/api/admin/users";
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
## Schéma de Base de Données
|
|
363
|
-
|
|
364
|
-
Le module utilise les tables suivantes (créées par la migration `20251112000000_user_init.sql`) :
|
|
365
|
-
|
|
366
|
-
### Table `user_profil`
|
|
367
|
-
|
|
368
|
-
Stocke les informations de profil utilisateur.
|
|
369
|
-
|
|
370
|
-
```sql
|
|
371
|
-
CREATE TABLE public.user_profil (
|
|
372
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
373
|
-
owner_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
374
|
-
first_name TEXT,
|
|
375
|
-
last_name TEXT,
|
|
376
|
-
avatar_url TEXT,
|
|
377
|
-
bio TEXT,
|
|
378
|
-
phone TEXT,
|
|
379
|
-
company TEXT,
|
|
380
|
-
website TEXT,
|
|
381
|
-
location TEXT,
|
|
382
|
-
language TEXT DEFAULT 'en',
|
|
383
|
-
timezone TEXT,
|
|
384
|
-
preferences JSONB DEFAULT '{}'::jsonb,
|
|
385
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
386
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
387
|
-
);
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
**Index** :
|
|
391
|
-
|
|
392
|
-
- `idx_user_profil_owner_id` sur `owner_id`
|
|
393
|
-
|
|
394
|
-
**RLS (Row Level Security)** :
|
|
395
|
-
|
|
396
|
-
- Les utilisateurs peuvent lire, créer, modifier et supprimer leur propre profil
|
|
397
|
-
- Les super admins ont accès à tous les profils
|
|
398
|
-
|
|
399
|
-
### Table `user_address`
|
|
400
|
-
|
|
401
|
-
Stocke les adresses des utilisateurs.
|
|
402
|
-
|
|
403
|
-
```sql
|
|
404
|
-
CREATE TABLE public.user_address (
|
|
405
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
406
|
-
owner_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
407
|
-
street TEXT NOT NULL,
|
|
408
|
-
street2 TEXT,
|
|
409
|
-
city TEXT NOT NULL,
|
|
410
|
-
state TEXT,
|
|
411
|
-
postal_code TEXT,
|
|
412
|
-
country TEXT NOT NULL,
|
|
413
|
-
is_default BOOLEAN DEFAULT false,
|
|
414
|
-
address_type TEXT DEFAULT 'billing',
|
|
415
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
416
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
417
|
-
);
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
### Table `user_notifications`
|
|
421
|
-
|
|
422
|
-
Stocke les notifications des utilisateurs.
|
|
423
|
-
|
|
424
|
-
```sql
|
|
425
|
-
CREATE TABLE public.user_notifications (
|
|
426
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
427
|
-
owner_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
428
|
-
title TEXT NOT NULL,
|
|
429
|
-
body TEXT,
|
|
430
|
-
type TEXT NOT NULL DEFAULT 'primary',
|
|
431
|
-
read BOOLEAN NOT NULL DEFAULT false,
|
|
432
|
-
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
433
|
-
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
434
|
-
);
|
|
435
|
-
```
|
|
436
|
-
|
|
437
|
-
## Intégration dans une Application
|
|
438
|
-
|
|
439
|
-
### 1. Installer les dépendances
|
|
89
|
+
## 📦 Installation
|
|
440
90
|
|
|
441
91
|
```bash
|
|
442
|
-
pnpm add
|
|
92
|
+
pnpm lastbrain add-module auth
|
|
93
|
+
pnpm build:modules
|
|
443
94
|
```
|
|
444
95
|
|
|
445
|
-
###
|
|
446
|
-
|
|
447
|
-
Copiez les migrations du module dans votre projet Supabase et appliquez-les :
|
|
96
|
+
### Appliquer les migrations
|
|
448
97
|
|
|
449
98
|
```bash
|
|
450
|
-
|
|
451
|
-
supabase
|
|
99
|
+
cd apps/votre-app
|
|
100
|
+
supabase migration up
|
|
452
101
|
```
|
|
453
102
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
Créez les pages dans votre application Next.js :
|
|
103
|
+
## 💡 Utilisation
|
|
457
104
|
|
|
458
|
-
|
|
459
|
-
// app/auth/dashboard/page.tsx
|
|
460
|
-
import { DashboardPage } from "@lastbrain/module-auth";
|
|
461
|
-
export default DashboardPage;
|
|
105
|
+
<!-- 📝 Section à compléter par l'auteur du module -->
|
|
462
106
|
|
|
463
|
-
|
|
464
|
-
import { ProfilePage } from "@lastbrain/module-auth";
|
|
465
|
-
export default ProfilePage;
|
|
107
|
+
### Exemple d'utilisation
|
|
466
108
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
// app/admin/users/page.tsx
|
|
472
|
-
import { AdminUsersPage } from "@lastbrain/module-auth";
|
|
473
|
-
export default AdminUsersPage;
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
### 4. Créer les routes API
|
|
477
|
-
|
|
478
|
-
```typescript
|
|
479
|
-
// app/api/auth/me/route.ts
|
|
480
|
-
export { GET } from "@lastbrain/module-auth/api/auth/me";
|
|
481
|
-
|
|
482
|
-
// app/api/auth/profile/route.ts
|
|
483
|
-
export { GET, PUT, PATCH } from "@lastbrain/module-auth/api/auth/profile";
|
|
484
|
-
|
|
485
|
-
// app/api/admin/users/route.ts
|
|
486
|
-
export { GET } from "@lastbrain/module-auth/api/admin/users";
|
|
487
|
-
```
|
|
488
|
-
|
|
489
|
-
### 5. Configurer les variables d'environnement
|
|
490
|
-
|
|
491
|
-
```env
|
|
492
|
-
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
|
|
493
|
-
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
|
|
494
|
-
```
|
|
495
|
-
|
|
496
|
-
## Sécurité
|
|
497
|
-
|
|
498
|
-
### Row Level Security (RLS)
|
|
499
|
-
|
|
500
|
-
Toutes les tables sont protégées par RLS :
|
|
501
|
-
|
|
502
|
-
- Les utilisateurs ne peuvent accéder qu'à leurs propres données
|
|
503
|
-
- Les super admins ont accès à toutes les données
|
|
504
|
-
|
|
505
|
-
### Vérification Super Admin
|
|
506
|
-
|
|
507
|
-
Les routes admin vérifient l'accès super admin via la RPC Supabase :
|
|
508
|
-
|
|
509
|
-
```typescript
|
|
510
|
-
const { data: isSuperAdmin } = await supabase.rpc("is_superadmin", {
|
|
511
|
-
user_id: user.id,
|
|
512
|
-
});
|
|
109
|
+
```tsx
|
|
110
|
+
// Importez les composants depuis le module
|
|
111
|
+
import { SignInPage } from "@lastbrain/module-auth";
|
|
513
112
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
}
|
|
113
|
+
// Utilisez-les dans votre application
|
|
114
|
+
<SignInPage />;
|
|
517
115
|
```
|
|
518
116
|
|
|
519
|
-
###
|
|
520
|
-
|
|
521
|
-
Les routes API vérifient l'authentification :
|
|
117
|
+
### Configuration
|
|
522
118
|
|
|
523
|
-
|
|
524
|
-
const {
|
|
525
|
-
data: { user },
|
|
526
|
-
error,
|
|
527
|
-
} = await supabase.auth.getUser();
|
|
119
|
+
<!-- Ajoutez ici les détails de configuration spécifiques -->
|
|
528
120
|
|
|
529
|
-
|
|
530
|
-
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
531
|
-
}
|
|
532
|
-
```
|
|
533
|
-
|
|
534
|
-
## Développement
|
|
121
|
+
## ⚠️ Danger Zone
|
|
535
122
|
|
|
536
|
-
|
|
123
|
+
La suppression du module supprimera toutes les pages, routes API et migrations associées. **Cette action est irréversible.**
|
|
537
124
|
|
|
538
125
|
```bash
|
|
539
|
-
pnpm
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
### Watch mode
|
|
543
|
-
|
|
544
|
-
```bash
|
|
545
|
-
pnpm dev
|
|
126
|
+
pnpm lastbrain remove-module auth
|
|
127
|
+
pnpm build:modules
|
|
546
128
|
```
|
|
547
|
-
|
|
548
|
-
## Support
|
|
549
|
-
|
|
550
|
-
Pour des questions ou des problèmes, ouvrez une issue sur [GitHub](https://github.com/lastpublication/starter).
|
|
551
|
-
|
|
552
|
-
## Licence
|
|
553
|
-
|
|
554
|
-
MIT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.build.config.d.ts","sourceRoot":"","sources":["../src/auth.build.config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,QAAA,MAAM,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"auth.build.config.d.ts","sourceRoot":"","sources":["../src/auth.build.config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,QAAA,MAAM,eAAe,EAAE,iBA6NtB,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -21,6 +21,11 @@ const authBuildConfig = {
|
|
|
21
21
|
path: "/dashboard",
|
|
22
22
|
componentExport: "DashboardPage",
|
|
23
23
|
},
|
|
24
|
+
{
|
|
25
|
+
section: "auth",
|
|
26
|
+
path: "/folder",
|
|
27
|
+
componentExport: "FolderPage",
|
|
28
|
+
},
|
|
24
29
|
{
|
|
25
30
|
section: "auth",
|
|
26
31
|
path: "/reglage",
|
|
@@ -136,22 +141,39 @@ const authBuildConfig = {
|
|
|
136
141
|
icon: "Users2",
|
|
137
142
|
path: "/admin/auth/users",
|
|
138
143
|
order: 1,
|
|
144
|
+
shortcut: "cmd+shift+u",
|
|
145
|
+
shortcutDisplay: "⌘⇧U",
|
|
139
146
|
},
|
|
140
147
|
],
|
|
141
|
-
|
|
148
|
+
auth: [
|
|
142
149
|
{
|
|
143
150
|
title: "Tableau de bord",
|
|
144
151
|
description: "Accédez à votre tableau de bord",
|
|
145
152
|
icon: "LayoutDashboard",
|
|
146
153
|
path: "/auth/dashboard",
|
|
147
154
|
order: 1,
|
|
155
|
+
shortcut: "cmd+shift+d",
|
|
156
|
+
shortcutDisplay: "⌘⇧D",
|
|
148
157
|
},
|
|
158
|
+
{
|
|
159
|
+
title: "Dossier",
|
|
160
|
+
description: "Accédez à votre dossier personnel",
|
|
161
|
+
icon: "FolderOpen",
|
|
162
|
+
path: "/auth/folder",
|
|
163
|
+
order: 2,
|
|
164
|
+
shortcut: "cmd+shift+f",
|
|
165
|
+
shortcutDisplay: "⌘⇧F",
|
|
166
|
+
},
|
|
167
|
+
],
|
|
168
|
+
account: [
|
|
149
169
|
{
|
|
150
170
|
title: "Mon profil",
|
|
151
171
|
description: "Gérez vos informations personnelles",
|
|
152
172
|
icon: "User2",
|
|
153
173
|
path: "/auth/profile",
|
|
154
174
|
order: 1,
|
|
175
|
+
shortcut: "cmd+shift+p",
|
|
176
|
+
shortcutDisplay: "⌘⇧P",
|
|
155
177
|
},
|
|
156
178
|
{
|
|
157
179
|
title: "Paramètres",
|
|
@@ -159,6 +181,8 @@ const authBuildConfig = {
|
|
|
159
181
|
icon: "Settings",
|
|
160
182
|
path: "/auth/reglage",
|
|
161
183
|
order: 2,
|
|
184
|
+
shortcut: "cmd+shift+s",
|
|
185
|
+
shortcutDisplay: "⌘⇧S",
|
|
162
186
|
},
|
|
163
187
|
{
|
|
164
188
|
title: "Déconnexion",
|
package/dist/components/Doc.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Documentation component for @lastbrain/module-auth
|
|
3
|
+
* Auto-generated from module-auth.build.config.ts
|
|
4
|
+
*
|
|
5
|
+
* To regenerate this file, run:
|
|
6
|
+
* pnpm update:module-docs
|
|
7
|
+
*/
|
|
8
|
+
export declare function Doc(): import("react/jsx-runtime").JSX.Element;
|
|
2
9
|
//# sourceMappingURL=Doc.d.ts.map
|