|
1 | | -import { DynamicModule, Logger, Module, OnModuleInit } from '@nestjs/common' |
| 1 | +import { DynamicModule, Logger, Module, OnApplicationBootstrap, OnModuleInit } from '@nestjs/common' |
2 | 2 | import { RouterModule } from '@nestjs/core' |
3 | | -import { isConsoleEntrypoint } from '~/_common/functions/is-cli' |
4 | 3 | import serviceSetup from '~/extensions/extensions.service.setup' |
5 | 4 |
|
| 5 | +/** |
| 6 | + * Module de gestion et de chargement des extensions. |
| 7 | + * |
| 8 | + * Ce module gère le système de plugins/extensions de l'application, permettant |
| 9 | + * de charger dynamiquement des modules personnalisés qui enrichissent les |
| 10 | + * fonctionnalités sans modifier le code source principal. Les extensions sont |
| 11 | + * chargées au démarrage selon la configuration définie dans list.yml. |
| 12 | + * |
| 13 | + * @module ExtensionsModule |
| 14 | + * @implements {OnModuleInit} |
| 15 | + * @implements {OnApplicationBootstrap} |
| 16 | + * |
| 17 | + * @description |
| 18 | + * Fonctionnalités du système d'extensions : |
| 19 | + * - Chargement dynamique des modules d'extension au démarrage |
| 20 | + * - Isolation des extensions dans leurs propres modules |
| 21 | + * - Configuration centralisée via list.yml et extension.yml |
| 22 | + * - Support des extensions côté service (backend) et application (frontend) |
| 23 | + * - Activation/désactivation des extensions sans suppression |
| 24 | + * - Routage automatique sous le préfixe '/extensions' |
| 25 | + * |
| 26 | + * Comportement selon le contexte : |
| 27 | + * - **Mode service** : Charge toutes les extensions activées depuis list.yml |
| 28 | + * - **Mode console** : Ignore le chargement des extensions pour optimiser les performances |
| 29 | + * |
| 30 | + * Processus de chargement : |
| 31 | + * 1. Lecture du fichier list.yml |
| 32 | + * 2. Filtrage des extensions activées |
| 33 | + * 3. Chargement de chaque extension.yml |
| 34 | + * 4. Import dynamique des modules définis |
| 35 | + * 5. Enregistrement des routes sous '/extensions' |
| 36 | + */ |
6 | 37 | @Module({ |
7 | 38 | imports: [], |
8 | 39 | }) |
9 | | -export class ExtensionsModule implements OnModuleInit { |
| 40 | +export class ExtensionsModule implements OnModuleInit, OnApplicationBootstrap { |
| 41 | + /** |
| 42 | + * Hook de cycle de vie appelé après l'initialisation du module. |
| 43 | + * |
| 44 | + * Enregistre un message de log confirmant que toutes les extensions |
| 45 | + * ont été initialisées avec succès. |
| 46 | + * |
| 47 | + * @async |
| 48 | + * @returns {Promise<void>} |
| 49 | + */ |
10 | 50 | public async onModuleInit(): Promise<void> { |
11 | | - Logger.log('All extensions is initialized', 'ExtensionsModule') |
| 51 | + Logger.log('All extensions is initialized', ExtensionsModule.name) |
12 | 52 | } |
13 | 53 |
|
14 | | - public static async register(): Promise<DynamicModule> { |
15 | | - if (isConsoleEntrypoint) { |
16 | | - Logger.verbose('Console entrypoint detected, skipping extensions registration', 'ExtensionsModule') |
17 | | - return { |
18 | | - module: this, |
19 | | - imports: [], |
20 | | - } |
21 | | - } |
| 54 | + /** |
| 55 | + * Hook de cycle de vie appelé après le démarrage complet de l'application. |
| 56 | + * |
| 57 | + * Enregistre un message de log confirmant que toutes les extensions |
| 58 | + * ont été enregistrées et sont prêtes à être utilisées. |
| 59 | + * |
| 60 | + * @async |
| 61 | + * @returns {Promise<void>} |
| 62 | + */ |
| 63 | + public async onApplicationBootstrap(): Promise<void> { |
| 64 | + Logger.log('Extensions registered !', ExtensionsModule.name) |
| 65 | + } |
22 | 66 |
|
23 | | - Logger.debug('Registering extensions', 'ExtensionsModule') |
| 67 | + /** |
| 68 | + * Enregistre le module Extensions en mode dynamique avec chargement des extensions. |
| 69 | + * |
| 70 | + * Cette méthode asynchrone charge dynamiquement toutes les extensions activées |
| 71 | + * depuis le fichier de configuration list.yml et configure le routage automatique. |
| 72 | + * |
| 73 | + * @static |
| 74 | + * @async |
| 75 | + * @returns {Promise<DynamicModule>} Le module configuré avec les extensions chargées |
| 76 | + * |
| 77 | + * @description |
| 78 | + * Processus détaillé : |
| 79 | + * 1. Vérifie si l'application est lancée en mode console |
| 80 | + * - Si oui : Ignore le chargement des extensions (retour module vide) |
| 81 | + * - Si non : Continue le chargement |
| 82 | + * 2. Appelle serviceSetup() qui : |
| 83 | + * - Lit le fichier list.yml |
| 84 | + * - Charge chaque extension activée |
| 85 | + * - Import dynamiquement les modules |
| 86 | + * 3. Configure le RouterModule pour préfixer toutes les routes par '/extensions' |
| 87 | + * 4. Retourne le module dynamique avec toutes les extensions importées |
| 88 | + * |
| 89 | + * Logging : |
| 90 | + * - Mode console : Log verbose indiquant que les extensions sont ignorées |
| 91 | + * - Mode service : Log debug au début du chargement |
| 92 | + * - Fin d'initialisation : Log info via onModuleInit() |
| 93 | + */ |
| 94 | + public static async register(): Promise<DynamicModule> { |
24 | 95 | const modules = await serviceSetup() |
25 | 96 |
|
26 | 97 | return { |
|
0 commit comments