# Architecture Modulaire - PlatformAPI

## Vue d'ensemble

Ce document décrit la migration de PlatformAPI vers une architecture modulaire basée sur `nwidart/laravel-modules`, similaire à l'approche utilisée dans mentorlms.

## État d'avancement

### ✅ Phase 1 : Installation et configuration (TERMINÉE)

- [x] Installation de `nwidart/laravel-modules` v12.0.4
- [x] Installation de `wikimedia/composer-merge-plugin` v2.1.0
- [x] Création de `config/modules.php`
- [x] Création du dossier `Modules/`
- [x] Création de `modules_statuses.json`
- [x] Mise à jour de `composer.json` avec merge-plugin
- [x] Création de tous les modules de base

### ✅ Phase 2 : Module Core (TERMINÉE)

- [x] Création du module Core
- [x] Migration des middleware :
  - [x] `HandleAppearance`
  - [x] `HandleInertiaRequests`
  - [x] `ProjectAccess`
- [x] Mise à jour de `bootstrap/app.php` pour utiliser les middleware du module Core

### ✅ Phase 3 : Migration des modules (TERMINÉE)

### ✅ Phase 4 : Nettoyage de l'application principale (TERMINÉE)

### ✅ Phase 5 : Migration du frontend (TERMINÉE)

**Note importante** : Pour que les imports `@/pages/` fonctionnent depuis les modules, des fichiers de réexport ont été créés dans `resources/js/pages/` qui pointent vers les fichiers réels dans les modules. Cela permet de maintenir la compatibilité avec les imports existants tout en gardant les fichiers dans leurs modules respectifs.

### ✅ Phase 6 : Nettoyage des migrations (TERMINÉE)

Toutes les migrations ont été déplacées vers leurs modules respectifs :
- ✅ **Core** : `create_personal_access_tokens_table` (Sanctum)
- ✅ **UserManagement** : `create_users_table`, `create_permission_tables`
- ✅ **Projects** : `create_projects_table`, `create_project_user_table`
- ✅ **Collections** : `create_collections_table`, `create_collection_fields_table`
- ✅ **Content** : `create_content_entries_table`, `create_content_field_values_table`, `create_content_media_relations_table`, `create_content_relation_field_relations_table`
- ✅ **Assets** : `create_assets_table`, `create_asset_metadata_table`
- ✅ **Webhooks** : `create_webhooks_table`, `create_webhook_collections_table`, `create_webhook_logs_table`
- ✅ **Templates** : `create_collection_templates_tables`, `create_project_templates_table`

**Migrations globales conservées dans `database/migrations/`** :
- `create_cache_table` (Laravel core)
- `create_jobs_table` (Laravel core)

Chaque module charge automatiquement ses migrations via `nwidart/laravel-modules`.

Toutes les pages React/Inertia ont été migrées vers leurs modules respectifs :
- ✅ Pages Auth → `Modules/Auth/resources/assets/js/pages/`
- ✅ Pages UserManagement → `Modules/UserManagement/resources/assets/js/pages/`
- ✅ Pages Projects → `Modules/Projects/resources/assets/js/pages/`
- ✅ Pages Collections → `Modules/Collections/resources/assets/js/pages/`
- ✅ Pages Content → `Modules/Content/resources/assets/js/pages/`
- ✅ Pages Assets → `Modules/Assets/resources/assets/js/pages/`
- ✅ Configuration Inertia mise à jour pour inclure les modules
- ✅ `app.tsx` et `ssr.tsx` mis à jour pour résoudre les pages depuis les modules
- ✅ `vite.config.ts` configuré pour inclure les assets des modules
- ✅ Pages migrées supprimées de `resources/js/pages/`

Tous les fichiers migrés ont été supprimés de `app/` :
- ✅ Modèles migrés supprimés
- ✅ Contrôleurs migrés supprimés
- ✅ Resources migrées supprimées
- ✅ Middleware migrés supprimés
- ✅ Requests migrées supprimées
- ✅ Jobs, Listeners, Events migrés supprimés
- ✅ Services migrés supprimés
- ✅ CollectionResource migré vers le module Collections
- ✅ Commandes Artisan mises à jour avec les nouveaux namespaces
- ✅ ColumnSetting mis à jour pour utiliser le modèle User modulaire

**Tous les modules backend ont été migrés** :

