import { UniqueID } from "@repo/rdx-ddd"; import { Maybe, Result } from "@repo/rdx-utils"; import type { RequestHandler } from "express"; import type { Sequelize } from "sequelize"; import { AssetUseCases } from "./application/asset.use-cases"; import { AssetCatalogUseCases } from "./application/asset-catalog.use-cases"; import { AssetRelationshipUseCases } from "./application/asset-relationship.use-cases"; import { SupportUseCases } from "./application/support.use-cases"; import { WorkstationUseCases } from "./application/workstation.use-cases"; import { seedAssetCatalog } from "./domain/asset-catalog-seed"; import { registerAssetRoutes } from "./infrastructure/http/asset.routes"; import { registerAssetCatalogRoutes } from "./infrastructure/http/asset-catalog.routes"; import { registerRelationshipRoutes } from "./infrastructure/http/asset-relationship.routes"; import { registerSupportRoutes } from "./infrastructure/http/support.routes"; import { registerWorkstationRoutes } from "./infrastructure/http/workstation.routes"; import { migrateInventory } from "./infrastructure/persistence/asset.model"; import { CatalogModel, migrateAssetCatalog, } from "./infrastructure/persistence/asset-catalog.model"; import { AssetCatalogPersistenceMapper } from "./infrastructure/persistence/asset-catalog-persistence.mapper"; import { migrateRelationships } from "./infrastructure/persistence/asset-relationship.model"; import { SequelizeAssetRepository } from "./infrastructure/persistence/sequelize-asset.repository"; import { SequelizeAssetCatalogRepository } from "./infrastructure/persistence/sequelize-asset-catalog.repository"; import { SequelizeSupportRepository } from "./infrastructure/persistence/sequelize-support.repository"; import { migrateSupport } from "./infrastructure/persistence/support-migration"; import { migrateWorkstations } from "./infrastructure/persistence/workstation.model"; export async function createAssetModule(database: Sequelize, authenticate: RequestHandler) { await migrateAssetCatalog(database); await CatalogModel.findOrCreate({ where: { catalogKey: "global" }, defaults: { id: UniqueID.generateNewID().toPrimitive(), catalogKey: "global" }, }); const repository = new SequelizeAssetCatalogRepository( database, new AssetCatalogPersistenceMapper() ); const seeded = await repository.update(Maybe.none(), (catalog) => Result.ok(seedAssetCatalog(catalog)) ); if (!seeded.isSuccess) { throw new Error("No se pudo inicializar el catálogo de activos."); } await migrateInventory(database); await migrateRelationships(database); await migrateWorkstations(database); await migrateSupport(database); const support = new SupportUseCases(new SequelizeSupportRepository(database)); const assetRepository = new SequelizeAssetRepository(database); const inventory = new AssetUseCases(assetRepository); const workstations = new WorkstationUseCases(assetRepository); const relationships = new AssetRelationshipUseCases(assetRepository); const useCases = new AssetCatalogUseCases(repository); return { services: { inventory: { workstations: async (companyId: UniqueID) => { const result = await assetRepository.get(companyId); if (!result.isSuccess) { throw new Error("Puestos no disponibles."); } return result.data.workstations.map((item) => ({ id: item.id, name: item.values.toPrimitive().name, active: item.values.toPrimitive().active, })); }, list: async (companyId: UniqueID) => { const result = await assetRepository.get(companyId); if (!result.isSuccess) { throw new Error("Inventario no disponible."); } return result.data.assets.map((asset) => ({ id: asset.id, name: asset.values.toPrimitive().name, personId: asset.values.toPrimitive().personId, available: asset.values.toPrimitive().status !== "retired", })); }, }, }, register: (app: Parameters[0]) => { registerAssetCatalogRoutes(app, useCases, authenticate); registerAssetRoutes(app, inventory, authenticate); registerRelationshipRoutes(app, relationships, authenticate); registerWorkstationRoutes(app, workstations, authenticate); registerSupportRoutes(app, support, authenticate); }, }; }