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-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
|
|
|
};
|