1. ✅ **Auth** - Authentification
   - Contrôleurs d'authentification migrés
   - Routes d'authentification migrées

2. ✅ **UserManagement** - Gestion des utilisateurs, rôles, permissions
   - Modèles `User` et `Role` migrés
   - Contrôleurs migrés
   - Routes migrées
   - Migrations migrées

3. ✅ **Projects** - Gestion des projets
   - Modèle `Project` migré
   - Contrôleurs `ProjectController`, `ProjectSettingsController`, `Api\ProjectController` migrés
   - Middleware `EnsureProjectMember` migré
   - Resource `ProjectResource` migré
   - Migrations `projects` et `project_user` migrées
   - Routes web et API migrées

4. ✅ **Collections** - Collections et champs
   - Modèles `Collection` et `Field` migrés
   - Contrôleurs migrés
   - Routes web et API migrées
   - Migrations migrées

5. ✅ **Content** - Entrées de contenu
   - Modèles `ContentEntry`, `ContentFieldValue`, `ContentMediaRelation`, `ContentRelationFieldRelation` migrés
   - Contrôleurs web et API migrés
   - Resource `ContentEntryResource` migré
   - Request `ContentRequest` migré
   - Routes web et API migrées
   - Migrations migrées
   - Événements `ContentEvent` intégrés avec Webhooks

6. ✅ **Assets** - Gestion des médias
   - Modèles `Asset` et `AssetMetadata` migrés
   - Contrôleurs web et API migrés
   - Resource `AssetResource` migré
   - Routes web et API migrées (y compris `/uploads/{path}`)
   - Migrations migrées

7. ✅ **Webhooks** - Système de webhooks
   - Modèles `Webhook` et `WebhookLog` migrés
   - Job `SendWebhookJob` migré
   - Listener `DispatchProjectWebhooks` migré
   - Event `ContentEvent` migré
   - Contrôleur migré
   - Routes migrées
   - Migrations migrées
   - EventServiceProvider configuré

8. ✅ **Templates** - Templates de collections/projets
   - Modèles `CollectionTemplate`, `CollectionTemplateField`, `ProjectTemplate` migrés
   - Service `ProjectTemplateBuilder` migré
   - Contrôleurs migrés
   - Routes migrées
   - Migrations migrées

## Structure des modules

Chaque module suit cette structure :

```
Modules/{ModuleName}/
├── app/
│   ├── Http/
│   │   ├── Controllers/
│   │   ├── Middleware/
│   │   └── Requests/
│   ├── Models/
│   ├── Providers/
│   │   ├── {Module}ServiceProvider.php
│   │   ├── RouteServiceProvider.php
│   │   └── EventServiceProvider.php
│   ├── Services/
│   ├── Jobs/
│   └── Listeners/
├── config/
│   └── config.php
├── database/
│   ├── migrations/
│   ├── seeders/
│   └── factories/
├── resources/
│   ├── assets/
│   │   ├── js/
│   │   └── sass/
│   └── views/
├── routes/
│   ├── web.php
│   └── api.php
├── tests/
│   ├── Feature/
│   └── Unit/
├── composer.json
├── module.json
├── package.json
└── vite.config.js
```

## Modules créés

### Core
**Responsabilité** : Middleware partagés, helpers, base commune

**Fichiers migrés** :
- `app/Http/Middleware/HandleAppearance.php` → `Modules/Core/app/Http/Middleware/HandleAppearance.php`
- `app/Http/Middleware/HandleInertiaRequests.php` → `Modules/Core/app/Http/Middleware/HandleInertiaRequests.php`
- `app/Http/Middleware/ProjectAccess.php` → `Modules/Core/app/Http/Middleware/ProjectAccess.php`

**Note** : Le middleware `ProjectAccess` utilise une résolution dynamique du modèle Project qui sera corrigée une fois le module Projects migré.

### Auth
**Responsabilité** : Authentification et sessions

**À migrer** :
- `app/Http/Controllers/Auth/*` → `Modules/Auth/app/Http/Controllers/`
- Routes d'authentification dans `routes/auth.php` → `Modules/Auth/routes/web.php`
- Pages frontend d'authentification

### UserManagement
**Responsabilité** : Utilisateurs, rôles, permissions

