56 lines
1.6 KiB
TypeScript
56 lines
1.6 KiB
TypeScript
import { IPackageServer } from "@libs/package";
|
|
import { Express } from "express";
|
|
import { Sequelize } from "sequelize";
|
|
import { registerService } from "./service-registry.ts.bak";
|
|
|
|
const registeredPackages: Map<string, IPackageServer> = new Map();
|
|
const initializedPackages = new Set<string>();
|
|
|
|
export function registerPackage(pkg: IPackageServer) {
|
|
if (registeredPackages.has(pkg.metadata.name)) {
|
|
throw new Error(`❌ Paquete "${pkg.metadata.name}" ya registrado.`);
|
|
}
|
|
registeredPackages.set(pkg.metadata.name, pkg);
|
|
}
|
|
|
|
export function initPackages(app: Express, sequelize: Sequelize) {
|
|
for (const [name] of registeredPackages) {
|
|
loadPackage(name, app, sequelize);
|
|
}
|
|
}
|
|
|
|
function loadPackage(name: string, app: Express, sequelize: Sequelize) {
|
|
if (initializedPackages.has(name)) return;
|
|
|
|
const pkg = registeredPackages.get(name);
|
|
if (!pkg) throw new Error(`❌ Paquete "${name}" no encontrado.`);
|
|
|
|
// Resolver dependencias primero
|
|
const deps = pkg.metadata.dependencies || [];
|
|
deps.forEach((dep) => loadPackage(dep, app, sequelize));
|
|
|
|
// Inicializar el package
|
|
pkg.init(app);
|
|
|
|
const pkgApi = pkg.registerDependencies?.();
|
|
|
|
// Registrar modelos de Sequelize, si los expone
|
|
|
|
if (pkgApi?.models) {
|
|
for (const initModelFn of pkgApi.models) {
|
|
initModelFn(sequelize);
|
|
}
|
|
}
|
|
|
|
// Registrar sus servicios, si los expone
|
|
if (pkgApi?.services) {
|
|
const services = pkgApi.services;
|
|
if (services && typeof services === "object") {
|
|
registerService(pkg.metadata.name, services);
|
|
}
|
|
}
|
|
|
|
initializedPackages.add(name);
|
|
console.log(`✅ Paquete "${name}" inicializado.`);
|
|
}
|