# Templates DB Seed - Application Skill

> Ces templates génèrent les seeds EF Core pour les entités de navigation et leurs traductions.

---

## RÈGLES DE GÉNÉRATION GUID (SÉCURITÉ CRITIQUE)

> **IMPORTANT:** Les GUIDs prévisibles sont une faille de sécurité.
> Utiliser TOUJOURS des GUIDs aléatoires générés cryptographiquement.

### ❌ INTERDIT - Pattern prévisible

```csharp
// JAMAIS FAIRE CECI - Pattern prévisible = faille de sécurité
private static Guid GenerateGuid(int index)
{
    return Guid.Parse($"11111111-1111-1111-1111-{index:D12}");
}
```

### ✅ CORRECT - GUIDs aléatoires

```csharp
// Méthode 1: Génération à la volée (recommandé pour les seeds)
// Générer les GUIDs avec PowerShell: [guid]::NewGuid().ToString()
// Ou avec C#: Guid.NewGuid().ToString()

// Méthode 2: Cache pour éviter les doublons dans une même exécution
private static readonly Dictionary<string, Guid> _guidCache = new();

private static Guid GetOrCreateGuid(string key)
{
    if (!_guidCache.TryGetValue(key, out var guid))
    {
        guid = Guid.NewGuid();
        _guidCache[key] = guid;
    }
    return guid;
}

// Usage:
var contextGuid = GetOrCreateGuid($"context.{contextCode}");
var appGuid = GetOrCreateGuid($"app.{contextCode}.{appCode}");
var moduleGuid = GetOrCreateGuid($"module.{contextCode}.{appCode}.{moduleCode}");
```

### Génération de GUIDs pour les Seeds

```powershell
# PowerShell (Windows) - Exécuter pour chaque entité
[guid]::NewGuid().ToString()

# Exemple de sortie:
# f7a3c2e8-9d1b-4e5f-a6c8-2b4d9f7e1a3c
# b2e8d4f6-1c9a-5b7e-8d3f-6a2c9e4b7d1f
# ... générer autant que nécessaire
```

---

## TEMPLATE: CONTEXT

> **RAPPEL:** Les contexts (platform, personal, business) sont prédéfinis.
> Ce template est fourni pour référence mais ne devrait PAS être utilisé pour créer de nouveaux contexts.

### Navigation Entity

```csharp
// Dans NavigationContextConfiguration.cs - HasData()
new {
    Id = Guid.Parse("$CONTEXT_GUID"),  // GUID aléatoire généré
    Code = "$CODE",           // ex: "business"
    Label = "$LABEL_FR",
    Description = "$DESC_FR",
    Icon = "$ICON",
    IconType = IconType.Lucide,
    Route = "/$CODE",
    DisplayOrder = $ORDER,
    IsActive = true,
    CreatedAt = seedDate
}
```

### Translations (4 langues)

```csharp
// Dans NavigationTranslationConfiguration.cs - GetSeedData()
// Utiliser des GUIDs aléatoires pour chaque traduction

translations.Add(new {
    Id = Guid.Parse("$RANDOM_GUID_1"),  // Générer avec [guid]::NewGuid()
    EntityType = NavigationEntityType.Context,
    EntityId = $CONTEXT_GUID,
    LanguageCode = "fr",
    Label = "$LABEL_FR",
    Description = "$DESC_FR",
    CreatedAt = seedDate
});
translations.Add(new {
    Id = Guid.Parse("$RANDOM_GUID_2"),  // Générer avec [guid]::NewGuid()
    EntityType = NavigationEntityType.Context,
    EntityId = $CONTEXT_GUID,
    LanguageCode = "en",
    Label = "$LABEL_EN",
    Description = "$DESC_EN",
    CreatedAt = seedDate
});
translations.Add(new {
    Id = Guid.Parse("$RANDOM_GUID_3"),  // Générer avec [guid]::NewGuid()
    EntityType = NavigationEntityType.Context,
    EntityId = $CONTEXT_GUID,
    LanguageCode = "it",
    Label = "$LABEL_IT",
    Description = "$DESC_IT",
    CreatedAt = seedDate
});
translations.Add(new {
    Id = Guid.Parse("$RANDOM_GUID_4"),  // Générer avec [guid]::NewGuid()
    EntityType = NavigationEntityType.Context,
    EntityId = $CONTEXT_GUID,
    LanguageCode = "de",
    Label = "$LABEL_DE",
    Description = "$DESC_DE",
    CreatedAt = seedDate
});
```

