diff --git a/README.md b/README.md index 6328041..c3fea4f 100644 --- a/README.md +++ b/README.md @@ -43,3 +43,4 @@ La decisión del numero de reintentos y la cola de dlx se hace en los servicios, - **3000**: Gateway (sim-entrada-eventos) - **3001**: Consumidor NOS (sim-consumidor-nos) - **3002**: Consumidor Objenious (sim-consumidor-objenious) +- **3003**: Consumidor Alai (sim-consumidor-alai) diff --git a/packages/sim-consumidor-alai/.env b/packages/sim-consumidor-alai/.env index c8d94e3..a376a65 100644 --- a/packages/sim-consumidor-alai/.env +++ b/packages/sim-consumidor-alai/.env @@ -1,4 +1,4 @@ -ALAI_PORT=3002 +ALAI_PORT=3003 ALAI_HOST="0.0.0.0" ENVIORMENT=development diff --git a/packages/sim-consumidor-alai/aplication/SimAlai.controller.ts b/packages/sim-consumidor-alai/aplication/SimAlai.controller.ts index 00c326b..0fc538f 100644 --- a/packages/sim-consumidor-alai/aplication/SimAlai.controller.ts +++ b/packages/sim-consumidor-alai/aplication/SimAlai.controller.ts @@ -42,6 +42,7 @@ export class SimAlaiController { /** * Metodo duplicado se puede generalizar la a una clase sharedController con las funciones basicas + * TODO: meter un check de 429 */ private async tryUseCase (msg: ConsumeMessage, usecase: () => Promise>): Promise> { diff --git a/packages/sim-entrada-eventos/aplication/Sim.controller.ts b/packages/sim-entrada-eventos/aplication/Sim.controller.ts index 4b529cd..2643c5a 100644 --- a/packages/sim-entrada-eventos/aplication/Sim.controller.ts +++ b/packages/sim-entrada-eventos/aplication/Sim.controller.ts @@ -4,6 +4,8 @@ import { activationValidator, iccidValidator } from "./httpValidators.js" import { companyFromIccid } from "#domain/companies.js" import { BodyValidator } from "sim-shared/aplication/BodyValidator.js" import { tryCatch } from "sim-shared/domain/Result.js" +import { mapCompanyService } from "#config/servicesProxy.js" +import axios, { AxiosError, isAxiosError } from "axios" export class SimController { @@ -208,6 +210,57 @@ export class SimController { } } + /** + * Select no pasa por la cola de eventos al ser de solo lectura. + * Cada uno de los servicios de los proveedores tiene que aderirse al + * modelo común de datos de SIM + campo "raw" + * + * De momento se va a buscar por iccid, mas adlante por movil u otro criterio + */ + public select() { + return async (req: Request, res: Response) => { + try { + iccidValidator.validate(req.body) + } catch (e) { + res.status(422).json({ + errors: { + msg: e + } + }) + } + + const { iccid } = req.body + const company = companyFromIccid(iccid) + const url = mapCompanyService.get(company) + const endpoint = "/select" + + if (url == undefined) { + console.error("[x] Error buscando el servicio para el select del iccid ", iccid) + } + + try { + const respSelect = await axios.get(url + endpoint) + res.json(respSelect.data) + // TODO: 200 + } catch (err) { + if (isAxiosError(err)) { + const axiosErr = err as AxiosError + res.status(axiosErr.status ?? 500).json(err) + } else { + res.status(500).json({ + errors: { + msg: "Error general buscando la sim" + } + }) + } + } + } + } + + /** + * Esta funcion se plantea para guardar tarjetas que no han llegado desde + * un operador conocido + */ public save() { return async (req: Request, res: Response) => { try { diff --git a/packages/sim-entrada-eventos/aplication/Sim.usecases.ts b/packages/sim-entrada-eventos/aplication/Sim.usecases.ts index 6ba0727..91f3278 100644 --- a/packages/sim-entrada-eventos/aplication/Sim.usecases.ts +++ b/packages/sim-entrada-eventos/aplication/Sim.usecases.ts @@ -270,5 +270,6 @@ export class SimUsecases { return this.eventBus.publish([cancelationEvent]) } + } diff --git a/packages/sim-entrada-eventos/config/env/index.ts b/packages/sim-entrada-eventos/config/env/index.ts index 431fde7..8e2d4b4 100644 --- a/packages/sim-entrada-eventos/config/env/index.ts +++ b/packages/sim-entrada-eventos/config/env/index.ts @@ -24,6 +24,8 @@ export const env = { RABBITMQ_RETRY_INTERVAL: process.env.RABBITMQ_INTERVAL, RABBITMQ_VHOST: String(process.env.RABBITMQ_VHOST), CONNECTIONS_URL: String(process.env.CONNECTIONS_URL), + OBJENIOUS_CONSUMER_URL: process.env.OBJENIOUS_CONSUMER_URL, NOS_CONSUMER_URL: process.env.NOS_CONSUMER_URL, + ALAI_CONSUMER_URL: process.env.ALAI_CONSUMER_URL, }; diff --git a/packages/sim-entrada-eventos/config/servicesProxy.ts b/packages/sim-entrada-eventos/config/servicesProxy.ts new file mode 100644 index 0000000..aabaa56 --- /dev/null +++ b/packages/sim-entrada-eventos/config/servicesProxy.ts @@ -0,0 +1,10 @@ +import { env } from "./env/index.js"; + + +export const mapCompanyService = new Map([ + ["alai", env.ALAI_CONSUMER_URL], + ["nos", env.NOS_CONSUMER_URL], + ["objenious", env.OBJENIOUS_CONSUMER_URL] +]) + + diff --git a/packages/sim-entrada-eventos/index.ts b/packages/sim-entrada-eventos/index.ts index 78cfbb2..07717c6 100644 --- a/packages/sim-entrada-eventos/index.ts +++ b/packages/sim-entrada-eventos/index.ts @@ -35,6 +35,9 @@ app.use("/docs", express.static(path.join(process.cwd(), '../../docs'))) // Rutas especificas para casos especiales como el tiempo de suspension de francia app.use("/france", franceRoutes) +// Rutas especificas de España (Alai) +app.use("/spain", spainRoutes) + app.get("/health", (req, res) => { res.status(200).json({ status: "ok" }) }) diff --git a/packages/sim-entrada-eventos/infrastructure/simRoutes.http.ts b/packages/sim-entrada-eventos/infrastructure/simRoutes.http.ts index c2e53dd..6f41891 100644 --- a/packages/sim-entrada-eventos/infrastructure/simRoutes.http.ts +++ b/packages/sim-entrada-eventos/infrastructure/simRoutes.http.ts @@ -1,9 +1,11 @@ import { rabbitmqEventBus } from '../config/eventBusConfig.js'; import { SimUsecases } from '../aplication/Sim.usecases.js'; import { SimController } from '../aplication/Sim.controller.js'; -import { Router } from 'express'; import { OrderRepository } from 'sim-shared/infrastructure/OrderRepository.js'; import { postgresClient } from '#config/postgreConfig.js'; +import { createProxyMiddleware } from 'http-proxy-middleware'; +import { ClientRequest, } from "http" +import { Router, Request } from "express" const simRoutes = Router() const orderRepository = new OrderRepository(postgresClient) @@ -37,4 +39,6 @@ simRoutes.post("/test", simController.test()) simRoutes.post("/free", simController.free()) +// WIP +simRoutes.get("/select", simController.select()) export { simRoutes }