**À migrer** :
- `app/Models/User.php` → `Modules/UserManagement/app/Models/User.php`
- `app/Models/Role.php` → `Modules/UserManagement/app/Models/Role.php` (si custom)
- `app/Http/Controllers/UserManagement/*` → `Modules/UserManagement/app/Http/Controllers/`
- Routes `/user-management/*` → `Modules/UserManagement/routes/web.php`
- Pages frontend de gestion utilisateurs

### Projects ✅ TERMINÉ
**Responsabilité** : Gestion complète des projets

**Migré** :
- ✅ `app/Models/Project.php` → `Modules/Projects/app/Models/Project.php`
- ✅ `app/Http/Controllers/ProjectController.php` → `Modules/Projects/app/Http/Controllers/ProjectController.php`
- ✅ `app/Http/Controllers/ProjectSettingsController.php` → `Modules/Projects/app/Http/Controllers/ProjectSettingsController.php`
- ✅ `app/Http/Controllers/Api/ProjectController.php` → `Modules/Projects/app/Http/Controllers/Api/ProjectController.php`
- ✅ `app/Http/Middleware/EnsureProjectMember.php` → `Modules/Projects/app/Http/Middleware/EnsureProjectMember.php`
- ✅ `app/Http/Resources/ProjectResource.php` → `Modules/Projects/app/Http/Resources/ProjectResource.php`
- ✅ Migrations `projects` et `project_user` → `Modules/Projects/database/migrations/`
- ✅ Routes `/projects/*` → `Modules/Projects/routes/web.php`
- ✅ Routes API `/api/` → `Modules/Projects/routes/api.php`
- ⏳ Pages frontend de gestion de projets (à migrer)

**Relations** :
- `hasMany` vers Collections, Content, Assets, Webhooks
- `belongsToMany` vers User (members)

### Collections
**Responsabilité** : Collections et définition de champs

**À migrer** :
- `app/Models/Collection.php` → `Modules/Collections/app/Models/Collection.php`
- `app/Models/Field.php` → `Modules/Collections/app/Models/Field.php`
- `app/Http/Controllers/CollectionController.php` → `Modules/Collections/app/Http/Controllers/CollectionController.php`
- `app/Http/Controllers/FieldController.php` → `Modules/Collections/app/Http/Controllers/FieldController.php`
- `app/Http/Controllers/Api/CollectionController.php` → `Modules/Collections/app/Http/Controllers/Api/CollectionController.php`
- Migrations collections → `Modules/Collections/database/migrations/`
- Routes `/projects/{project}/collections/*` → `Modules/Collections/routes/web.php`
- Routes API `/api/collections/*` → `Modules/Collections/routes/api.php`
- Pages frontend de gestion de collections

**Dépendances** : Projects

### Content
**Responsabilité** : Entrées de contenu et valeurs de champs

**À migrer** :
- `app/Models/ContentEntry.php` → `Modules/Content/app/Models/ContentEntry.php`
- `app/Models/ContentFieldValue.php` → `Modules/Content/app/Models/ContentFieldValue.php`
- `app/Models/ContentMediaRelation.php` → `Modules/Content/app/Models/ContentMediaRelation.php`
- `app/Models/ContentRelationFieldRelation.php` → `Modules/Content/app/Models/ContentRelationFieldRelation.php`
- `app/Http/Controllers/ContentController.php` → `Modules/Content/app/Http/Controllers/ContentController.php`
- `app/Http/Controllers/Api/ContentController.php` → `Modules/Content/app/Http/Controllers/Api/ContentController.php`
- `app/Http/Resources/ContentEntryResource.php` → `Modules/Content/app/Http/Resources/ContentEntryResource.php`
- Migrations content → `Modules/Content/database/migrations/`
- Routes content → `Modules/Content/routes/web.php` et `api.php`
- Pages frontend d'édition de contenu

**Dépendances** : Collections, Projects

### Assets
**Responsabilité** : Gestion des fichiers médias

**À migrer** :
- `app/Models/Asset.php` → `Modules/Assets/app/Models/Asset.php`
- `app/Models/AssetMetadata.php` → `Modules/Assets/app/Models/AssetMetadata.php`
- `app/Http/Controllers/AssetController.php` → `Modules/Assets/app/Http/Controllers/AssetController.php`
- `app/Http/Controllers/Api/AssetController.php` → `Modules/Assets/app/Http/Controllers/Api/AssetController.php`
- Migrations assets → `Modules/Assets/database/migrations/`
- Routes assets → `Modules/Assets/routes/web.php` et `api.php`
- Pages frontend de bibliothèque de médias

