From b29348b88d88762d5142f809156e6a5f2814df03 Mon Sep 17 00:00:00 2001 From: Alvar San Martin Date: Fri, 16 Jan 2026 11:14:35 +0100 Subject: [PATCH] Estructura del consumidor --- README.md | 4 ++ deployment/database/init.sql | 29 +++++++------- deployment/rabbit/definitions.json | 34 +++++++++++++++- imgs/diagrama-servicios-sim.png | Bin 0 -> 89883 bytes packages/shared/domain/EventBus.port.ts | 5 +++ .../shared/infrastructure/RabbitMQConsumer.ts | 9 +++++ .../shared/infrastructure/RabbitMQEventBus.ts | 26 ++++++++++-- .../.env | 0 .../aplication/SimActivation.controller.ts | 37 ++++++++++++++++++ .../config/env/index.ts | 1 - .../config/eventBusConfig.ts | 27 +++++++++++++ packages/sim-consumidor-activaciones/index.ts | 20 ++++++++++ .../package.json | 0 .../tsconfig.json | 0 packages/sim-consumidor/index.ts | 37 ------------------ .../{SimController.ts => Sim.controller.ts} | 0 .../config/eventBusConfig.ts | 2 +- yarn.lock | 4 +- 18 files changed, 174 insertions(+), 61 deletions(-) create mode 100644 imgs/diagrama-servicios-sim.png create mode 100644 packages/shared/infrastructure/RabbitMQConsumer.ts rename packages/{sim-consumidor => sim-consumidor-activaciones}/.env (100%) create mode 100644 packages/sim-consumidor-activaciones/aplication/SimActivation.controller.ts rename packages/{sim-consumidor => sim-consumidor-activaciones}/config/env/index.ts (99%) create mode 100644 packages/sim-consumidor-activaciones/config/eventBusConfig.ts create mode 100644 packages/sim-consumidor-activaciones/index.ts rename packages/{sim-consumidor => sim-consumidor-activaciones}/package.json (100%) rename packages/{sim-consumidor => sim-consumidor-activaciones}/tsconfig.json (100%) delete mode 100644 packages/sim-consumidor/index.ts rename packages/sim-entrada-eventos/aplication/{SimController.ts => Sim.controller.ts} (100%) diff --git a/README.md b/README.md index 3debc9e..f52c1c4 100644 --- a/README.md +++ b/README.md @@ -1 +1,5 @@ # sim-cola-eventos + +Monorepo de servicios / workers para centralizar los procesos de las SIM con sus subscripciones + +[[./imgs/diagrama-servicios-sim.png]] diff --git a/deployment/database/init.sql b/deployment/database/init.sql index 3c8299b..426715b 100644 --- a/deployment/database/init.sql +++ b/deployment/database/init.sql @@ -19,20 +19,6 @@ CREATE table if not exists sim_cards ( deleted_at TIMESTAMP ); -CREATE TABLE if not exists sim_operations ( - id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, - sim_id BIGINT, - operation_type TEXT NOT NULL, - happened_at TIMESTAMP, - - CONSTRAINT valid_operations CHECK ( - operation_type in ('free','preactivate','activate','pause','cancel') - ), - - CONSTRAINT fk_sim_id - FOREIGN KEY(sim_id) - REFERENCES sim_cards(id) -); CREATE TABLE if not exists sim_envio ( id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, @@ -94,6 +80,21 @@ CREATE TABLE sim_subscription ( FOREIGN KEY(subscription_type_id) REFERENCES sim_subscription_types(id) ); +CREATE TABLE if not exists sim_subscription_operations ( + id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, + sim_id BIGINT, + operation_type TEXT NOT NULL, + happened_at TIMESTAMP, + + CONSTRAINT valid_operations CHECK ( + operation_type in ('free','preactivate','activate','pause','cancel') + ), + + CONSTRAINT fk_subscription_id + FOREIGN KEY(subscription_id) + REFERENCES sim_subscriptions(id) +); + -- Se supone que indica un cambio CREATE TABLE sim_subscription_historic ( id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY, diff --git a/deployment/rabbit/definitions.json b/deployment/rabbit/definitions.json index ca05872..cdaca00 100644 --- a/deployment/rabbit/definitions.json +++ b/deployment/rabbit/definitions.json @@ -51,7 +51,21 @@ ], "queues": [ { - "name": "sim.queue", + "name": "sim.logs", + "vhost": "sim-vhost", + "durable": true, + "auto_delete": false, + "arguments": {} + }, + { + "name": "sim.activations", + "vhost": "sim-vhost", + "durable": true, + "auto_delete": false, + "arguments": {} + }, + { + "name": "sim.cancelations", "vhost": "sim-vhost", "durable": true, "auto_delete": false, @@ -62,7 +76,23 @@ { "source": "sim.exchange", "vhost": "sim-vhost", - "destination": "sim.queue", + "destination": "sim.activations", + "destination_type": "queue", + "routing_key": "sim.activation", + "arguments": {} + }, + { + "source": "sim.exchange", + "vhost": "sim-vhost", + "destination": "sim.cancelations", + "destination_type": "queue", + "routing_key": "sim.cancelation", + "arguments": {} + }, + { + "source": "sim.exchange", + "vhost": "sim-vhost", + "destination": "sim.logs", "destination_type": "queue", "routing_key": "sim.*", "arguments": {} diff --git a/imgs/diagrama-servicios-sim.png b/imgs/diagrama-servicios-sim.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3adbc9ada507735cfb7d3aa8c0e5539d647c41 GIT binary patch literal 89883 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 pMwijQU;qEI>4E&e@U;6T*xc): Promise; + // Sacado de NEKI, posiblemente no haga falta addSubscribers(subscribers: Array>): void; + + consume(queue: string, callback: (msg: ConsumeMessage | null) => void): void; + ack(msg: ConsumeMessage): void; } diff --git a/packages/shared/infrastructure/RabbitMQConsumer.ts b/packages/shared/infrastructure/RabbitMQConsumer.ts new file mode 100644 index 0000000..b2066e1 --- /dev/null +++ b/packages/shared/infrastructure/RabbitMQConsumer.ts @@ -0,0 +1,9 @@ +import { RabbitMQEventBus } from "./RabbitMQEventBus"; + +export class RabbitMQConsumer { + constructor( + connection: RabbitMQEventBus + ) { + + } +} diff --git a/packages/shared/infrastructure/RabbitMQEventBus.ts b/packages/shared/infrastructure/RabbitMQEventBus.ts index c6860b1..aaa6fff 100644 --- a/packages/shared/infrastructure/RabbitMQEventBus.ts +++ b/packages/shared/infrastructure/RabbitMQEventBus.ts @@ -1,7 +1,6 @@ -import { type ChannelModel, type ConfirmChannel, connect as amqConnect } from "amqplib"; +import { type ChannelModel, type ConfirmChannel, ConsumeMessage, connect as amqConnect } from "amqplib"; import { DomainEvent, DomainEventSubscriber } from "../domain/DomainEvent"; import { EventBus } from "../domain/EventBus.port"; -import { buffer } from "node:stream/consumers"; export type RMQConnectionParams = { username: string, @@ -21,6 +20,23 @@ export class RabbitMQEventBus implements EventBus { this.checkStructure(); } + async consume(queue: string, callback: (msg: ConsumeMessage | null) => void) { + // Comproaciones antes de escuchar + if (this.channel == undefined) throw new Error("[RMQ] Canal no iniciallizado"); + this.checkStructure() + + // El binding (cola -> [routingkey] -> exchange) lo hago por configuracion. Meter colas a demanda? + + await this.channel.prefetch(1) + + await this.channel.consume(queue, callback) + } + + ack(msg: ConsumeMessage) { + if (this.channel == undefined) throw new Error("[RMQ] Canal no iniciallizado"); + return this.channel.ack(msg) + } + connection?: ChannelModel channel?: ConfirmChannel connected: Boolean = false @@ -59,8 +75,10 @@ export class RabbitMQEventBus implements EventBus { * TODO: Faltan las colas fijas segĂșn las operaciones */ private checkStructure() { - this.channel?.assertQueue("sim.queue") - this.channel?.assertExchange("sim.exchange", "direct") + this.channel?.assertQueue("sim.activations") + this.channel?.assertQueue("sim.cancelations") + this.channel?.assertQueue("sim.logs") + this.channel?.assertExchange("sim.exchange", "topic") } protected async createConnection() { diff --git a/packages/sim-consumidor/.env b/packages/sim-consumidor-activaciones/.env similarity index 100% rename from packages/sim-consumidor/.env rename to packages/sim-consumidor-activaciones/.env diff --git a/packages/sim-consumidor-activaciones/aplication/SimActivation.controller.ts b/packages/sim-consumidor-activaciones/aplication/SimActivation.controller.ts new file mode 100644 index 0000000..9072fb1 --- /dev/null +++ b/packages/sim-consumidor-activaciones/aplication/SimActivation.controller.ts @@ -0,0 +1,37 @@ +import { EventBus } from "#shared/domain/EventBus.port"; +import { ConsumeMessage } from "amqplib"; + +export class SimActivationController { + private eventBus: EventBus; + private activationUseCases: any; + + constructor( + eventBus: EventBus + ) { + this.eventBus = eventBus + + // No se si hay un sistema mejor + // convertor en const () => {} para conservar el contexto?? + this.activateSim = this.activateSim.bind(this) + } + + public activateSim(msg: ConsumeMessage | null) { + if (!this.validateActivationMsg(msg)) { + throw new Error("Error consumiendo el mensaje no es valido") + } + console.log("mensaje procesado", String(msg?.content)) + + // Caso de uso de activaciones + // + this.eventBus.ack(msg!) + } + + /** + * TODO: + * - Loguear motivos de la no validacion + */ + private validateActivationMsg(msg: ConsumeMessage | null) { + if (msg == undefined) return false; + return true; + } +} diff --git a/packages/sim-consumidor/config/env/index.ts b/packages/sim-consumidor-activaciones/config/env/index.ts similarity index 99% rename from packages/sim-consumidor/config/env/index.ts rename to packages/sim-consumidor-activaciones/config/env/index.ts index 459f2f7..f803690 100644 --- a/packages/sim-consumidor/config/env/index.ts +++ b/packages/sim-consumidor-activaciones/config/env/index.ts @@ -1,7 +1,6 @@ import { loadEnvFile } from "node:process"; loadEnvFile("../../.env") - export const env = { ENVIRONMENT: process.env.ENVIORMENT, POSTGRES_USER: process.env.POSTGRES_USER, diff --git a/packages/sim-consumidor-activaciones/config/eventBusConfig.ts b/packages/sim-consumidor-activaciones/config/eventBusConfig.ts new file mode 100644 index 0000000..f74e427 --- /dev/null +++ b/packages/sim-consumidor-activaciones/config/eventBusConfig.ts @@ -0,0 +1,27 @@ +import { RabbitMQEventBus, RMQConnectionParams } from "#shared/infrastructure/RabbitMQEventBus" +import { env } from "./env" + +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 + +export const rmqConnOptions = { + username: rmqUser, + password: rmqPass, + vhost: rmqVhost, + hostname: rmqHost, + port: rmqPort, + secure: rmqSecure, +} + +export const rabbitmqEventBus = new RabbitMQEventBus({ + connectionParams: rmqConnOptions +}) + +export async function startRMQClient() { + await rabbitmqEventBus.connect() + return rabbitmqEventBus +} diff --git a/packages/sim-consumidor-activaciones/index.ts b/packages/sim-consumidor-activaciones/index.ts new file mode 100644 index 0000000..58bc29e --- /dev/null +++ b/packages/sim-consumidor-activaciones/index.ts @@ -0,0 +1,20 @@ + +import { startRMQClient } from "#config/eventBusConfig" +import { SimActivationController } from "aplication/SimActivation.controller" + +async function startWorker() { + const rmqClient = await startRMQClient() + const simActivationController = new SimActivationController(rmqClient) + + rmqClient.consume("sim.activations", simActivationController.activateSim) +} + +startWorker() + .then(e => { + console.log("[o] Worker de activacion de SIM iniciado") + }) + .catch(e => { + console.log("[x] Error iniciando worker de activacion de SIM") + }) + +export default {} diff --git a/packages/sim-consumidor/package.json b/packages/sim-consumidor-activaciones/package.json similarity index 100% rename from packages/sim-consumidor/package.json rename to packages/sim-consumidor-activaciones/package.json diff --git a/packages/sim-consumidor/tsconfig.json b/packages/sim-consumidor-activaciones/tsconfig.json similarity index 100% rename from packages/sim-consumidor/tsconfig.json rename to packages/sim-consumidor-activaciones/tsconfig.json diff --git a/packages/sim-consumidor/index.ts b/packages/sim-consumidor/index.ts deleted file mode 100644 index e42b90e..0000000 --- a/packages/sim-consumidor/index.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { env } from "./config/env" -import { RabbitConnection } from "#shared/adapters/queues/RabbitMQClient" -import { ConsumeMessage } from "amqplib" - -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 rbmq = new RabbitConnection({ - username: rmqUser, - password: rmqPass, - vhost: String(rmqVhost), - hostname: rmqHost, - port: rmqPort, - secure: rmqSecure - }) - await rbmq.connect() - console.log("[Consumidor] iniciado") - - await rbmq.channel?.consume("sim.queue", (buff: ConsumeMessage | null) => { - const decoded = buff?.content.toString() - console.log(" [Consumidor] Mensaje recibido ", decoded) - }, { - noAck: true - }) - -} - - - -test() -export default {} diff --git a/packages/sim-entrada-eventos/aplication/SimController.ts b/packages/sim-entrada-eventos/aplication/Sim.controller.ts similarity index 100% rename from packages/sim-entrada-eventos/aplication/SimController.ts rename to packages/sim-entrada-eventos/aplication/Sim.controller.ts diff --git a/packages/sim-entrada-eventos/config/eventBusConfig.ts b/packages/sim-entrada-eventos/config/eventBusConfig.ts index ebe7f11..3165ed9 100644 --- a/packages/sim-entrada-eventos/config/eventBusConfig.ts +++ b/packages/sim-entrada-eventos/config/eventBusConfig.ts @@ -21,6 +21,6 @@ export const rabbitmqEventBus = new RabbitMQEventBus({ connectionParams: rmqConnOptions }) -export async function startRMQServer() { +export async function startRMQClient() { await rabbitmqEventBus.connect() } diff --git a/yarn.lock b/yarn.lock index 0392e2e..f851539 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2284,9 +2284,9 @@ __metadata: languageName: node linkType: hard -"sim-consumidor@workspace:packages/sim-consumidor": +"sim-consumidor@workspace:packages/sim-consumidor-activaciones": version: 0.0.0-use.local - resolution: "sim-consumidor@workspace:packages/sim-consumidor" + resolution: "sim-consumidor@workspace:packages/sim-consumidor-activaciones" dependencies: "@tsconfig/node22": "npm:*" "@types/amqplib": "npm:^0.10.8"