@atlashub/smartstack-cli 1.5.1 → 1.5.2
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/.documentation/css/styles.css +2168 -2168
- package/.documentation/js/app.js +794 -794
- package/config/default-config.json +86 -86
- package/config/settings.json +53 -53
- package/config/settings.local.example.json +16 -16
- package/dist/index.js +0 -0
- package/dist/index.js.map +1 -1
- package/package.json +88 -88
- package/templates/agents/action.md +36 -36
- package/templates/agents/efcore/conflicts.md +84 -84
- package/templates/agents/efcore/db-deploy.md +51 -51
- package/templates/agents/efcore/db-reset.md +59 -59
- package/templates/agents/efcore/db-seed.md +56 -56
- package/templates/agents/efcore/db-status.md +64 -64
- package/templates/agents/efcore/migration.md +85 -85
- package/templates/agents/efcore/rebase-snapshot.md +62 -62
- package/templates/agents/efcore/scan.md +90 -90
- package/templates/agents/efcore/squash.md +67 -67
- package/templates/agents/explore-codebase.md +65 -65
- package/templates/agents/explore-docs.md +97 -97
- package/templates/agents/fix-grammar.md +49 -49
- package/templates/agents/gitflow/abort.md +45 -45
- package/templates/agents/gitflow/cleanup.md +85 -85
- package/templates/agents/gitflow/commit.md +40 -40
- package/templates/agents/gitflow/exec.md +48 -48
- package/templates/agents/gitflow/finish.md +92 -92
- package/templates/agents/gitflow/init.md +139 -139
- package/templates/agents/gitflow/merge.md +62 -62
- package/templates/agents/gitflow/plan.md +42 -42
- package/templates/agents/gitflow/pr.md +78 -78
- package/templates/agents/gitflow/review.md +49 -49
- package/templates/agents/gitflow/start.md +61 -61
- package/templates/agents/gitflow/status.md +32 -32
- package/templates/agents/snipper.md +36 -36
- package/templates/agents/websearch.md +46 -46
- package/templates/commands/_resources/formatting-guide.md +124 -124
- package/templates/commands/ai-prompt.md +315 -315
- package/templates/commands/apex/1-analyze.md +100 -100
- package/templates/commands/apex/2-plan.md +145 -145
- package/templates/commands/apex/3-execute.md +171 -171
- package/templates/commands/apex/4-examine.md +116 -116
- package/templates/commands/apex/5-tasks.md +209 -209
- package/templates/commands/apex.md +76 -76
- package/templates/commands/application/create.md +362 -362
- package/templates/commands/application/templates-backend.md +463 -463
- package/templates/commands/application/templates-frontend.md +517 -517
- package/templates/commands/application/templates-i18n.md +478 -478
- package/templates/commands/application/templates-seed.md +362 -362
- package/templates/commands/application.md +303 -303
- package/templates/commands/business-analyse/0-orchestrate.md +640 -640
- package/templates/commands/business-analyse/1-init.md +269 -269
- package/templates/commands/business-analyse/2-discover.md +520 -520
- package/templates/commands/business-analyse/3-analyse.md +408 -408
- package/templates/commands/business-analyse/4-specify.md +598 -598
- package/templates/commands/business-analyse/5-validate.md +326 -326
- package/templates/commands/business-analyse/6-handoff.md +746 -746
- package/templates/commands/business-analyse/7-doc-html.md +602 -602
- package/templates/commands/business-analyse/bug.md +325 -325
- package/templates/commands/business-analyse/change-request.md +368 -368
- package/templates/commands/business-analyse/hotfix.md +200 -200
- package/templates/commands/business-analyse.md +640 -640
- package/templates/commands/controller/create.md +216 -216
- package/templates/commands/controller/postman-templates.md +528 -528
- package/templates/commands/controller/templates.md +600 -600
- package/templates/commands/controller.md +337 -337
- package/templates/commands/create/agent.md +138 -138
- package/templates/commands/create/command.md +166 -166
- package/templates/commands/create/hook.md +234 -234
- package/templates/commands/create/plugin.md +329 -329
- package/templates/commands/create/project.md +507 -507
- package/templates/commands/create/skill.md +199 -199
- package/templates/commands/create.md +220 -220
- package/templates/commands/debug.md +95 -95
- package/templates/commands/documentation/module.md +202 -202
- package/templates/commands/documentation/templates.md +432 -432
- package/templates/commands/documentation.md +190 -190
- package/templates/commands/efcore/_env-check.md +153 -153
- package/templates/commands/efcore/conflicts.md +186 -186
- package/templates/commands/efcore/db-deploy.md +193 -193
- package/templates/commands/efcore/db-reset.md +426 -426
- package/templates/commands/efcore/db-seed.md +326 -326
- package/templates/commands/efcore/db-status.md +226 -226
- package/templates/commands/efcore/migration.md +400 -400
- package/templates/commands/efcore/rebase-snapshot.md +264 -264
- package/templates/commands/efcore/scan.md +198 -198
- package/templates/commands/efcore/squash.md +298 -298
- package/templates/commands/efcore.md +224 -224
- package/templates/commands/epct.md +69 -69
- package/templates/commands/explain.md +186 -186
- package/templates/commands/explore.md +45 -45
- package/templates/commands/feature-full.md +267 -267
- package/templates/commands/gitflow/1-init.md +1038 -1038
- package/templates/commands/gitflow/10-start.md +768 -768
- package/templates/commands/gitflow/11-finish.md +457 -457
- package/templates/commands/gitflow/12-cleanup.md +276 -276
- package/templates/commands/gitflow/13-sync.md +216 -216
- package/templates/commands/gitflow/14-rebase.md +251 -251
- package/templates/commands/gitflow/2-status.md +277 -277
- package/templates/commands/gitflow/3-commit.md +344 -344
- package/templates/commands/gitflow/4-plan.md +145 -145
- package/templates/commands/gitflow/5-exec.md +147 -147
- package/templates/commands/gitflow/6-abort.md +344 -344
- package/templates/commands/gitflow/7-pull-request.md +453 -355
- package/templates/commands/gitflow/8-review.md +240 -176
- package/templates/commands/gitflow/9-merge.md +451 -365
- package/templates/commands/gitflow.md +128 -128
- package/templates/commands/implement.md +663 -663
- package/templates/commands/init.md +567 -567
- package/templates/commands/mcp-integration.md +330 -330
- package/templates/commands/notification.md +129 -129
- package/templates/commands/oneshot.md +57 -57
- package/templates/commands/quick-search.md +72 -72
- package/templates/commands/ralph-loop/cancel-ralph.md +18 -18
- package/templates/commands/ralph-loop/help.md +126 -126
- package/templates/commands/ralph-loop/ralph-loop.md +18 -18
- package/templates/commands/review.md +106 -106
- package/templates/commands/utils/test-web-config.md +160 -160
- package/templates/commands/utils/test-web.md +151 -151
- package/templates/commands/validate.md +233 -233
- package/templates/commands/workflow.md +193 -193
- package/templates/gitflow/config.json +138 -138
- package/templates/hooks/ef-migration-check.md +139 -139
- package/templates/hooks/hooks.json +25 -25
- package/templates/hooks/stop-hook.sh +177 -177
- package/templates/skills/ai-prompt/SKILL.md +778 -778
- package/templates/skills/application/SKILL.md +563 -563
- package/templates/skills/application/templates-backend.md +450 -450
- package/templates/skills/application/templates-frontend.md +531 -531
- package/templates/skills/application/templates-i18n.md +520 -520
- package/templates/skills/application/templates-seed.md +647 -647
- package/templates/skills/business-analyse/SKILL.md +191 -191
- package/templates/skills/business-analyse/questionnaire.md +283 -283
- package/templates/skills/business-analyse/templates-frd.md +477 -477
- package/templates/skills/business-analyse/templates-react.md +580 -580
- package/templates/skills/controller/SKILL.md +240 -240
- package/templates/skills/controller/postman-templates.md +614 -614
- package/templates/skills/controller/templates.md +1468 -1468
- package/templates/skills/documentation/SKILL.md +133 -133
- package/templates/skills/documentation/templates.md +476 -476
- package/templates/skills/feature-full/SKILL.md +838 -838
- package/templates/skills/notification/SKILL.md +555 -555
- package/templates/skills/ui-components/SKILL.md +870 -870
- package/templates/skills/workflow/SKILL.md +582 -582
- package/templates/test-web/api-health.json +38 -38
- package/templates/test-web/minimal.json +19 -19
- package/templates/test-web/npm-package.json +46 -46
- package/templates/test-web/seo-check.json +54 -54
|
@@ -1,362 +1,362 @@
|
|
|
1
|
-
# Templates DB Seed - Application Skill
|
|
2
|
-
|
|
3
|
-
> Ces templates génèrent les seeds EF Core pour les entités de navigation et leurs traductions.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## RÈGLES DE GÉNÉRATION GUID (SÉCURITÉ CRITIQUE)
|
|
8
|
-
|
|
9
|
-
> **IMPORTANT:** Les GUIDs prévisibles sont une faille de sécurité.
|
|
10
|
-
> Utiliser TOUJOURS des GUIDs aléatoires générés cryptographiquement.
|
|
11
|
-
|
|
12
|
-
### ❌ INTERDIT - Pattern prévisible
|
|
13
|
-
|
|
14
|
-
```csharp
|
|
15
|
-
// JAMAIS FAIRE CECI - Pattern prévisible = faille de sécurité
|
|
16
|
-
private static Guid GenerateGuid(int index)
|
|
17
|
-
{
|
|
18
|
-
return Guid.Parse($"11111111-1111-1111-1111-{index:D12}");
|
|
19
|
-
}
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
### ✅ CORRECT - GUIDs aléatoires
|
|
23
|
-
|
|
24
|
-
```csharp
|
|
25
|
-
// Méthode 1: Génération à la volée (recommandé pour les seeds)
|
|
26
|
-
// Générer les GUIDs avec PowerShell: [guid]::NewGuid().ToString()
|
|
27
|
-
// Ou avec C#: Guid.NewGuid().ToString()
|
|
28
|
-
|
|
29
|
-
// Méthode 2: Cache pour éviter les doublons dans une même exécution
|
|
30
|
-
private static readonly Dictionary<string, Guid> _guidCache = new();
|
|
31
|
-
|
|
32
|
-
private static Guid GetOrCreateGuid(string key)
|
|
33
|
-
{
|
|
34
|
-
if (!_guidCache.TryGetValue(key, out var guid))
|
|
35
|
-
{
|
|
36
|
-
guid = Guid.NewGuid();
|
|
37
|
-
_guidCache[key] = guid;
|
|
38
|
-
}
|
|
39
|
-
return guid;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Usage:
|
|
43
|
-
var contextGuid = GetOrCreateGuid($"context.{contextCode}");
|
|
44
|
-
var appGuid = GetOrCreateGuid($"app.{contextCode}.{appCode}");
|
|
45
|
-
var moduleGuid = GetOrCreateGuid($"module.{contextCode}.{appCode}.{moduleCode}");
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Génération de GUIDs pour les Seeds
|
|
49
|
-
|
|
50
|
-
```powershell
|
|
51
|
-
# PowerShell (Windows) - Exécuter pour chaque entité
|
|
52
|
-
[guid]::NewGuid().ToString()
|
|
53
|
-
|
|
54
|
-
# Exemple de sortie:
|
|
55
|
-
# f7a3c2e8-9d1b-4e5f-a6c8-2b4d9f7e1a3c
|
|
56
|
-
# b2e8d4f6-1c9a-5b7e-8d3f-6a2c9e4b7d1f
|
|
57
|
-
# ... générer autant que nécessaire
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## TEMPLATE: CONTEXT
|
|
63
|
-
|
|
64
|
-
> **RAPPEL:** Les contexts (platform, personal, business) sont prédéfinis.
|
|
65
|
-
> Ce template est fourni pour référence mais ne devrait PAS être utilisé pour créer de nouveaux contexts.
|
|
66
|
-
|
|
67
|
-
### Navigation Entity
|
|
68
|
-
|
|
69
|
-
```csharp
|
|
70
|
-
// Dans NavigationContextConfiguration.cs - HasData()
|
|
71
|
-
new {
|
|
72
|
-
Id = Guid.Parse("$CONTEXT_GUID"), // GUID aléatoire généré
|
|
73
|
-
Code = "$CODE", // ex: "business"
|
|
74
|
-
Label = "$LABEL_FR",
|
|
75
|
-
Description = "$DESC_FR",
|
|
76
|
-
Icon = "$ICON",
|
|
77
|
-
IconType = IconType.Lucide,
|
|
78
|
-
Route = "/$CODE",
|
|
79
|
-
DisplayOrder = $ORDER,
|
|
80
|
-
IsActive = true,
|
|
81
|
-
CreatedAt = seedDate
|
|
82
|
-
}
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### Translations (4 langues)
|
|
86
|
-
|
|
87
|
-
```csharp
|
|
88
|
-
// Dans NavigationTranslationConfiguration.cs - GetSeedData()
|
|
89
|
-
// Utiliser des GUIDs aléatoires pour chaque traduction
|
|
90
|
-
|
|
91
|
-
translations.Add(new {
|
|
92
|
-
Id = Guid.Parse("$RANDOM_GUID_1"), // Générer avec [guid]::NewGuid()
|
|
93
|
-
EntityType = NavigationEntityType.Context,
|
|
94
|
-
EntityId = $CONTEXT_GUID,
|
|
95
|
-
LanguageCode = "fr",
|
|
96
|
-
Label = "$LABEL_FR",
|
|
97
|
-
Description = "$DESC_FR",
|
|
98
|
-
CreatedAt = seedDate
|
|
99
|
-
});
|
|
100
|
-
translations.Add(new {
|
|
101
|
-
Id = Guid.Parse("$RANDOM_GUID_2"), // Générer avec [guid]::NewGuid()
|
|
102
|
-
EntityType = NavigationEntityType.Context,
|
|
103
|
-
EntityId = $CONTEXT_GUID,
|
|
104
|
-
LanguageCode = "en",
|
|
105
|
-
Label = "$LABEL_EN",
|
|
106
|
-
Description = "$DESC_EN",
|
|
107
|
-
CreatedAt = seedDate
|
|
108
|
-
});
|
|
109
|
-
translations.Add(new {
|
|
110
|
-
Id = Guid.Parse("$RANDOM_GUID_3"), // Générer avec [guid]::NewGuid()
|
|
111
|
-
EntityType = NavigationEntityType.Context,
|
|
112
|
-
EntityId = $CONTEXT_GUID,
|
|
113
|
-
LanguageCode = "it",
|
|
114
|
-
Label = "$LABEL_IT",
|
|
115
|
-
Description = "$DESC_IT",
|
|
116
|
-
CreatedAt = seedDate
|
|
117
|
-
});
|
|
118
|
-
translations.Add(new {
|
|
119
|
-
Id = Guid.Parse("$RANDOM_GUID_4"), // Générer avec [guid]::NewGuid()
|
|
120
|
-
EntityType = NavigationEntityType.Context,
|
|
121
|
-
EntityId = $CONTEXT_GUID,
|
|
122
|
-
LanguageCode = "de",
|
|
123
|
-
Label = "$LABEL_DE",
|
|
124
|
-
Description = "$DESC_DE",
|
|
125
|
-
CreatedAt = seedDate
|
|
126
|
-
});
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
## TEMPLATE: APPLICATION
|
|
132
|
-
|
|
133
|
-
> **RAPPEL:** Les applications ne peuvent être créées que dans le context `business`.
|
|
134
|
-
|
|
135
|
-
### Navigation Entity
|
|
136
|
-
|
|
137
|
-
```csharp
|
|
138
|
-
// Dans NavigationApplicationConfiguration.cs - HasData()
|
|
139
|
-
new {
|
|
140
|
-
Id = Guid.Parse("$APP_GUID"), // GUID aléatoire
|
|
141
|
-
ContextId = Guid.Parse("$BUSINESS_CONTEXT_GUID"), // Toujours business
|
|
142
|
-
Code = "$CODE",
|
|
143
|
-
Label = "$LABEL_FR",
|
|
144
|
-
Description = "$DESC_FR",
|
|
145
|
-
Icon = "$ICON",
|
|
146
|
-
IconType = IconType.Lucide,
|
|
147
|
-
Route = "/business/$CODE", // Toujours sous /business/
|
|
148
|
-
DisplayOrder = $ORDER,
|
|
149
|
-
IsActive = true,
|
|
150
|
-
CreatedAt = seedDate
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
### Translations (4 langues)
|
|
155
|
-
|
|
156
|
-
```csharp
|
|
157
|
-
// Application translations - GUIDs aléatoires
|
|
158
|
-
translations.Add(new {
|
|
159
|
-
Id = Guid.Parse("$RANDOM_GUID_1"),
|
|
160
|
-
EntityType = NavigationEntityType.Application,
|
|
161
|
-
EntityId = $APP_GUID,
|
|
162
|
-
LanguageCode = "fr",
|
|
163
|
-
Label = "$LABEL_FR",
|
|
164
|
-
Description = "$DESC_FR",
|
|
165
|
-
CreatedAt = seedDate
|
|
166
|
-
});
|
|
167
|
-
// ... en, it, de avec GUIDs aléatoires
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
## TEMPLATE: MODULE
|
|
173
|
-
|
|
174
|
-
### Navigation Entity
|
|
175
|
-
|
|
176
|
-
```csharp
|
|
177
|
-
// Dans NavigationModuleConfiguration.cs - HasData()
|
|
178
|
-
new {
|
|
179
|
-
Id = Guid.Parse("$MODULE_GUID"), // GUID aléatoire
|
|
180
|
-
ApplicationId = Guid.Parse("$APP_GUID"),
|
|
181
|
-
Code = "$CODE",
|
|
182
|
-
Label = "$LABEL_FR",
|
|
183
|
-
Description = "$DESC_FR",
|
|
184
|
-
Icon = "$ICON",
|
|
185
|
-
IconType = IconType.Lucide,
|
|
186
|
-
Route = "/business/$APP/$CODE",
|
|
187
|
-
DisplayOrder = $ORDER,
|
|
188
|
-
IsActive = true,
|
|
189
|
-
CreatedAt = seedDate
|
|
190
|
-
}
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
### Translations (4 langues)
|
|
194
|
-
|
|
195
|
-
```csharp
|
|
196
|
-
// Module translations - GUIDs aléatoires
|
|
197
|
-
translations.Add(new {
|
|
198
|
-
Id = Guid.Parse("$RANDOM_GUID_1"),
|
|
199
|
-
EntityType = NavigationEntityType.Module,
|
|
200
|
-
EntityId = $MODULE_GUID,
|
|
201
|
-
LanguageCode = "fr",
|
|
202
|
-
Label = "$LABEL_FR",
|
|
203
|
-
Description = "$DESC_FR",
|
|
204
|
-
CreatedAt = seedDate
|
|
205
|
-
});
|
|
206
|
-
// ... en, it, de
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
## TEMPLATE: SECTION
|
|
212
|
-
|
|
213
|
-
### Navigation Entity
|
|
214
|
-
|
|
215
|
-
```csharp
|
|
216
|
-
// Dans NavigationSectionConfiguration.cs - HasData()
|
|
217
|
-
new {
|
|
218
|
-
Id = Guid.Parse("$SECTION_GUID"), // GUID aléatoire
|
|
219
|
-
ModuleId = Guid.Parse("$MODULE_GUID"),
|
|
220
|
-
Code = "$CODE",
|
|
221
|
-
Label = "$LABEL_FR",
|
|
222
|
-
Description = "$DESC_FR",
|
|
223
|
-
Icon = "$ICON",
|
|
224
|
-
IconType = IconType.Lucide,
|
|
225
|
-
Route = "/business/$APP/$MODULE/$CODE",
|
|
226
|
-
DisplayOrder = $ORDER,
|
|
227
|
-
IsActive = true,
|
|
228
|
-
CreatedAt = seedDate
|
|
229
|
-
}
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
## TEMPLATE: PERMISSIONS SEED
|
|
235
|
-
|
|
236
|
-
### Permission Entity
|
|
237
|
-
|
|
238
|
-
```csharp
|
|
239
|
-
// Dans PermissionConfiguration.cs - HasData()
|
|
240
|
-
// Pour chaque action CRUD + assign + execute
|
|
241
|
-
// TOUS les GUIDs doivent être aléatoires
|
|
242
|
-
|
|
243
|
-
var seedDate = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
|
244
|
-
|
|
245
|
-
// Read
|
|
246
|
-
new {
|
|
247
|
-
Id = Guid.Parse("$RANDOM_GUID_READ"), // Générer avec [guid]::NewGuid()
|
|
248
|
-
Code = "business.$APP.$MODULE.read",
|
|
249
|
-
Name = "View $MODULE_LABEL",
|
|
250
|
-
Description = "View $MODULE_LABEL list and details",
|
|
251
|
-
Category = "business.$APP.$MODULE",
|
|
252
|
-
CreatedAt = seedDate
|
|
253
|
-
},
|
|
254
|
-
// Create
|
|
255
|
-
new {
|
|
256
|
-
Id = Guid.Parse("$RANDOM_GUID_CREATE"),
|
|
257
|
-
Code = "business.$APP.$MODULE.create",
|
|
258
|
-
Name = "Create $MODULE_LABEL",
|
|
259
|
-
Description = "Create new $MODULE_LABEL",
|
|
260
|
-
Category = "business.$APP.$MODULE",
|
|
261
|
-
CreatedAt = seedDate
|
|
262
|
-
},
|
|
263
|
-
// Update
|
|
264
|
-
new {
|
|
265
|
-
Id = Guid.Parse("$RANDOM_GUID_UPDATE"),
|
|
266
|
-
Code = "business.$APP.$MODULE.update",
|
|
267
|
-
Name = "Update $MODULE_LABEL",
|
|
268
|
-
Description = "Modify existing $MODULE_LABEL",
|
|
269
|
-
Category = "business.$APP.$MODULE",
|
|
270
|
-
CreatedAt = seedDate
|
|
271
|
-
},
|
|
272
|
-
// Delete
|
|
273
|
-
new {
|
|
274
|
-
Id = Guid.Parse("$RANDOM_GUID_DELETE"),
|
|
275
|
-
Code = "business.$APP.$MODULE.delete",
|
|
276
|
-
Name = "Delete $MODULE_LABEL",
|
|
277
|
-
Description = "Remove $MODULE_LABEL",
|
|
278
|
-
Category = "business.$APP.$MODULE",
|
|
279
|
-
CreatedAt = seedDate
|
|
280
|
-
}
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
### RolePermission Seed (Default Roles)
|
|
284
|
-
|
|
285
|
-
```csharp
|
|
286
|
-
// Dans RolePermissionConfiguration.cs - HasData()
|
|
287
|
-
// SuperAdmin gets all permissions automatically (wildcard)
|
|
288
|
-
|
|
289
|
-
// BusinessAdmin - gets all business permissions
|
|
290
|
-
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_READ_GUID },
|
|
291
|
-
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_CREATE_GUID },
|
|
292
|
-
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_UPDATE_GUID },
|
|
293
|
-
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_DELETE_GUID },
|
|
294
|
-
|
|
295
|
-
// StandardUser - read only by default
|
|
296
|
-
new { RoleId = Guid.Parse("...StandardUserRoleId..."), PermissionId = $PERM_READ_GUID }
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
---
|
|
300
|
-
|
|
301
|
-
## EXEMPLE COMPLET: Module "Leads" dans "Business > CRM"
|
|
302
|
-
|
|
303
|
-
### Variables
|
|
304
|
-
|
|
305
|
-
```
|
|
306
|
-
$CONTEXT = business (prédéfini)
|
|
307
|
-
$APP = crm
|
|
308
|
-
$APP_GUID = (générer avec [guid]::NewGuid())
|
|
309
|
-
$MODULE = leads
|
|
310
|
-
$MODULE_GUID = (générer avec [guid]::NewGuid())
|
|
311
|
-
|
|
312
|
-
$LABEL_FR = Prospects
|
|
313
|
-
$LABEL_EN = Leads
|
|
314
|
-
$LABEL_IT = Contatti
|
|
315
|
-
$LABEL_DE = Leads
|
|
316
|
-
|
|
317
|
-
$DESC_FR = Gestion des prospects
|
|
318
|
-
$DESC_EN = Lead management
|
|
319
|
-
$DESC_IT = Gestione contatti
|
|
320
|
-
$DESC_DE = Lead-Verwaltung
|
|
321
|
-
|
|
322
|
-
$ICON = Users
|
|
323
|
-
$ORDER = 1
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
### Fichiers à modifier
|
|
327
|
-
|
|
328
|
-
1. `NavigationApplicationConfiguration.cs` - Ajouter application CRM (si nouveau)
|
|
329
|
-
2. `NavigationModuleConfiguration.cs` - Ajouter module Leads
|
|
330
|
-
3. `NavigationTranslationConfiguration.cs` - Ajouter 4 traductions × nombre d'entités
|
|
331
|
-
4. `PermissionConfiguration.cs` - Ajouter permissions CRUD
|
|
332
|
-
5. `RolePermissionConfiguration.cs` - Assigner aux rôles par défaut
|
|
333
|
-
|
|
334
|
-
---
|
|
335
|
-
|
|
336
|
-
## CHECKLIST SEED
|
|
337
|
-
|
|
338
|
-
| Vérification | Status |
|
|
339
|
-
|--------------|--------|
|
|
340
|
-
| ☐ GUIDs aléatoires (PAS de pattern prévisible) | |
|
|
341
|
-
| ☐ Context = "business" (pas platform/personal) | |
|
|
342
|
-
| ☐ 4 langues pour chaque entité | |
|
|
343
|
-
| ☐ Route alignée avec permission path | |
|
|
344
|
-
| ☐ DisplayOrder cohérent | |
|
|
345
|
-
| ☐ Permissions CRUD créées | |
|
|
346
|
-
| ☐ RolePermissions assignés | |
|
|
347
|
-
|
|
348
|
-
---
|
|
349
|
-
|
|
350
|
-
## VALIDATION GUID AVANT COMMIT
|
|
351
|
-
|
|
352
|
-
```bash
|
|
353
|
-
# Vérifier qu'aucun GUID prévisible n'a été utilisé
|
|
354
|
-
# Ces patterns sont INTERDITS:
|
|
355
|
-
|
|
356
|
-
grep -r "11111111-1111" . # Pattern 1111...
|
|
357
|
-
grep -r "00000000-0000" . # Pattern 0000...
|
|
358
|
-
grep -r "aaaaaaaa-aaaa" . # Pattern répétitif
|
|
359
|
-
grep -r "{index:D12}" . # Génération séquentielle
|
|
360
|
-
|
|
361
|
-
# Si un de ces patterns est trouvé → CORRIGER avant commit
|
|
362
|
-
```
|
|
1
|
+
# Templates DB Seed - Application Skill
|
|
2
|
+
|
|
3
|
+
> Ces templates génèrent les seeds EF Core pour les entités de navigation et leurs traductions.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## RÈGLES DE GÉNÉRATION GUID (SÉCURITÉ CRITIQUE)
|
|
8
|
+
|
|
9
|
+
> **IMPORTANT:** Les GUIDs prévisibles sont une faille de sécurité.
|
|
10
|
+
> Utiliser TOUJOURS des GUIDs aléatoires générés cryptographiquement.
|
|
11
|
+
|
|
12
|
+
### ❌ INTERDIT - Pattern prévisible
|
|
13
|
+
|
|
14
|
+
```csharp
|
|
15
|
+
// JAMAIS FAIRE CECI - Pattern prévisible = faille de sécurité
|
|
16
|
+
private static Guid GenerateGuid(int index)
|
|
17
|
+
{
|
|
18
|
+
return Guid.Parse($"11111111-1111-1111-1111-{index:D12}");
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### ✅ CORRECT - GUIDs aléatoires
|
|
23
|
+
|
|
24
|
+
```csharp
|
|
25
|
+
// Méthode 1: Génération à la volée (recommandé pour les seeds)
|
|
26
|
+
// Générer les GUIDs avec PowerShell: [guid]::NewGuid().ToString()
|
|
27
|
+
// Ou avec C#: Guid.NewGuid().ToString()
|
|
28
|
+
|
|
29
|
+
// Méthode 2: Cache pour éviter les doublons dans une même exécution
|
|
30
|
+
private static readonly Dictionary<string, Guid> _guidCache = new();
|
|
31
|
+
|
|
32
|
+
private static Guid GetOrCreateGuid(string key)
|
|
33
|
+
{
|
|
34
|
+
if (!_guidCache.TryGetValue(key, out var guid))
|
|
35
|
+
{
|
|
36
|
+
guid = Guid.NewGuid();
|
|
37
|
+
_guidCache[key] = guid;
|
|
38
|
+
}
|
|
39
|
+
return guid;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Usage:
|
|
43
|
+
var contextGuid = GetOrCreateGuid($"context.{contextCode}");
|
|
44
|
+
var appGuid = GetOrCreateGuid($"app.{contextCode}.{appCode}");
|
|
45
|
+
var moduleGuid = GetOrCreateGuid($"module.{contextCode}.{appCode}.{moduleCode}");
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Génération de GUIDs pour les Seeds
|
|
49
|
+
|
|
50
|
+
```powershell
|
|
51
|
+
# PowerShell (Windows) - Exécuter pour chaque entité
|
|
52
|
+
[guid]::NewGuid().ToString()
|
|
53
|
+
|
|
54
|
+
# Exemple de sortie:
|
|
55
|
+
# f7a3c2e8-9d1b-4e5f-a6c8-2b4d9f7e1a3c
|
|
56
|
+
# b2e8d4f6-1c9a-5b7e-8d3f-6a2c9e4b7d1f
|
|
57
|
+
# ... générer autant que nécessaire
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## TEMPLATE: CONTEXT
|
|
63
|
+
|
|
64
|
+
> **RAPPEL:** Les contexts (platform, personal, business) sont prédéfinis.
|
|
65
|
+
> Ce template est fourni pour référence mais ne devrait PAS être utilisé pour créer de nouveaux contexts.
|
|
66
|
+
|
|
67
|
+
### Navigation Entity
|
|
68
|
+
|
|
69
|
+
```csharp
|
|
70
|
+
// Dans NavigationContextConfiguration.cs - HasData()
|
|
71
|
+
new {
|
|
72
|
+
Id = Guid.Parse("$CONTEXT_GUID"), // GUID aléatoire généré
|
|
73
|
+
Code = "$CODE", // ex: "business"
|
|
74
|
+
Label = "$LABEL_FR",
|
|
75
|
+
Description = "$DESC_FR",
|
|
76
|
+
Icon = "$ICON",
|
|
77
|
+
IconType = IconType.Lucide,
|
|
78
|
+
Route = "/$CODE",
|
|
79
|
+
DisplayOrder = $ORDER,
|
|
80
|
+
IsActive = true,
|
|
81
|
+
CreatedAt = seedDate
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Translations (4 langues)
|
|
86
|
+
|
|
87
|
+
```csharp
|
|
88
|
+
// Dans NavigationTranslationConfiguration.cs - GetSeedData()
|
|
89
|
+
// Utiliser des GUIDs aléatoires pour chaque traduction
|
|
90
|
+
|
|
91
|
+
translations.Add(new {
|
|
92
|
+
Id = Guid.Parse("$RANDOM_GUID_1"), // Générer avec [guid]::NewGuid()
|
|
93
|
+
EntityType = NavigationEntityType.Context,
|
|
94
|
+
EntityId = $CONTEXT_GUID,
|
|
95
|
+
LanguageCode = "fr",
|
|
96
|
+
Label = "$LABEL_FR",
|
|
97
|
+
Description = "$DESC_FR",
|
|
98
|
+
CreatedAt = seedDate
|
|
99
|
+
});
|
|
100
|
+
translations.Add(new {
|
|
101
|
+
Id = Guid.Parse("$RANDOM_GUID_2"), // Générer avec [guid]::NewGuid()
|
|
102
|
+
EntityType = NavigationEntityType.Context,
|
|
103
|
+
EntityId = $CONTEXT_GUID,
|
|
104
|
+
LanguageCode = "en",
|
|
105
|
+
Label = "$LABEL_EN",
|
|
106
|
+
Description = "$DESC_EN",
|
|
107
|
+
CreatedAt = seedDate
|
|
108
|
+
});
|
|
109
|
+
translations.Add(new {
|
|
110
|
+
Id = Guid.Parse("$RANDOM_GUID_3"), // Générer avec [guid]::NewGuid()
|
|
111
|
+
EntityType = NavigationEntityType.Context,
|
|
112
|
+
EntityId = $CONTEXT_GUID,
|
|
113
|
+
LanguageCode = "it",
|
|
114
|
+
Label = "$LABEL_IT",
|
|
115
|
+
Description = "$DESC_IT",
|
|
116
|
+
CreatedAt = seedDate
|
|
117
|
+
});
|
|
118
|
+
translations.Add(new {
|
|
119
|
+
Id = Guid.Parse("$RANDOM_GUID_4"), // Générer avec [guid]::NewGuid()
|
|
120
|
+
EntityType = NavigationEntityType.Context,
|
|
121
|
+
EntityId = $CONTEXT_GUID,
|
|
122
|
+
LanguageCode = "de",
|
|
123
|
+
Label = "$LABEL_DE",
|
|
124
|
+
Description = "$DESC_DE",
|
|
125
|
+
CreatedAt = seedDate
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## TEMPLATE: APPLICATION
|
|
132
|
+
|
|
133
|
+
> **RAPPEL:** Les applications ne peuvent être créées que dans le context `business`.
|
|
134
|
+
|
|
135
|
+
### Navigation Entity
|
|
136
|
+
|
|
137
|
+
```csharp
|
|
138
|
+
// Dans NavigationApplicationConfiguration.cs - HasData()
|
|
139
|
+
new {
|
|
140
|
+
Id = Guid.Parse("$APP_GUID"), // GUID aléatoire
|
|
141
|
+
ContextId = Guid.Parse("$BUSINESS_CONTEXT_GUID"), // Toujours business
|
|
142
|
+
Code = "$CODE",
|
|
143
|
+
Label = "$LABEL_FR",
|
|
144
|
+
Description = "$DESC_FR",
|
|
145
|
+
Icon = "$ICON",
|
|
146
|
+
IconType = IconType.Lucide,
|
|
147
|
+
Route = "/business/$CODE", // Toujours sous /business/
|
|
148
|
+
DisplayOrder = $ORDER,
|
|
149
|
+
IsActive = true,
|
|
150
|
+
CreatedAt = seedDate
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Translations (4 langues)
|
|
155
|
+
|
|
156
|
+
```csharp
|
|
157
|
+
// Application translations - GUIDs aléatoires
|
|
158
|
+
translations.Add(new {
|
|
159
|
+
Id = Guid.Parse("$RANDOM_GUID_1"),
|
|
160
|
+
EntityType = NavigationEntityType.Application,
|
|
161
|
+
EntityId = $APP_GUID,
|
|
162
|
+
LanguageCode = "fr",
|
|
163
|
+
Label = "$LABEL_FR",
|
|
164
|
+
Description = "$DESC_FR",
|
|
165
|
+
CreatedAt = seedDate
|
|
166
|
+
});
|
|
167
|
+
// ... en, it, de avec GUIDs aléatoires
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## TEMPLATE: MODULE
|
|
173
|
+
|
|
174
|
+
### Navigation Entity
|
|
175
|
+
|
|
176
|
+
```csharp
|
|
177
|
+
// Dans NavigationModuleConfiguration.cs - HasData()
|
|
178
|
+
new {
|
|
179
|
+
Id = Guid.Parse("$MODULE_GUID"), // GUID aléatoire
|
|
180
|
+
ApplicationId = Guid.Parse("$APP_GUID"),
|
|
181
|
+
Code = "$CODE",
|
|
182
|
+
Label = "$LABEL_FR",
|
|
183
|
+
Description = "$DESC_FR",
|
|
184
|
+
Icon = "$ICON",
|
|
185
|
+
IconType = IconType.Lucide,
|
|
186
|
+
Route = "/business/$APP/$CODE",
|
|
187
|
+
DisplayOrder = $ORDER,
|
|
188
|
+
IsActive = true,
|
|
189
|
+
CreatedAt = seedDate
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Translations (4 langues)
|
|
194
|
+
|
|
195
|
+
```csharp
|
|
196
|
+
// Module translations - GUIDs aléatoires
|
|
197
|
+
translations.Add(new {
|
|
198
|
+
Id = Guid.Parse("$RANDOM_GUID_1"),
|
|
199
|
+
EntityType = NavigationEntityType.Module,
|
|
200
|
+
EntityId = $MODULE_GUID,
|
|
201
|
+
LanguageCode = "fr",
|
|
202
|
+
Label = "$LABEL_FR",
|
|
203
|
+
Description = "$DESC_FR",
|
|
204
|
+
CreatedAt = seedDate
|
|
205
|
+
});
|
|
206
|
+
// ... en, it, de
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## TEMPLATE: SECTION
|
|
212
|
+
|
|
213
|
+
### Navigation Entity
|
|
214
|
+
|
|
215
|
+
```csharp
|
|
216
|
+
// Dans NavigationSectionConfiguration.cs - HasData()
|
|
217
|
+
new {
|
|
218
|
+
Id = Guid.Parse("$SECTION_GUID"), // GUID aléatoire
|
|
219
|
+
ModuleId = Guid.Parse("$MODULE_GUID"),
|
|
220
|
+
Code = "$CODE",
|
|
221
|
+
Label = "$LABEL_FR",
|
|
222
|
+
Description = "$DESC_FR",
|
|
223
|
+
Icon = "$ICON",
|
|
224
|
+
IconType = IconType.Lucide,
|
|
225
|
+
Route = "/business/$APP/$MODULE/$CODE",
|
|
226
|
+
DisplayOrder = $ORDER,
|
|
227
|
+
IsActive = true,
|
|
228
|
+
CreatedAt = seedDate
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## TEMPLATE: PERMISSIONS SEED
|
|
235
|
+
|
|
236
|
+
### Permission Entity
|
|
237
|
+
|
|
238
|
+
```csharp
|
|
239
|
+
// Dans PermissionConfiguration.cs - HasData()
|
|
240
|
+
// Pour chaque action CRUD + assign + execute
|
|
241
|
+
// TOUS les GUIDs doivent être aléatoires
|
|
242
|
+
|
|
243
|
+
var seedDate = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
|
244
|
+
|
|
245
|
+
// Read
|
|
246
|
+
new {
|
|
247
|
+
Id = Guid.Parse("$RANDOM_GUID_READ"), // Générer avec [guid]::NewGuid()
|
|
248
|
+
Code = "business.$APP.$MODULE.read",
|
|
249
|
+
Name = "View $MODULE_LABEL",
|
|
250
|
+
Description = "View $MODULE_LABEL list and details",
|
|
251
|
+
Category = "business.$APP.$MODULE",
|
|
252
|
+
CreatedAt = seedDate
|
|
253
|
+
},
|
|
254
|
+
// Create
|
|
255
|
+
new {
|
|
256
|
+
Id = Guid.Parse("$RANDOM_GUID_CREATE"),
|
|
257
|
+
Code = "business.$APP.$MODULE.create",
|
|
258
|
+
Name = "Create $MODULE_LABEL",
|
|
259
|
+
Description = "Create new $MODULE_LABEL",
|
|
260
|
+
Category = "business.$APP.$MODULE",
|
|
261
|
+
CreatedAt = seedDate
|
|
262
|
+
},
|
|
263
|
+
// Update
|
|
264
|
+
new {
|
|
265
|
+
Id = Guid.Parse("$RANDOM_GUID_UPDATE"),
|
|
266
|
+
Code = "business.$APP.$MODULE.update",
|
|
267
|
+
Name = "Update $MODULE_LABEL",
|
|
268
|
+
Description = "Modify existing $MODULE_LABEL",
|
|
269
|
+
Category = "business.$APP.$MODULE",
|
|
270
|
+
CreatedAt = seedDate
|
|
271
|
+
},
|
|
272
|
+
// Delete
|
|
273
|
+
new {
|
|
274
|
+
Id = Guid.Parse("$RANDOM_GUID_DELETE"),
|
|
275
|
+
Code = "business.$APP.$MODULE.delete",
|
|
276
|
+
Name = "Delete $MODULE_LABEL",
|
|
277
|
+
Description = "Remove $MODULE_LABEL",
|
|
278
|
+
Category = "business.$APP.$MODULE",
|
|
279
|
+
CreatedAt = seedDate
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### RolePermission Seed (Default Roles)
|
|
284
|
+
|
|
285
|
+
```csharp
|
|
286
|
+
// Dans RolePermissionConfiguration.cs - HasData()
|
|
287
|
+
// SuperAdmin gets all permissions automatically (wildcard)
|
|
288
|
+
|
|
289
|
+
// BusinessAdmin - gets all business permissions
|
|
290
|
+
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_READ_GUID },
|
|
291
|
+
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_CREATE_GUID },
|
|
292
|
+
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_UPDATE_GUID },
|
|
293
|
+
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_DELETE_GUID },
|
|
294
|
+
|
|
295
|
+
// StandardUser - read only by default
|
|
296
|
+
new { RoleId = Guid.Parse("...StandardUserRoleId..."), PermissionId = $PERM_READ_GUID }
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## EXEMPLE COMPLET: Module "Leads" dans "Business > CRM"
|
|
302
|
+
|
|
303
|
+
### Variables
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
$CONTEXT = business (prédéfini)
|
|
307
|
+
$APP = crm
|
|
308
|
+
$APP_GUID = (générer avec [guid]::NewGuid())
|
|
309
|
+
$MODULE = leads
|
|
310
|
+
$MODULE_GUID = (générer avec [guid]::NewGuid())
|
|
311
|
+
|
|
312
|
+
$LABEL_FR = Prospects
|
|
313
|
+
$LABEL_EN = Leads
|
|
314
|
+
$LABEL_IT = Contatti
|
|
315
|
+
$LABEL_DE = Leads
|
|
316
|
+
|
|
317
|
+
$DESC_FR = Gestion des prospects
|
|
318
|
+
$DESC_EN = Lead management
|
|
319
|
+
$DESC_IT = Gestione contatti
|
|
320
|
+
$DESC_DE = Lead-Verwaltung
|
|
321
|
+
|
|
322
|
+
$ICON = Users
|
|
323
|
+
$ORDER = 1
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Fichiers à modifier
|
|
327
|
+
|
|
328
|
+
1. `NavigationApplicationConfiguration.cs` - Ajouter application CRM (si nouveau)
|
|
329
|
+
2. `NavigationModuleConfiguration.cs` - Ajouter module Leads
|
|
330
|
+
3. `NavigationTranslationConfiguration.cs` - Ajouter 4 traductions × nombre d'entités
|
|
331
|
+
4. `PermissionConfiguration.cs` - Ajouter permissions CRUD
|
|
332
|
+
5. `RolePermissionConfiguration.cs` - Assigner aux rôles par défaut
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## CHECKLIST SEED
|
|
337
|
+
|
|
338
|
+
| Vérification | Status |
|
|
339
|
+
|--------------|--------|
|
|
340
|
+
| ☐ GUIDs aléatoires (PAS de pattern prévisible) | |
|
|
341
|
+
| ☐ Context = "business" (pas platform/personal) | |
|
|
342
|
+
| ☐ 4 langues pour chaque entité | |
|
|
343
|
+
| ☐ Route alignée avec permission path | |
|
|
344
|
+
| ☐ DisplayOrder cohérent | |
|
|
345
|
+
| ☐ Permissions CRUD créées | |
|
|
346
|
+
| ☐ RolePermissions assignés | |
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## VALIDATION GUID AVANT COMMIT
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
# Vérifier qu'aucun GUID prévisible n'a été utilisé
|
|
354
|
+
# Ces patterns sont INTERDITS:
|
|
355
|
+
|
|
356
|
+
grep -r "11111111-1111" . # Pattern 1111...
|
|
357
|
+
grep -r "00000000-0000" . # Pattern 0000...
|
|
358
|
+
grep -r "aaaaaaaa-aaaa" . # Pattern répétitif
|
|
359
|
+
grep -r "{index:D12}" . # Génération séquentielle
|
|
360
|
+
|
|
361
|
+
# Si un de ces patterns est trouvé → CORRIGER avant commit
|
|
362
|
+
```
|