FactuGES_ERP/apps/server/src/lib/modules/module-loader.ts

55 lines
1.6 KiB
TypeScript
Raw Normal View History

2025-05-28 14:21:09 +00:00
import { IModuleServer, ModuleParams } from "@erp/core/api";
2025-05-09 10:45:32 +00:00
import { logger } from "../logger";
2025-05-04 20:06:57 +00:00
import { initModels, registerModels } from "./model-loader";
import { registerService } from "./service-registry";
const registeredModules: Map<string, IModuleServer> = new Map();
const initializedModules = new Set<string>();
export function registerModule(pkg: IModuleServer) {
2025-08-11 17:49:52 +00:00
console.log(pkg.name);
2025-06-11 13:13:21 +00:00
if (registeredModules.has(pkg.name)) {
throw new Error(`❌ Paquete "${pkg.name}" ya registrado.`);
2025-05-04 20:06:57 +00:00
}
2025-06-11 13:13:21 +00:00
registeredModules.set(pkg.name, pkg);
2025-05-04 20:06:57 +00:00
}
export async function initModules(params: ModuleParams) {
registeredModules.forEach((_, name) => {
loadModule(name, params);
});
await initModels(params);
}
const loadModule = (name: string, params: ModuleParams) => {
if (initializedModules.has(name)) return;
const pkg = registeredModules.get(name);
if (!pkg) throw new Error(`❌ Paquete "${name}" no encontrado.`);
// Resolver dependencias primero
2025-06-11 13:13:21 +00:00
const deps = pkg.dependencies || [];
2025-05-04 20:06:57 +00:00
deps.forEach((dep) => loadModule(dep, params));
// Inicializar el module
pkg.init(params);
const pkgApi = pkg.registerDependencies?.(params);
// Registrar modelos de Sequelize, si los expone
if (pkgApi?.models) {
registerModels(pkgApi.models, params);
}
// Registrar sus servicios, si los expone
if (pkgApi?.services) {
const services = pkgApi.services;
if (services && typeof services === "object") {
2025-06-11 13:13:21 +00:00
registerService(pkg.name, services);
2025-05-04 20:06:57 +00:00
}
}
initializedModules.add(name);
2025-05-09 10:45:32 +00:00
logger.info(`✅ Module "${name}" registered`, { label: "loadModule" });
2025-05-04 20:06:57 +00:00
};