---

## TEMPLATE: APPLICATION

> **RAPPEL:** Les applications ne peuvent être créées que dans le context `business`.

### Navigation Entity

```csharp
// Dans NavigationApplicationConfiguration.cs - HasData()
new {
    Id = Guid.Parse("$APP_GUID"),        // GUID aléatoire
    ContextId = Guid.Parse("$BUSINESS_CONTEXT_GUID"),  // Toujours business
    Code = "$CODE",
    Label = "$LABEL_FR",
    Description = "$DESC_FR",
    Icon = "$ICON",
    IconType = IconType.Lucide,
    Route = "/business/$CODE",  // Toujours sous /business/
    DisplayOrder = $ORDER,
    IsActive = true,
    CreatedAt = seedDate
}
```

### Translations (4 langues)

```csharp
// Application translations - GUIDs aléatoires
translations.Add(new {
    Id = Guid.Parse("$RANDOM_GUID_1"),
    EntityType = NavigationEntityType.Application,
    EntityId = $APP_GUID,
    LanguageCode = "fr",
    Label = "$LABEL_FR",
    Description = "$DESC_FR",
    CreatedAt = seedDate
});
// ... en, it, de avec GUIDs aléatoires
```

---

## TEMPLATE: MODULE

### Navigation Entity

```csharp
// Dans NavigationModuleConfiguration.cs - HasData()
new {
    Id = Guid.Parse("$MODULE_GUID"),     // GUID aléatoire
    ApplicationId = Guid.Parse("$APP_GUID"),
    Code = "$CODE",
    Label = "$LABEL_FR",
    Description = "$DESC_FR",
    Icon = "$ICON",
    IconType = IconType.Lucide,
    Route = "/business/$APP/$CODE",
    DisplayOrder = $ORDER,
    IsActive = true,
    CreatedAt = seedDate
}
```

### Translations (4 langues)

```csharp
// Module translations - GUIDs aléatoires
translations.Add(new {
    Id = Guid.Parse("$RANDOM_GUID_1"),
    EntityType = NavigationEntityType.Module,
    EntityId = $MODULE_GUID,
    LanguageCode = "fr",
    Label = "$LABEL_FR",
    Description = "$DESC_FR",
    CreatedAt = seedDate
});
// ... en, it, de
```

---

## TEMPLATE: SECTION

### Navigation Entity

```csharp
// Dans NavigationSectionConfiguration.cs - HasData()
new {
    Id = Guid.Parse("$SECTION_GUID"),    // GUID aléatoire
    ModuleId = Guid.Parse("$MODULE_GUID"),
    Code = "$CODE",
    Label = "$LABEL_FR",
    Description = "$DESC_FR",
    Icon = "$ICON",
    IconType = IconType.Lucide,
    Route = "/business/$APP/$MODULE/$CODE",
    DisplayOrder = $ORDER,
    IsActive = true,
    CreatedAt = seedDate
}
```

---

## TEMPLATE: PERMISSIONS SEED

### Permission Entity