**Dépendances** : Projects

### Webhooks
**Responsabilité** : Système de webhooks

**À migrer** :
- `app/Models/Webhook.php` → `Modules/Webhooks/app/Models/Webhook.php`
- `app/Models/WebhookLog.php` → `Modules/Webhooks/app/Models/WebhookLog.php`
- `app/Http/Controllers/WebhookController.php` → `Modules/Webhooks/app/Http/Controllers/WebhookController.php`
- `app/Jobs/SendWebhookJob.php` → `Modules/Webhooks/app/Jobs/SendWebhookJob.php`
- `app/Listeners/DispatchProjectWebhooks.php` → `Modules/Webhooks/app/Listeners/DispatchProjectWebhooks.php`
- `app/Events/ContentEvent.php` → `Modules/Webhooks/app/Events/ContentEvent.php` (ou dans Content)
- Migrations webhooks → `Modules/Webhooks/database/migrations/`
- Routes webhooks → `Modules/Webhooks/routes/web.php`
- Pages frontend de gestion webhooks

**Dépendances** : Projects, Content

### Templates
**Responsabilité** : Templates de collections et projets

**À migrer** :
- `app/Models/CollectionTemplate.php` → `Modules/Templates/app/Models/CollectionTemplate.php`
- `app/Models/CollectionTemplateField.php` → `Modules/Templates/app/Models/CollectionTemplateField.php`
- `app/Models/ProjectTemplate.php` → `Modules/Templates/app/Models/ProjectTemplate.php`
- `app/Http/Controllers/CollectionTemplateController.php` → `Modules/Templates/app/Http/Controllers/CollectionTemplateController.php`
- `app/Http/Controllers/ProjectTemplateController.php` → `Modules/Templates/app/Http/Controllers/ProjectTemplateController.php`
- `app/Services/ProjectTemplateBuilder.php` → `Modules/Templates/app/Services/ProjectTemplateBuilder.php`
- Migrations templates → `Modules/Templates/database/migrations/`
- Routes templates → `Modules/Templates/routes/web.php`
- Pages frontend de templates

**Dépendances** : Collections, Projects

## Prochaines étapes

### ✅ 1. Migration du code backend (TERMINÉE)

Tous les modules backend ont été migrés avec succès. Chaque module contient maintenant :
- Ses modèles avec les bons namespaces
- Ses contrôleurs (web et API)
- Ses routes (web et API)
- Ses migrations
- Ses resources API
- Ses services, jobs, listeners, events (selon le module)

### 2. Migration du frontend (À FAIRE)

Pour chaque module, suivre cet ordre :

1. **Créer les dossiers nécessaires** :
   ```bash
   mkdir -p Modules/{Module}/app/Models
   mkdir -p Modules/{Module}/app/Http/Controllers
   mkdir -p Modules/{Module}/app/Http/Resources
   mkdir -p Modules/{Module}/app/Services
   mkdir -p Modules/{Module}/app/Jobs
   mkdir -p Modules/{Module}/app/Listeners
   ```

2. **Migrer les modèles** :
   - Copier les fichiers depuis `app/Models/`
   - Mettre à jour les namespaces vers `Modules\{Module}\Models`
   - Mettre à jour les références aux autres modèles (utiliser les namespaces complets)

3. **Migrer les contrôleurs** :
   - Copier les fichiers depuis `app/Http/Controllers/`
   - Mettre à jour les namespaces
   - Mettre à jour les références aux modèles

4. **Migrer les migrations** :
   - Copier depuis `database/migrations/`
   - Vers `Modules/{Module}/database/migrations/`
   - Mettre à jour les noms de tables si nécessaire (garder les mêmes noms)

5. **Migrer les routes** :
   - Déplacer les routes depuis `routes/web.php` et `routes/api.php`
   - Vers `Modules/{Module}/routes/web.php` et `api.php`
   - Mettre à jour les références aux contrôleurs

6. **Mettre à jour les ServiceProviders** :
   - Configurer le chargement des migrations
   - Configurer les routes via RouteServiceProvider

### 2. Migration du frontend

Pour chaque module :

1. **Créer la structure** :
   ```bash
   mkdir -p Modules/{Module}/resources/assets/js/pages
   mkdir -p Modules/{Module}/resources/assets/js/components
   ```

