@lastbrain/module-auth 0.1.10 → 0.1.12
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 +71 -498
- 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 +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/package.json +1 -1
- package/src/components/Doc.tsx +246 -187
- package/src/index.ts +2 -1
package/README.md
CHANGED
|
@@ -1,554 +1,127 @@
|
|
|
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** `/reglage` - ReglagePage
|
|
23
|
+
- **GET** `/profile` - ProfilePage
|
|
121
24
|
|
|
122
|
-
|
|
123
|
-
import { ProfilePage } from "@lastbrain/module-auth";
|
|
25
|
+
### Pages Admin
|
|
124
26
|
|
|
125
|
-
|
|
126
|
-
return <ProfilePage />;
|
|
127
|
-
}
|
|
128
|
-
```
|
|
27
|
+
- **GET** `/users` - AdminUsersPage
|
|
129
28
|
|
|
130
|
-
|
|
29
|
+
## 🔌 API Routes
|
|
131
30
|
|
|
132
|
-
|
|
31
|
+
### `/api/auth/signin`
|
|
133
32
|
|
|
134
|
-
|
|
33
|
+
**Méthodes supportées**: GET, POST, PUT, DELETE
|
|
135
34
|
|
|
136
|
-
|
|
137
|
-
- Apparence (thème)
|
|
138
|
-
- Langue et région (langue, timezone)
|
|
35
|
+
### `/api/auth/profile`
|
|
139
36
|
|
|
140
|
-
**
|
|
37
|
+
**Méthodes supportées**: GET, POST, PUT, DELETE
|
|
141
38
|
|
|
142
|
-
|
|
143
|
-
import { ReglagePage } from "@lastbrain/module-auth";
|
|
39
|
+
### `/api/auth/me`
|
|
144
40
|
|
|
145
|
-
|
|
146
|
-
return <ReglagePage />;
|
|
147
|
-
}
|
|
148
|
-
```
|
|
41
|
+
**Méthodes supportées**: GET, POST, PUT, DELETE
|
|
149
42
|
|
|
150
|
-
###
|
|
43
|
+
### `/api/admin/users`
|
|
151
44
|
|
|
152
|
-
|
|
45
|
+
**Méthodes supportées**: GET, POST, PUT, DELETE
|
|
153
46
|
|
|
154
|
-
|
|
47
|
+
## 🗄️ Base de Données
|
|
155
48
|
|
|
156
|
-
|
|
49
|
+
### Tables
|
|
157
50
|
|
|
158
|
-
|
|
51
|
+
#### `user_profil`
|
|
159
52
|
|
|
160
53
|
```tsx
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
54
|
+
<TableStructure
|
|
55
|
+
tableName="user_profil"
|
|
56
|
+
title="user_profil"
|
|
57
|
+
description="Table user_profil du module auth"
|
|
58
|
+
/>
|
|
166
59
|
```
|
|
167
60
|
|
|
168
|
-
####
|
|
169
|
-
|
|
170
|
-
**Component**: `SignUpPage`
|
|
171
|
-
|
|
172
|
-
Page d'inscription avec validation des champs.
|
|
173
|
-
|
|
174
|
-
**Usage** :
|
|
61
|
+
#### `user_address`
|
|
175
62
|
|
|
176
63
|
```tsx
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
64
|
+
<TableStructure
|
|
65
|
+
tableName="user_address"
|
|
66
|
+
title="user_address"
|
|
67
|
+
description="Table user_address du module auth"
|
|
68
|
+
/>
|
|
182
69
|
```
|
|
183
70
|
|
|
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** :
|
|
71
|
+
#### `user_notifications`
|
|
201
72
|
|
|
202
73
|
```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
|
-
}
|
|
74
|
+
<TableStructure
|
|
75
|
+
tableName="user_notifications"
|
|
76
|
+
title="user_notifications"
|
|
77
|
+
description="Table user_notifications du module auth"
|
|
78
|
+
/>
|
|
243
79
|
```
|
|
244
80
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
- `401` : Utilisateur non authentifié
|
|
81
|
+
### Migrations
|
|
248
82
|
|
|
249
|
-
|
|
83
|
+
- `20251112000000_user_init.sql`
|
|
84
|
+
- `20251112000001_auto_profile_and_admin_view.sql`
|
|
85
|
+
- `20251112000002_sync_avatars.sql`
|
|
86
|
+
- `20251124000001_add_get_admin_user_details.sql`
|
|
250
87
|
|
|
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
|
|
88
|
+
## 📦 Installation
|
|
440
89
|
|
|
441
90
|
```bash
|
|
442
|
-
pnpm add
|
|
91
|
+
pnpm lastbrain add-module auth
|
|
92
|
+
pnpm build:modules
|
|
443
93
|
```
|
|
444
94
|
|
|
445
|
-
###
|
|
446
|
-
|
|
447
|
-
Copiez les migrations du module dans votre projet Supabase et appliquez-les :
|
|
95
|
+
### Appliquer les migrations
|
|
448
96
|
|
|
449
97
|
```bash
|
|
450
|
-
|
|
451
|
-
supabase
|
|
98
|
+
cd apps/votre-app
|
|
99
|
+
supabase migration up
|
|
452
100
|
```
|
|
453
101
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
Créez les pages dans votre application Next.js :
|
|
102
|
+
## 💡 Utilisation
|
|
457
103
|
|
|
458
|
-
|
|
459
|
-
// app/auth/dashboard/page.tsx
|
|
460
|
-
import { DashboardPage } from "@lastbrain/module-auth";
|
|
461
|
-
export default DashboardPage;
|
|
104
|
+
<!-- 📝 Section à compléter par l'auteur du module -->
|
|
462
105
|
|
|
463
|
-
|
|
464
|
-
import { ProfilePage } from "@lastbrain/module-auth";
|
|
465
|
-
export default ProfilePage;
|
|
106
|
+
### Exemple d'utilisation
|
|
466
107
|
|
|
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
|
-
});
|
|
108
|
+
```tsx
|
|
109
|
+
// Importez les composants depuis le module
|
|
110
|
+
import { SignInPage } from "@lastbrain/module-auth";
|
|
513
111
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
}
|
|
112
|
+
// Utilisez-les dans votre application
|
|
113
|
+
<SignInPage />;
|
|
517
114
|
```
|
|
518
115
|
|
|
519
|
-
###
|
|
520
|
-
|
|
521
|
-
Les routes API vérifient l'authentification :
|
|
116
|
+
### Configuration
|
|
522
117
|
|
|
523
|
-
|
|
524
|
-
const {
|
|
525
|
-
data: { user },
|
|
526
|
-
error,
|
|
527
|
-
} = await supabase.auth.getUser();
|
|
118
|
+
<!-- Ajoutez ici les détails de configuration spécifiques -->
|
|
528
119
|
|
|
529
|
-
|
|
530
|
-
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
531
|
-
}
|
|
532
|
-
```
|
|
533
|
-
|
|
534
|
-
## Développement
|
|
120
|
+
## ⚠️ Danger Zone
|
|
535
121
|
|
|
536
|
-
|
|
122
|
+
La suppression du module supprimera toutes les pages, routes API et migrations associées. **Cette action est irréversible.**
|
|
537
123
|
|
|
538
124
|
```bash
|
|
539
|
-
pnpm
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
### Watch mode
|
|
543
|
-
|
|
544
|
-
```bash
|
|
545
|
-
pnpm dev
|
|
125
|
+
pnpm lastbrain remove-module auth
|
|
126
|
+
pnpm build:modules
|
|
546
127
|
```
|
|
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
|
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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Doc.d.ts","sourceRoot":"","sources":["../../src/components/Doc.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Doc.d.ts","sourceRoot":"","sources":["../../src/components/Doc.tsx"],"names":[],"mappings":"AAgBA;;;;;;GAMG;AACH,wBAAgB,GAAG,4CAyVlB"}
|
package/dist/components/Doc.js
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Card, CardBody, CardHeader
|
|
3
|
-
|
|
4
|
-
return (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-3xl font-bold mb-2", children: "Module Auth" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Authentification compl\u00E8te avec gestion des profils utilisateur" })] }), _jsx(Chip, { color: "primary", variant: "flat", children: "v0.1.0" })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDCDD Informations" }) }), _jsxs(CardBody, { className: "space-y-2", children: [_jsxs("div", { children: [_jsx("span", { className: "font-semibold", children: "Auteur:" }), " LastBrain Team"] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold", children: "Package:" }), " ", "@lastbrain/module-auth"] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold", children: "Derni\u00E8re mise \u00E0 jour:" }), " 21 novembre 2025"] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDCC4 Pages Disponibles" }) }), _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2", children: "Pages Publiques" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/signin" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Connexion" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/signup" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Inscription" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/reset-password" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- R\u00E9initialisation mot de passe" })] })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2", children: "Pages Prot\u00E9g\u00E9es (Auth)" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/auth/dashboard" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Tableau de bord" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/auth/profile" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Profil utilisateur" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/auth/reglage" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Param\u00E8tres" })] })] })] }), _jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2", children: "Pages Admin" }), _jsx("div", { className: "space-y-2", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "danger", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/admin/users" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Gestion des utilisateurs" })] }) })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDD0C Routes API" }) }), _jsxs(CardBody, { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "POST" }), _jsx("code", { className: "text-sm", children: "/api/auth/signin" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Authentification" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "POST" }), _jsx("code", { className: "text-sm", children: "/api/auth/signup" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- Cr\u00E9ation de compte" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "POST" }), _jsx("code", { className: "text-sm", children: "/api/auth/signout" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- D\u00E9connexion" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "POST" }), _jsx("code", { className: "text-sm", children: "/api/auth/reset-password" }), _jsx("span", { className: "text-slate-600 dark:text-slate-400", children: "- R\u00E9initialisation" })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDCC1 Structure" }) }), _jsx(CardBody, { children: _jsx(Snippet, { symbol: "", color: "default", size: "sm", hideSymbol: true, hideCopyButton: true, children: _jsxs("div", { className: "flex flex-col gap-1 text-xs font-mono", children: [_jsx("span", { children: "module-auth/" }), _jsx("span", { children: "\u251C\u2500\u2500 src/" }), _jsx("span", { children: "\u2502 \u251C\u2500\u2500 web/" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 signin/" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 signup/" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 dashboard/" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 profile/" }), _jsx("span", { children: "\u2502 \u2502 \u2514\u2500\u2500 reglage/" }), _jsx("span", { children: "\u2502 \u251C\u2500\u2500 api/" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 signin.ts" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 signup.ts" }), _jsx("span", { children: "\u2502 \u2502 \u251C\u2500\u2500 signout.ts" }), _jsx("span", { children: "\u2502 \u2502 \u2514\u2500\u2500 reset-password.ts" }), _jsx("span", { children: "\u2502 \u251C\u2500\u2500 components/" }), _jsx("span", { children: "\u2502 \u2502 \u2514\u2500\u2500 Doc.tsx" }), _jsx("span", { children: "\u2502 \u2514\u2500\u2500 auth.build.config.ts" }), _jsx("span", { children: "\u2514\u2500\u2500 supabase/" }), _jsx("span", { children: " \u2514\u2500\u2500 migrations/" }), _jsx("span", { children: " \u2514\u2500\u2500 20251112000000_user_init.sql" })] }) }) })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDDC4\uFE0F Tables de Donn\u00E9es" }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx(TableStructure, { tableName: "user_profil", title: "user_profil", description: "Profil \u00E9tendu des utilisateurs (pr\u00E9nom, nom, t\u00E9l\u00E9phone, avatar, bio, etc.)" }), _jsx(TableStructure, { tableName: "user_address", title: "user_address", description: "Adresses des utilisateurs (livraison, facturation)" }), _jsx(TableStructure, { tableName: "user_notifications", title: "user_notifications", description: "Pr\u00E9f\u00E9rences de notifications (email, SMS, push)" })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDCE6 Installation" }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm lastbrain add-module auth" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build:modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "supabase migration up" })] }), _jsxs("div", { className: "border-2 border-danger rounded-lg p-4 mt-6", children: [_jsx("h4", { className: "text-lg font-semibold text-danger mb-3", children: "\u26A0\uFE0F Danger Zone" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "La suppression du module supprimera toutes les pages, routes API et migrations associ\u00E9es. Cette action est irr\u00E9versible." }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "danger", size: "sm", children: "pnpm lastbrain remove-module auth" }), _jsx(Snippet, { symbol: "", color: "danger", size: "sm", children: "pnpm build:modules" })] })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-xl font-semibold", children: "\uD83D\uDCA1 Utilisation" }) }), _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2", children: "Hooks disponibles" }), _jsxs(Snippet, { symbol: "", color: "default", size: "sm", children: ["import ", "{ useAuthSession }", " from \"@lastbrain/module-auth\";"] })] }), _jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2 mt-4", children: "Exemple d'utilisation" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", hideSymbol: true, children: _jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { children: ["const ", "{ session, user }", " = useAuthSession();"] }), _jsx("span", { children: "if (!session) return <p>Non connect\u00E9</p>;" }), _jsxs("span", { children: ["return <div>Bonjour ", "{user.email}", "</div>;"] })] }) })] })] })] })] }));
|
|
3
|
+
import { Card, CardBody, CardHeader } from "@lastbrain/ui";
|
|
4
|
+
import { Chip } from "@lastbrain/ui";
|
|
5
|
+
import { Snippet } from "@lastbrain/ui";
|
|
6
|
+
import { Alert } from "@lastbrain/ui";
|
|
7
|
+
import { TableStructure } from "@lastbrain/ui";
|
|
8
|
+
import { FileText, Zap, Database, Package, BookOpen, AlertTriangle, } from "lucide-react";
|
|
9
|
+
/**
|
|
10
|
+
* Documentation component for @lastbrain/module-auth
|
|
11
|
+
* Auto-generated from module-auth.build.config.ts
|
|
12
|
+
*
|
|
13
|
+
* To regenerate this file, run:
|
|
14
|
+
* pnpm update:module-docs
|
|
15
|
+
*/
|
|
16
|
+
export function Doc() {
|
|
17
|
+
return (_jsxs("div", { className: "container mx-auto p-6 space-y-6", children: [_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("div", { children: [_jsx("h1", { className: "text-3xl font-bold mb-2", children: "\uD83D\uDCE6 Module auth" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "@lastbrain/module-auth" })] }) }), _jsx(CardBody, { children: _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-3 gap-4", children: [_jsxs("div", { children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Package" }), _jsx("code", { className: "text-sm font-semibold", children: "@lastbrain/module-auth" })] }), _jsxs("div", { children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Slug" }), _jsx("code", { className: "text-sm font-semibold", children: "module-auth" })] }), _jsxs("div", { children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Type" }), _jsx("code", { className: "text-sm font-semibold", children: "Module LastBrain" })] })] }) })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "Pages Disponibles"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Pages Publiques" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/signin" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- SignInPage" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/signup" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- SignUpPage" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/reset-password" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- ResetPassword" })] })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Pages Prot\u00E9g\u00E9es (Auth)" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/dashboard" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- DashboardPage" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/reglage" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- ReglagePage" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/profile" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- ProfilePage" })] })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Pages Admin" }), _jsx("div", { className: "space-y-2", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(Chip, { size: "sm", color: "secondary", variant: "flat", children: "GET" }), _jsx("code", { className: "text-sm", children: "/users" }), _jsx("span", { className: "text-sm text-slate-600 dark:text-slate-400", children: "- AdminUsersPage" })] }) })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Zap, { size: 24 }), "API Routes"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: _jsx("code", { children: "/api/auth/signin" }) }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "POST" }), _jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "PUT" }), _jsx(Chip, { size: "sm", color: "danger", variant: "flat", children: "DELETE" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: _jsx("code", { children: "/api/auth/profile" }) }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "POST" }), _jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "PUT" }), _jsx(Chip, { size: "sm", color: "danger", variant: "flat", children: "DELETE" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: _jsx("code", { children: "/api/auth/me" }) }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "POST" }), _jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "PUT" }), _jsx(Chip, { size: "sm", color: "danger", variant: "flat", children: "DELETE" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: _jsx("code", { children: "/api/admin/users" }) }), _jsxs("div", { className: "flex gap-2", children: [_jsx(Chip, { size: "sm", color: "success", variant: "flat", children: "GET" }), _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "POST" }), _jsx(Chip, { size: "sm", color: "warning", variant: "flat", children: "PUT" }), _jsx(Chip, { size: "sm", color: "danger", variant: "flat", children: "DELETE" })] })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Database, { size: 24 }), "Base de Donn\u00E9es"] }) }), _jsxs(CardBody, { className: "space-y-6", children: [_jsx(TableStructure, { tableName: "user_profil", title: "user_profil", description: "Table user_profil du module auth" }), _jsx(TableStructure, { tableName: "user_address", title: "user_address", description: "Table user_address du module auth" }), _jsx(TableStructure, { tableName: "user_notifications", title: "user_notifications", description: "Table user_notifications du module auth" })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Package, { size: 24 }), "Installation"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Ajouter le module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm lastbrain add-module auth" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm build:modules" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Appliquer les migrations" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "cd apps/votre-app" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "supabase migration up" })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(BookOpen, { size: 24 }), "Utilisation"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs(Alert, { color: "default", className: "mb-4", children: [_jsxs("p", { className: "text-sm", children: ["\uD83D\uDCDD ", _jsx("strong", { children: "Section \u00E0 compl\u00E9ter par l'auteur du module" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: "Ajoutez ici des exemples d'utilisation, des configurations sp\u00E9cifiques, et toute information utile pour les d\u00E9veloppeurs utilisant ce module." })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exemple d'utilisation" }), _jsx(Alert, { color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `// Importez les composants depuis le module
|
|
18
|
+
import { SignInPage } from "@lastbrain/module-auth";
|
|
19
|
+
|
|
20
|
+
// Utilisez-les dans votre application
|
|
21
|
+
<SignInPage />` }) })] })] })] }), _jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2 text-danger", children: [_jsx(AlertTriangle, { size: 24 }), "Danger Zone"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs(Alert, { color: "danger", className: "mb-4", children: [_jsx("p", { className: "text-sm font-semibold", children: "\u26A0\uFE0F Cette action est irr\u00E9versible" }), _jsx("p", { className: "text-sm mt-2", children: "La suppression du module supprimera toutes les pages, routes API et migrations associ\u00E9es." })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supprimer le module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, color: "danger", className: "text-sm mb-2", children: "pnpm lastbrain remove-module auth" }), _jsx(Snippet, { symbol: "", hideSymbol: true, color: "danger", className: "text-sm mb-2", children: "pnpm build:modules" })] })] })] })] }));
|
|
5
22
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export { ProfilePage } from "./web/auth/profile.js";
|
|
|
6
6
|
export { ReglagePage } from "./web/auth/reglage.js";
|
|
7
7
|
export { AdminUsersPage } from "./web/admin/users.js";
|
|
8
8
|
export { default as UserPage } from "./web/admin/users/[id].js";
|
|
9
|
-
export {
|
|
9
|
+
export { Doc } from "./components/Doc.js";
|
|
10
|
+
export { Doc as AuthModuleDoc } from "./components/Doc.js";
|
|
10
11
|
export { default as authBuildConfig } from "./auth.build.config.js";
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,7 @@ export { ReglagePage } from "./web/auth/reglage.js";
|
|
|
8
8
|
export { AdminUsersPage } from "./web/admin/users.js";
|
|
9
9
|
export { default as UserPage } from "./web/admin/users/[id].js";
|
|
10
10
|
// Documentation
|
|
11
|
-
export {
|
|
11
|
+
export { Doc } from "./components/Doc.js";
|
|
12
|
+
export { Doc as AuthModuleDoc } from "./components/Doc.js";
|
|
12
13
|
// Configuration de build (utilisée par les scripts)
|
|
13
14
|
export { default as authBuildConfig } from "./auth.build.config.js";
|
package/package.json
CHANGED
package/src/components/Doc.tsx
CHANGED
|
@@ -1,129 +1,144 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { Card, CardBody, CardHeader } from "@lastbrain/ui";
|
|
4
|
+
import { Chip } from "@lastbrain/ui";
|
|
5
|
+
import { Snippet } from "@lastbrain/ui";
|
|
6
|
+
import { Alert } from "@lastbrain/ui";
|
|
7
|
+
import { TableStructure } from "@lastbrain/ui";
|
|
2
8
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
} from "
|
|
9
|
+
FileText,
|
|
10
|
+
Zap,
|
|
11
|
+
Database,
|
|
12
|
+
Package,
|
|
13
|
+
BookOpen,
|
|
14
|
+
AlertTriangle,
|
|
15
|
+
} from "lucide-react";
|
|
10
16
|
|
|
11
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Documentation component for @lastbrain/module-auth
|
|
19
|
+
* Auto-generated from module-auth.build.config.ts
|
|
20
|
+
*
|
|
21
|
+
* To regenerate this file, run:
|
|
22
|
+
* pnpm update:module-docs
|
|
23
|
+
*/
|
|
24
|
+
export function Doc() {
|
|
12
25
|
return (
|
|
13
|
-
<div className="space-y-6">
|
|
14
|
-
{/* Header */}
|
|
15
|
-
<div className="flex items-start justify-between">
|
|
16
|
-
<div>
|
|
17
|
-
<h2 className="text-3xl font-bold mb-2">Module Auth</h2>
|
|
18
|
-
<p className="text-slate-600 dark:text-slate-400">
|
|
19
|
-
Authentification complète avec gestion des profils utilisateur
|
|
20
|
-
</p>
|
|
21
|
-
</div>
|
|
22
|
-
<Chip color="primary" variant="flat">
|
|
23
|
-
v0.1.0
|
|
24
|
-
</Chip>
|
|
25
|
-
</div>
|
|
26
|
-
|
|
27
|
-
{/* Author */}
|
|
26
|
+
<div className="container mx-auto p-6 space-y-6">
|
|
28
27
|
<Card>
|
|
29
28
|
<CardHeader>
|
|
30
|
-
<h3 className="text-xl font-semibold">📝 Informations</h3>
|
|
31
|
-
</CardHeader>
|
|
32
|
-
<CardBody className="space-y-2">
|
|
33
|
-
<div>
|
|
34
|
-
<span className="font-semibold">Auteur:</span> LastBrain Team
|
|
35
|
-
</div>
|
|
36
29
|
<div>
|
|
37
|
-
<
|
|
38
|
-
|
|
30
|
+
<h1 className="text-3xl font-bold mb-2">📦 Module auth</h1>
|
|
31
|
+
<p className="text-slate-600 dark:text-slate-400">
|
|
32
|
+
@lastbrain/module-auth
|
|
33
|
+
</p>
|
|
39
34
|
</div>
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
35
|
+
</CardHeader>
|
|
36
|
+
<CardBody>
|
|
37
|
+
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
38
|
+
<div>
|
|
39
|
+
<p className="text-sm text-slate-600 dark:text-slate-400">
|
|
40
|
+
Package
|
|
41
|
+
</p>
|
|
42
|
+
<code className="text-sm font-semibold">
|
|
43
|
+
@lastbrain/module-auth
|
|
44
|
+
</code>
|
|
45
|
+
</div>
|
|
46
|
+
<div>
|
|
47
|
+
<p className="text-sm text-slate-600 dark:text-slate-400">Slug</p>
|
|
48
|
+
<code className="text-sm font-semibold">module-auth</code>
|
|
49
|
+
</div>
|
|
50
|
+
<div>
|
|
51
|
+
<p className="text-sm text-slate-600 dark:text-slate-400">Type</p>
|
|
52
|
+
<code className="text-sm font-semibold">Module LastBrain</code>
|
|
53
|
+
</div>
|
|
43
54
|
</div>
|
|
44
55
|
</CardBody>
|
|
45
56
|
</Card>
|
|
46
57
|
|
|
47
|
-
{/* Pages disponibles */}
|
|
48
58
|
<Card>
|
|
49
59
|
<CardHeader>
|
|
50
|
-
<
|
|
60
|
+
<h2 className="text-2xl font-semibold flex items-center gap-2">
|
|
61
|
+
<FileText size={24} />
|
|
62
|
+
Pages Disponibles
|
|
63
|
+
</h2>
|
|
51
64
|
</CardHeader>
|
|
52
|
-
<CardBody className="space-y-
|
|
65
|
+
<CardBody className="space-y-4">
|
|
53
66
|
<div>
|
|
54
|
-
<
|
|
67
|
+
<h3 className="text-lg font-semibold mb-2">Pages Publiques</h3>
|
|
55
68
|
<div className="space-y-2">
|
|
56
|
-
<div className="flex items-
|
|
69
|
+
<div className="flex items-start gap-2">
|
|
57
70
|
<Chip size="sm" color="success" variant="flat">
|
|
58
71
|
GET
|
|
59
72
|
</Chip>
|
|
60
73
|
<code className="text-sm">/signin</code>
|
|
61
|
-
<span className="text-slate-600 dark:text-slate-400">
|
|
62
|
-
-
|
|
74
|
+
<span className="text-sm text-slate-600 dark:text-slate-400">
|
|
75
|
+
- SignInPage
|
|
63
76
|
</span>
|
|
64
77
|
</div>
|
|
65
|
-
<div className="flex items-
|
|
78
|
+
<div className="flex items-start gap-2">
|
|
66
79
|
<Chip size="sm" color="success" variant="flat">
|
|
67
80
|
GET
|
|
68
81
|
</Chip>
|
|
69
82
|
<code className="text-sm">/signup</code>
|
|
70
|
-
<span className="text-slate-600 dark:text-slate-400">
|
|
71
|
-
-
|
|
83
|
+
<span className="text-sm text-slate-600 dark:text-slate-400">
|
|
84
|
+
- SignUpPage
|
|
72
85
|
</span>
|
|
73
86
|
</div>
|
|
74
|
-
<div className="flex items-
|
|
87
|
+
<div className="flex items-start gap-2">
|
|
75
88
|
<Chip size="sm" color="success" variant="flat">
|
|
76
89
|
GET
|
|
77
90
|
</Chip>
|
|
78
91
|
<code className="text-sm">/reset-password</code>
|
|
79
|
-
<span className="text-slate-600 dark:text-slate-400">
|
|
80
|
-
-
|
|
92
|
+
<span className="text-sm text-slate-600 dark:text-slate-400">
|
|
93
|
+
- ResetPassword
|
|
81
94
|
</span>
|
|
82
95
|
</div>
|
|
83
96
|
</div>
|
|
84
97
|
</div>
|
|
85
98
|
<div>
|
|
86
|
-
<
|
|
99
|
+
<h3 className="text-lg font-semibold mb-2">
|
|
100
|
+
Pages Protégées (Auth)
|
|
101
|
+
</h3>
|
|
87
102
|
<div className="space-y-2">
|
|
88
|
-
<div className="flex items-
|
|
103
|
+
<div className="flex items-start gap-2">
|
|
89
104
|
<Chip size="sm" color="primary" variant="flat">
|
|
90
105
|
GET
|
|
91
106
|
</Chip>
|
|
92
|
-
<code className="text-sm">/
|
|
93
|
-
<span className="text-slate-600 dark:text-slate-400">
|
|
94
|
-
-
|
|
107
|
+
<code className="text-sm">/dashboard</code>
|
|
108
|
+
<span className="text-sm text-slate-600 dark:text-slate-400">
|
|
109
|
+
- DashboardPage
|
|
95
110
|
</span>
|
|
96
111
|
</div>
|
|
97
|
-
<div className="flex items-
|
|
112
|
+
<div className="flex items-start gap-2">
|
|
98
113
|
<Chip size="sm" color="primary" variant="flat">
|
|
99
114
|
GET
|
|
100
115
|
</Chip>
|
|
101
|
-
<code className="text-sm">/
|
|
102
|
-
<span className="text-slate-600 dark:text-slate-400">
|
|
103
|
-
-
|
|
116
|
+
<code className="text-sm">/reglage</code>
|
|
117
|
+
<span className="text-sm text-slate-600 dark:text-slate-400">
|
|
118
|
+
- ReglagePage
|
|
104
119
|
</span>
|
|
105
120
|
</div>
|
|
106
|
-
<div className="flex items-
|
|
121
|
+
<div className="flex items-start gap-2">
|
|
107
122
|
<Chip size="sm" color="primary" variant="flat">
|
|
108
123
|
GET
|
|
109
124
|
</Chip>
|
|
110
|
-
<code className="text-sm">/
|
|
111
|
-
<span className="text-slate-600 dark:text-slate-400">
|
|
112
|
-
-
|
|
125
|
+
<code className="text-sm">/profile</code>
|
|
126
|
+
<span className="text-sm text-slate-600 dark:text-slate-400">
|
|
127
|
+
- ProfilePage
|
|
113
128
|
</span>
|
|
114
129
|
</div>
|
|
115
130
|
</div>
|
|
116
131
|
</div>
|
|
117
132
|
<div>
|
|
118
|
-
<
|
|
133
|
+
<h3 className="text-lg font-semibold mb-2">Pages Admin</h3>
|
|
119
134
|
<div className="space-y-2">
|
|
120
|
-
<div className="flex items-
|
|
121
|
-
<Chip size="sm" color="
|
|
135
|
+
<div className="flex items-start gap-2">
|
|
136
|
+
<Chip size="sm" color="secondary" variant="flat">
|
|
122
137
|
GET
|
|
123
138
|
</Chip>
|
|
124
|
-
<code className="text-sm">/
|
|
125
|
-
<span className="text-slate-600 dark:text-slate-400">
|
|
126
|
-
-
|
|
139
|
+
<code className="text-sm">/users</code>
|
|
140
|
+
<span className="text-sm text-slate-600 dark:text-slate-400">
|
|
141
|
+
- AdminUsersPage
|
|
127
142
|
</span>
|
|
128
143
|
</div>
|
|
129
144
|
</div>
|
|
@@ -131,176 +146,220 @@ export function AuthModuleDoc() {
|
|
|
131
146
|
</CardBody>
|
|
132
147
|
</Card>
|
|
133
148
|
|
|
134
|
-
{/* Routes API */}
|
|
135
149
|
<Card>
|
|
136
150
|
<CardHeader>
|
|
137
|
-
<
|
|
151
|
+
<h2 className="text-2xl font-semibold flex items-center gap-2">
|
|
152
|
+
<Zap size={24} />
|
|
153
|
+
API Routes
|
|
154
|
+
</h2>
|
|
138
155
|
</CardHeader>
|
|
139
|
-
<CardBody className="space-y-
|
|
140
|
-
<div
|
|
141
|
-
<
|
|
142
|
-
|
|
143
|
-
</
|
|
144
|
-
<
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
156
|
+
<CardBody className="space-y-4">
|
|
157
|
+
<div>
|
|
158
|
+
<h3 className="text-lg font-semibold mb-2">
|
|
159
|
+
<code>/api/auth/signin</code>
|
|
160
|
+
</h3>
|
|
161
|
+
<div className="flex gap-2">
|
|
162
|
+
<Chip size="sm" color="success" variant="flat">
|
|
163
|
+
GET
|
|
164
|
+
</Chip>
|
|
165
|
+
<Chip size="sm" color="primary" variant="flat">
|
|
166
|
+
POST
|
|
167
|
+
</Chip>
|
|
168
|
+
<Chip size="sm" color="warning" variant="flat">
|
|
169
|
+
PUT
|
|
170
|
+
</Chip>
|
|
171
|
+
<Chip size="sm" color="danger" variant="flat">
|
|
172
|
+
DELETE
|
|
173
|
+
</Chip>
|
|
174
|
+
</div>
|
|
157
175
|
</div>
|
|
158
|
-
<div
|
|
159
|
-
<
|
|
160
|
-
|
|
161
|
-
</
|
|
162
|
-
<
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
176
|
+
<div>
|
|
177
|
+
<h3 className="text-lg font-semibold mb-2">
|
|
178
|
+
<code>/api/auth/profile</code>
|
|
179
|
+
</h3>
|
|
180
|
+
<div className="flex gap-2">
|
|
181
|
+
<Chip size="sm" color="success" variant="flat">
|
|
182
|
+
GET
|
|
183
|
+
</Chip>
|
|
184
|
+
<Chip size="sm" color="primary" variant="flat">
|
|
185
|
+
POST
|
|
186
|
+
</Chip>
|
|
187
|
+
<Chip size="sm" color="warning" variant="flat">
|
|
188
|
+
PUT
|
|
189
|
+
</Chip>
|
|
190
|
+
<Chip size="sm" color="danger" variant="flat">
|
|
191
|
+
DELETE
|
|
192
|
+
</Chip>
|
|
193
|
+
</div>
|
|
166
194
|
</div>
|
|
167
|
-
<div
|
|
168
|
-
<
|
|
169
|
-
|
|
170
|
-
</
|
|
171
|
-
<
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
195
|
+
<div>
|
|
196
|
+
<h3 className="text-lg font-semibold mb-2">
|
|
197
|
+
<code>/api/auth/me</code>
|
|
198
|
+
</h3>
|
|
199
|
+
<div className="flex gap-2">
|
|
200
|
+
<Chip size="sm" color="success" variant="flat">
|
|
201
|
+
GET
|
|
202
|
+
</Chip>
|
|
203
|
+
<Chip size="sm" color="primary" variant="flat">
|
|
204
|
+
POST
|
|
205
|
+
</Chip>
|
|
206
|
+
<Chip size="sm" color="warning" variant="flat">
|
|
207
|
+
PUT
|
|
208
|
+
</Chip>
|
|
209
|
+
<Chip size="sm" color="danger" variant="flat">
|
|
210
|
+
DELETE
|
|
211
|
+
</Chip>
|
|
212
|
+
</div>
|
|
175
213
|
</div>
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
<span>module-auth/</span>
|
|
194
|
-
<span>├── src/</span>
|
|
195
|
-
<span>│ ├── web/</span>
|
|
196
|
-
<span>│ │ ├── signin/</span>
|
|
197
|
-
<span>│ │ ├── signup/</span>
|
|
198
|
-
<span>│ │ ├── dashboard/</span>
|
|
199
|
-
<span>│ │ ├── profile/</span>
|
|
200
|
-
<span>│ │ └── reglage/</span>
|
|
201
|
-
<span>│ ├── api/</span>
|
|
202
|
-
<span>│ │ ├── signin.ts</span>
|
|
203
|
-
<span>│ │ ├── signup.ts</span>
|
|
204
|
-
<span>│ │ ├── signout.ts</span>
|
|
205
|
-
<span>│ │ └── reset-password.ts</span>
|
|
206
|
-
<span>│ ├── components/</span>
|
|
207
|
-
<span>│ │ └── Doc.tsx</span>
|
|
208
|
-
<span>│ └── auth.build.config.ts</span>
|
|
209
|
-
<span>└── supabase/</span>
|
|
210
|
-
<span> └── migrations/</span>
|
|
211
|
-
<span> └── 20251112000000_user_init.sql</span>
|
|
214
|
+
<div>
|
|
215
|
+
<h3 className="text-lg font-semibold mb-2">
|
|
216
|
+
<code>/api/admin/users</code>
|
|
217
|
+
</h3>
|
|
218
|
+
<div className="flex gap-2">
|
|
219
|
+
<Chip size="sm" color="success" variant="flat">
|
|
220
|
+
GET
|
|
221
|
+
</Chip>
|
|
222
|
+
<Chip size="sm" color="primary" variant="flat">
|
|
223
|
+
POST
|
|
224
|
+
</Chip>
|
|
225
|
+
<Chip size="sm" color="warning" variant="flat">
|
|
226
|
+
PUT
|
|
227
|
+
</Chip>
|
|
228
|
+
<Chip size="sm" color="danger" variant="flat">
|
|
229
|
+
DELETE
|
|
230
|
+
</Chip>
|
|
212
231
|
</div>
|
|
213
|
-
</
|
|
232
|
+
</div>
|
|
214
233
|
</CardBody>
|
|
215
234
|
</Card>
|
|
216
235
|
|
|
217
|
-
{/* Tables de données */}
|
|
218
236
|
<Card>
|
|
219
237
|
<CardHeader>
|
|
220
|
-
<
|
|
238
|
+
<h2 className="text-2xl font-semibold flex items-center gap-2">
|
|
239
|
+
<Database size={24} />
|
|
240
|
+
Base de Données
|
|
241
|
+
</h2>
|
|
221
242
|
</CardHeader>
|
|
222
|
-
<CardBody className="space-y-
|
|
243
|
+
<CardBody className="space-y-6">
|
|
223
244
|
<TableStructure
|
|
224
245
|
tableName="user_profil"
|
|
225
246
|
title="user_profil"
|
|
226
|
-
description="
|
|
247
|
+
description="Table user_profil du module auth"
|
|
227
248
|
/>
|
|
228
249
|
<TableStructure
|
|
229
250
|
tableName="user_address"
|
|
230
251
|
title="user_address"
|
|
231
|
-
description="
|
|
252
|
+
description="Table user_address du module auth"
|
|
232
253
|
/>
|
|
233
254
|
<TableStructure
|
|
234
255
|
tableName="user_notifications"
|
|
235
256
|
title="user_notifications"
|
|
236
|
-
description="
|
|
257
|
+
description="Table user_notifications du module auth"
|
|
237
258
|
/>
|
|
238
259
|
</CardBody>
|
|
239
260
|
</Card>
|
|
240
261
|
|
|
241
|
-
{/* Installation */}
|
|
242
262
|
<Card>
|
|
243
263
|
<CardHeader>
|
|
244
|
-
<
|
|
264
|
+
<h2 className="text-2xl font-semibold flex items-center gap-2">
|
|
265
|
+
<Package size={24} />
|
|
266
|
+
Installation
|
|
267
|
+
</h2>
|
|
245
268
|
</CardHeader>
|
|
246
269
|
<CardBody className="space-y-4">
|
|
247
|
-
<div
|
|
248
|
-
<
|
|
270
|
+
<div>
|
|
271
|
+
<h3 className="text-lg font-semibold mb-2">Ajouter le module</h3>
|
|
272
|
+
<Snippet symbol="" hideSymbol className="text-sm mb-2">
|
|
249
273
|
pnpm lastbrain add-module auth
|
|
250
274
|
</Snippet>
|
|
251
|
-
<Snippet symbol=""
|
|
275
|
+
<Snippet symbol="" hideSymbol className="text-sm mb-2">
|
|
252
276
|
pnpm build:modules
|
|
253
277
|
</Snippet>
|
|
254
|
-
|
|
278
|
+
</div>
|
|
279
|
+
|
|
280
|
+
<div>
|
|
281
|
+
<h3 className="text-lg font-semibold mb-2">
|
|
282
|
+
Appliquer les migrations
|
|
283
|
+
</h3>
|
|
284
|
+
<Snippet symbol="" hideSymbol className="text-sm mb-2">
|
|
285
|
+
cd apps/votre-app
|
|
286
|
+
</Snippet>
|
|
287
|
+
<Snippet symbol="" hideSymbol className="text-sm mb-2">
|
|
255
288
|
supabase migration up
|
|
256
289
|
</Snippet>
|
|
257
290
|
</div>
|
|
291
|
+
</CardBody>
|
|
292
|
+
</Card>
|
|
258
293
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
294
|
+
<Card>
|
|
295
|
+
<CardHeader>
|
|
296
|
+
<h2 className="text-2xl font-semibold flex items-center gap-2">
|
|
297
|
+
<BookOpen size={24} />
|
|
298
|
+
Utilisation
|
|
299
|
+
</h2>
|
|
300
|
+
</CardHeader>
|
|
301
|
+
<CardBody className="space-y-4">
|
|
302
|
+
<Alert color="default" className="mb-4">
|
|
303
|
+
<p className="text-sm">
|
|
304
|
+
📝 <strong>Section à compléter par l'auteur du module</strong>
|
|
267
305
|
</p>
|
|
268
|
-
<
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
306
|
+
<p className="text-sm text-slate-600 dark:text-slate-400 mt-2">
|
|
307
|
+
Ajoutez ici des exemples d'utilisation, des configurations
|
|
308
|
+
spécifiques, et toute information utile pour les développeurs
|
|
309
|
+
utilisant ce module.
|
|
310
|
+
</p>
|
|
311
|
+
</Alert>
|
|
312
|
+
|
|
313
|
+
<div>
|
|
314
|
+
<h3 className="text-lg font-semibold mb-2">
|
|
315
|
+
Exemple d'utilisation
|
|
316
|
+
</h3>
|
|
317
|
+
<Alert color="primary" className="p-4 mb-4">
|
|
318
|
+
<pre className="whitespace-pre-wrap">{`// Importez les composants depuis le module
|
|
319
|
+
import { SignInPage } from "@lastbrain/module-auth";
|
|
320
|
+
|
|
321
|
+
// Utilisez-les dans votre application
|
|
322
|
+
<SignInPage />`}</pre>
|
|
323
|
+
</Alert>
|
|
276
324
|
</div>
|
|
277
325
|
</CardBody>
|
|
278
326
|
</Card>
|
|
279
327
|
|
|
280
|
-
{/* Utilisation */}
|
|
281
328
|
<Card>
|
|
282
329
|
<CardHeader>
|
|
283
|
-
<
|
|
330
|
+
<h2 className="text-2xl font-semibold flex items-center gap-2 text-danger">
|
|
331
|
+
<AlertTriangle size={24} />
|
|
332
|
+
Danger Zone
|
|
333
|
+
</h2>
|
|
284
334
|
</CardHeader>
|
|
285
|
-
<CardBody className="space-y-
|
|
335
|
+
<CardBody className="space-y-4">
|
|
336
|
+
<Alert color="danger" className="mb-4">
|
|
337
|
+
<p className="text-sm font-semibold">
|
|
338
|
+
⚠️ Cette action est irréversible
|
|
339
|
+
</p>
|
|
340
|
+
<p className="text-sm mt-2">
|
|
341
|
+
La suppression du module supprimera toutes les pages, routes API
|
|
342
|
+
et migrations associées.
|
|
343
|
+
</p>
|
|
344
|
+
</Alert>
|
|
345
|
+
|
|
286
346
|
<div>
|
|
287
|
-
<
|
|
288
|
-
<Snippet
|
|
289
|
-
|
|
347
|
+
<h3 className="text-lg font-semibold mb-2">Supprimer le module</h3>
|
|
348
|
+
<Snippet
|
|
349
|
+
symbol=""
|
|
350
|
+
hideSymbol
|
|
351
|
+
color="danger"
|
|
352
|
+
className="text-sm mb-2"
|
|
353
|
+
>
|
|
354
|
+
pnpm lastbrain remove-module auth
|
|
290
355
|
</Snippet>
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if (!session) return <p>Non connecté</p>;
|
|
299
|
-
</span>
|
|
300
|
-
<span>
|
|
301
|
-
return <div>Bonjour {"{user.email}"}</div>;
|
|
302
|
-
</span>
|
|
303
|
-
</div>
|
|
356
|
+
<Snippet
|
|
357
|
+
symbol=""
|
|
358
|
+
hideSymbol
|
|
359
|
+
color="danger"
|
|
360
|
+
className="text-sm mb-2"
|
|
361
|
+
>
|
|
362
|
+
pnpm build:modules
|
|
304
363
|
</Snippet>
|
|
305
364
|
</div>
|
|
306
365
|
</CardBody>
|
package/src/index.ts
CHANGED
|
@@ -8,6 +8,7 @@ export { ReglagePage } from "./web/auth/reglage.js";
|
|
|
8
8
|
export { AdminUsersPage } from "./web/admin/users.js";
|
|
9
9
|
export { default as UserPage } from "./web/admin/users/[id].js";
|
|
10
10
|
// Documentation
|
|
11
|
-
export {
|
|
11
|
+
export { Doc } from "./components/Doc.js";
|
|
12
|
+
export { Doc as AuthModuleDoc } from "./components/Doc.js";
|
|
12
13
|
// Configuration de build (utilisée par les scripts)
|
|
13
14
|
export { default as authBuildConfig } from "./auth.build.config.js";
|