```csharp
// Dans PermissionConfiguration.cs - HasData()
// Pour chaque action CRUD + assign + execute
// TOUS les GUIDs doivent être aléatoires

var seedDate = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc);

// Read
new {
    Id = Guid.Parse("$RANDOM_GUID_READ"),      // Générer avec [guid]::NewGuid()
    Code = "business.$APP.$MODULE.read",
    Name = "View $MODULE_LABEL",
    Description = "View $MODULE_LABEL list and details",
    Category = "business.$APP.$MODULE",
    CreatedAt = seedDate
},
// Create
new {
    Id = Guid.Parse("$RANDOM_GUID_CREATE"),
    Code = "business.$APP.$MODULE.create",
    Name = "Create $MODULE_LABEL",
    Description = "Create new $MODULE_LABEL",
    Category = "business.$APP.$MODULE",
    CreatedAt = seedDate
},
// Update
new {
    Id = Guid.Parse("$RANDOM_GUID_UPDATE"),
    Code = "business.$APP.$MODULE.update",
    Name = "Update $MODULE_LABEL",
    Description = "Modify existing $MODULE_LABEL",
    Category = "business.$APP.$MODULE",
    CreatedAt = seedDate
},
// Delete
new {
    Id = Guid.Parse("$RANDOM_GUID_DELETE"),
    Code = "business.$APP.$MODULE.delete",
    Name = "Delete $MODULE_LABEL",
    Description = "Remove $MODULE_LABEL",
    Category = "business.$APP.$MODULE",
    CreatedAt = seedDate
}
```

### RolePermission Seed (Default Roles)

```csharp
// Dans RolePermissionConfiguration.cs - HasData()
// SuperAdmin gets all permissions automatically (wildcard)

// BusinessAdmin - gets all business permissions
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_READ_GUID },
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_CREATE_GUID },
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_UPDATE_GUID },
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_DELETE_GUID },

// StandardUser - read only by default
new { RoleId = Guid.Parse("...StandardUserRoleId..."), PermissionId = $PERM_READ_GUID }
```

---

## EXEMPLE COMPLET: Module "Leads" dans "Business > CRM"

### Variables

```
$CONTEXT = business (prédéfini)
$APP = crm
$APP_GUID = (générer avec [guid]::NewGuid())
$MODULE = leads
$MODULE_GUID = (générer avec [guid]::NewGuid())

$LABEL_FR = Prospects
$LABEL_EN = Leads
$LABEL_IT = Contatti
$LABEL_DE = Leads

$DESC_FR = Gestion des prospects
$DESC_EN = Lead management
$DESC_IT = Gestione contatti
$DESC_DE = Lead-Verwaltung

$ICON = Users
$ORDER = 1
```

### Fichiers à modifier

1. `NavigationApplicationConfiguration.cs` - Ajouter application CRM (si nouveau)
2. `NavigationModuleConfiguration.cs` - Ajouter module Leads
3. `NavigationTranslationConfiguration.cs` - Ajouter 4 traductions × nombre d'entités
4. `PermissionConfiguration.cs` - Ajouter permissions CRUD
5. `RolePermissionConfiguration.cs` - Assigner aux rôles par défaut

---

## CHECKLIST SEED

| Vérification | Status |
|--------------|--------|
| ☐ GUIDs aléatoires (PAS de pattern prévisible) | |
| ☐ Context = "business" (pas platform/personal) | |
| ☐ 4 langues pour chaque entité | |
| ☐ Route alignée avec permission path | |
| ☐ DisplayOrder cohérent | |
| ☐ Permissions CRUD créées | |
| ☐ RolePermissions assignés | |

---

## VALIDATION GUID AVANT COMMIT

```bash
# Vérifier qu'aucun GUID prévisible n'a été utilisé
# Ces patterns sont INTERDITS:

grep -r "11111111-1111" .  # Pattern 1111...
grep -r "00000000-0000" .  # Pattern 0000...
grep -r "aaaaaaaa-aaaa" .  # Pattern répétitif
grep -r "{index:D12}" .    # Génération séquentielle

# Si un de ces patterns est trouvé → CORRIGER avant commit
```