2. **Migrer les pages** :
   - Déplacer depuis `resources/js/pages/`
   - Vers `Modules/{Module}/resources/assets/js/pages/`
   - Mettre à jour les imports

3. **Migrer les composants spécifiques** :
   - Déplacer les composants liés au module
   - Garder les composants partagés dans `resources/js/components/`

4. **Configurer Vite** :
   - Mettre à jour `vite.config.ts` principal pour inclure les modules
   - Configurer `Modules/{Module}/vite.config.js`

### 3. Mise à jour des références

1. **Namespaces dans les modèles** :
   - Mettre à jour toutes les références `App\Models\*` vers `Modules\{Module}\Models\*`

2. **Imports dans les contrôleurs** :
   - Mettre à jour tous les imports

3. **Routes** :
   - Vérifier que toutes les routes sont correctement chargées

4. **Tests** :
   - Mettre à jour les namespaces dans les tests
   - Mettre à jour les factories

### 4. Nettoyage

1. **Supprimer les fichiers migrés** de `app/`
2. **Simplifier `routes/web.php`** et `routes/api.php`
3. **Vérifier les ServiceProviders** globaux
4. **Mettre à jour la documentation**

## Commandes utiles

```bash
# Créer un module
php artisan module:make ModuleName

# Activer/Désactiver un module
php artisan module:enable ModuleName
php artisan module:disable ModuleName

# Migrations
php artisan module:migrate ModuleName
php artisan module:migrate-rollback ModuleName

# Seeders
php artisan module:seed ModuleName

# Lister les modules
php artisan module:list

# Publier les assets
php artisan module:publish ModuleName
```

## Points d'attention

1. **Dépendances entre modules** :
   - Définir clairement les dépendances
   - Utiliser les événements Laravel pour la communication
   - Éviter les dépendances circulaires

2. **Frontend Inertia** :
   - S'assurer que les pages Inertia sont correctement référencées
   - Vérifier que les props partagées fonctionnent
   - Tester la navigation entre pages de différents modules

3. **API Resources** :
   - Déplacer vers les modules appropriés
   - S'assurer que les namespaces sont corrects

4. **Migrations** :
   - Les migrations des modules sont chargées automatiquement
   - Vérifier l'ordre des migrations (dépendances)
   - Utiliser `php artisan module:migrate` si nécessaire

5. **Tests** :
   - Mettre à jour les namespaces dans les tests
   - S'assurer que les factories fonctionnent
   - Tester les interactions entre modules

## Configuration

### config/modules.php

Le fichier de configuration est déjà créé et configuré avec :
- Namespace : `Modules`
- Path : `base_path('Modules')`
- Auto-discover des migrations : activé
- Structure de génération standard

### modules_statuses.json

Fichier de statut des modules (activation/désactivation) :
```json
{
    "Core": true,
    "Auth": true,
    "UserManagement": true,
    "Projects": true,
    "Collections": true,
    "Content": true,
    "Assets": true,
    "Webhooks": true,
    "Templates": true
}
```

## Notes importantes

1. ✅ **Middleware ProjectAccess** : Mis à jour pour utiliser `\Modules\Projects\Models\Project`.

2. ✅ **Relations entre modèles** : Toutes les relations Eloquent utilisent maintenant les namespaces complets des modèles modulaires.

3. ⏳ **Frontend** : La configuration Vite devra être mise à jour pour compiler les assets de tous les modules. Les pages React doivent être migrées vers leurs modules respectifs.

4. ⏳ **Tests** : Tous les tests devront être mis à jour avec les nouveaux namespaces.

5. ✅ **EventServiceProvider** : L'EventServiceProvider principal a été mis à jour pour écouter les événements du module Webhooks. Le module Webhooks a son propre EventServiceProvider configuré.

6. ✅ **Routes principales** : Les routes principales (`routes/web.php` et `routes/api.php`) ont été nettoyées et ne contiennent plus que les routes globales (dashboard, settings).

7. ✅ **Namespaces** : Tous les contrôleurs, modèles, resources, requests, jobs, listeners et events utilisent maintenant les namespaces modulaires corrects.

## Références

- [Documentation nwidart/laravel-modules](https://nwidart.com/laravel-modules/)
- Structure de référence : `/var/www/griow/mentorlms/Modules/`

---

*Documentation mise à jour le 2025-01-15*

