Hexagonal, mejora del cliente RMQ y tipos de eventos

This commit is contained in:
2026-01-13 15:41:59 +01:00
parent a6abc24e5f
commit d2db2062b0
20 changed files with 517 additions and 100 deletions

View File

@@ -0,0 +1,42 @@
import { EventBus } from "../../shared/domain/EventBus.port";
import { SimEvents } from "../../shared/domain/SimEvents";
/**
* TODO:
* - Conexion con la BDD
* - Conexion con RabbitMQ
* - Pasar a clase cuando existan las conexiones
*/
export class SimUsecases {
private eventBus: EventBus
constructor(args: {
eventBus: EventBus
}
) {
this.eventBus = args.eventBus
}
async activation(args: { iccid: string }) {
const activationEvent = <SimEvents.activation>{
key: "sim.activation",
payload: {
iccid: args.iccid
}
}
return this.eventBus.publish([activationEvent])
}
cancelation(args: { iccid: string }) {
throw new Error("Function not implemented.");
}
pause(args: { iccid: string }) {
throw new Error("Function not implemented.");
}
free(args: { iccid: string }) {
throw new Error("Function not implemented.");
}
}

View File

@@ -0,0 +1,37 @@
import { Request, Response } from "express"
import { SimUsecases } from "aplication/Sim.usecases"
export class SimController {
private simUseCases: SimUsecases
constructor(args: {
simUseCases: SimUsecases
}) {
this.simUseCases = args.simUseCases
}
async activation(req: Request, res: Response) {
const { iccid } = req.body
if (iccid == undefined) {
// TODO: excepcion con nombre se va a repetir
res.status(400).json({
msg: "iccid invalido"
})
}
const resp = await this.simUseCases.activation({ iccid })
}
cancelation(req: Request, res: Response) {
}
pause(req: Request, res: Response) {
}
free(req: Request, res: Response) {
}
}

View File

@@ -0,0 +1,21 @@
import { loadEnvFile } from "node:process";
loadEnvFile("../../.env")
export const env = {
ENVIRONMENT: process.env.ENVIORMENT,
POSTGRES_USER: process.env.POSTGRES_USER,
POSTGRES_PASSWORD: process.env.POSTGRES_PASSWORD,
POSTGRES_PORT: process.env.POSTGRES_PORT,
POSTGRES_HOST: process.env.POSTGRES_HOST,
POSTGRES_DATABASE: process.env.POSTGRES_DATABASE,
RABBITMQ_HOST: String(process.env.RABBITMQ_HOST ?? "localhost"),
RABBITMQ_USER: String(process.env.RABBITMQ_USER ?? "guest"),
RABBITMQ_PASSWORD: String(process.env.RABBITMQ_PASSWORD ?? "guest"),
RABBITMQ_EXCHANGE: String(process.env.RABBITMQ_EXCHANGE ?? "/"),
RABBITMQ_PORT: parseInt(process.env.RABBITMQ_PORT ?? "5672"),
RABBITMQ_MODULENAME: process.env.MODULENAME,
RABBITMQ_TTL: process.env.RABBITMQ_TTL,
RABBITMQ_SECURE: process.env.RABBITMQ_SECURE,
RABBITMQ_RETRY_INTERVAL: process.env.RABBITMQ_INTERVAL,
RABBITMQ_VHOST: String(process.env.RABBITMQ_VHOST),
};

View File

@@ -0,0 +1,50 @@
import { env } from "#config/env"
import { SimEvents } from "#shared/domain/SimEvents"
import { RabbitMQEventBus, RMQConnectionParams } from "#shared/infrastructure/RabbitMQEventBus"
const rmqUser = env.RABBITMQ_USER
const rmqPass = env.RABBITMQ_PASSWORD
const rmqHost = env.RABBITMQ_HOST
const rmqPort = Number(env.RABBITMQ_PORT)
const rmqSecure = false
const rmqVhost = env.RABBITMQ_VHOST
async function test() {
const connOptions = <RMQConnectionParams>{
username: rmqUser,
password: rmqPass,
vhost: rmqVhost,
hostname: rmqHost,
port: rmqPort,
secure: rmqSecure,
}
const event = <SimEvents.activation>{
key: "sim.activation",
payload: {
iccid: "1234"
},
options: {
}
}
const rmqCli = new RabbitMQEventBus({
connectionParams: connOptions
})
await rmqCli.connect()
console.log("publicando", event)
rmqCli.publish([event])
.then(e => {
console.log("Mensaje publicado", e)
})
.catch(err => console.error)
}
test()
export default {}

View File

@@ -0,0 +1,22 @@
import { Router } from 'express';
const simRoutes = Router()
simRoutes.get("/status")
simRoutes.post("/save", (req, res) => {
})
simRoutes.post("/activate", (req, res) => {
const { iccid } = req.body
})
simRoutes.post("/pause", (req, res) => {
})
simRoutes.post("/cancel", (req, res) => {
})
// Proceso especifico de ALAI para liberar sims canceladas
simRoutes.post("/free", (req, res) => {
})

View File

@@ -0,0 +1,32 @@
{
"name": "sim-entrada-eventos",
"version": "1.0.0",
"description": "",
"main": "index.ts",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "tsx watch index.ts"
},
"author": "",
"license": "ISC",
"packageManager": "yarn@4.12.0",
"dependencies": {
"@tsconfig/node22": "*",
"amqplib": "^0.10.9",
"cors": "*",
"dotenv": "*",
"express": "*",
"typescript": "*"
},
"devDependencies": {
"@types/amqplib": "^0.10.8",
"@types/cors": "*",
"@types/express": "*",
"@types/node": "*",
"@types/supertest": "*",
"prettier": "*",
"supertest": "*",
"tsx": "*",
"vitest": "*"
}
}

View File

@@ -0,0 +1,37 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/sim-entrada-eventos",
"baseUrl": ".",
"paths": {
"#config/*": [
"config/*"
],
"#adapters/*": [
"adapters/*"
],
"#domain/*": [
"domain/*"
],
"#ports/*": [
"ports/*"
],
"#tests/*": [
"__tests__/*"
],
"#shared/*": [
"../shared/*"
],
}
},
"exclude": [
"node_modules"
],
"include": [
"**/*.ts",
"src/**/*.d.ts"
],
"files": [
"index.ts"
]
}