diff --git a/docs/sim-objenious/Get all requests.bru b/docs/sim-objenious/Get all requests.bru index 72531a4..59f8b84 100644 --- a/docs/sim-objenious/Get all requests.bru +++ b/docs/sim-objenious/Get all requests.bru @@ -5,13 +5,14 @@ meta { } get { - url: {{actionsUrl}}/requests/?pageSize=20 + url: {{actionsUrl}}/requests/?pageSize=100&request.actionType=PREACTIVAION body: formUrlEncoded auth: bearer } params:query { - pageSize: 20 + pageSize: 100 + request.actionType: PREACTIVAION } auth:bearer { diff --git a/docs/sim-objenious/Get request by ID.bru b/docs/sim-objenious/Get request by ID.bru index 382098d..82efb13 100644 --- a/docs/sim-objenious/Get request by ID.bru +++ b/docs/sim-objenious/Get request by ID.bru @@ -37,7 +37,7 @@ body:form-urlencoded { } vars:pre-request { - params.id: 14097 + params.id: 14111 } settings { diff --git a/packages/shared/infrastructure/HTTPClient.ts b/packages/shared/infrastructure/HTTPClient.ts index cf22310..8c5a50e 100644 --- a/packages/shared/infrastructure/HTTPClient.ts +++ b/packages/shared/infrastructure/HTTPClient.ts @@ -1,4 +1,4 @@ -import { AxiosInstance, create as axiosCreate } from "axios" +import axios, { AxiosInstance } from "axios" import { JWTToken } from "../domain/JWT" export type JWTProvider = { @@ -19,7 +19,7 @@ export class HttpClient { headers: Object, jwtManager: JWTProvider<{}> // todo: asociar el tipo de token }) { - this.client = axiosCreate({ + this.client = axios.create({ ...args }) diff --git a/packages/shared/package.json b/packages/shared/package.json index f76b00f..ea07ca9 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,5 +1,6 @@ { "name": "sim-shared", + "type": "module", "version": "1.0.0", "description": "", "scripts": { diff --git a/packages/sim-consumidor-objenious/aplication/JWT.service.ts b/packages/sim-consumidor-objenious/aplication/JWT.service.ts index 36875b7..49767f4 100644 --- a/packages/sim-consumidor-objenious/aplication/JWT.service.ts +++ b/packages/sim-consumidor-objenious/aplication/JWT.service.ts @@ -1,14 +1,18 @@ // PEM ? -import { env } from "#config/env"; +/** + * TODO: + * Está demasiado acoplado a objenious, hay que sacar un servicio jwt general para + * el cliente HTTP + */ + +import { env } from "#config/env/index.js"; import fs from "fs" import { JWTToken -} from "#shared/domain/JWT" +} from "#shared/domain/JWT.js" import axios, { AxiosError } from "axios"; -import { sign } from "node:crypto" -import { ClientRequest } from "node:http"; type GrantAccessRequestBody = { grant_type: string, diff --git a/packages/sim-consumidor-objenious/aplication/Sim.usecases.ts b/packages/sim-consumidor-objenious/aplication/Sim.usecases.ts index 74223bc..0a4abf1 100644 --- a/packages/sim-consumidor-objenious/aplication/Sim.usecases.ts +++ b/packages/sim-consumidor-objenious/aplication/Sim.usecases.ts @@ -1,8 +1,8 @@ import { ActionData, ActivationData } from "#domain/DTOs/objeniousapi.js" import { HttpClient } from "#shared/infrastructure/HTTPClient.js" import { AxiosError } from "axios" -import { Result } from "#shared/domain/Result" -import { ObjeniousOperation, IOperationsRepository as OperationsRepositoryPort } from "#domain/operationsRepository.port" +import { Result } from "sim-shared/domain/Result.js" +import { ObjeniousOperation, IOperationsRepository as OperationsRepositoryPort } from "#domain/operationsRepository.port.js" // TODO: // - Pasar a un archivo de DTOs @@ -38,12 +38,13 @@ export class SimUseCases { console.log("[!] El status de la respuesta es", response.status) if (response.status == 200) { - console.log("Activacion con exito", response.data.response) + console.log("Activacion con exito", response.data) const operation: ObjeniousOperation = { operation: "activate", iccids: activationData.identifier.identifiers, - status: "noMassID" + status: "noMassID", + request_id: response.data.requestId } this.logOperation(operation).then(e => { diff --git a/packages/sim-consumidor-objenious/config/env/index.ts b/packages/sim-consumidor-objenious/config/env/index.ts index 109abf6..8977540 100644 --- a/packages/sim-consumidor-objenious/config/env/index.ts +++ b/packages/sim-consumidor-objenious/config/env/index.ts @@ -1,8 +1,8 @@ import { loadEnvFile } from "node:process"; import path from "node:path"; -loadEnvFile(path.join(__dirname, "../../../../.env")) // Global -loadEnvFile(path.join(__dirname, "../../.env")) // base +loadEnvFile(path.join("../../.env")) // Global +loadEnvFile(path.join("./.env")) // base export const env = { ENVIRONMENT: process.env.ENVIORMENT, diff --git a/packages/sim-consumidor-objenious/domain/operationsRepository.port.ts b/packages/sim-consumidor-objenious/domain/operationsRepository.port.ts index f992f27..50c0b03 100644 --- a/packages/sim-consumidor-objenious/domain/operationsRepository.port.ts +++ b/packages/sim-consumidor-objenious/domain/operationsRepository.port.ts @@ -1,6 +1,6 @@ -import { Result } from "#shared/domain/Result"; +import { Result } from "#shared/domain/Result.js"; -export type StatusEnum = 'noRequestID' | 'noMassID' | 'running' | 'finished' | 'error' | 'other'; +export type StatusEnum = Objenious.Status | 'noMassID'; export interface IOperationsRepository { createOperation(data: ObjeniousOperation): Promise> @@ -20,15 +20,73 @@ export type ObjeniousOperation = { end_date?: Date | null; error?: string | null; status: StatusEnum; + last_change_date?: string; } export type ObjeniousOperationChange = { id?: number; operation_id: number; - creation_date: Date; + info?: string | null; error?: string | null; new_status: StatusEnum; new_request_id?: string; new_mass_action_id?: string; } +export namespace Objenious { + export type Status = "STAND_BY" | "IN_PROGRESS" | "ENDED" | "CANCELLED"; + export type Identifier = "IMSI" | "MSISDN" | "REFERENCE" | "ICCID" | "IMEI" + export type ResponseGetRequestById = { + created: string, + status: "NEW" | "RUNNING" | "OK" | "KO" | "REPLAYED" | "CANCELLED" | "CLOSED" | "DISABLED", + statusDate: string, + actionType: "PREACTIVATION_AND_ACTIVATION" | string, // todo: añadir el resto + massActionIds: number[] + } + + export type ActionType = "PREACTIVATION" | "PREACTIVATION_ACTIVATION" | "ACTIVATION" | + "STATUS_CHANGE" | "ICCID_CHANGE" | "EUICC_NOTIFICATION" + | "EUICC_AUDIT" | "MSISDN_CHANGE" | "ALARM_SETTING" + | "ALARM_UNSETTING" | "CUSTOM_FIELDS_UPDATE" | "SERVICE_CHANGE" + | "SEND_SMS" | "CHANGE_OFFER" | "PORT_IN" + | "PORT_OUT" | "CHANGE_CUSTOMER_ACCOUNT" | "SIMCARD_TRANSFER" + | "GEO_LOCATION" | "UPDATE_COMMITMENT" | "COACH_M2M" + | "PP_RECHARGE" | "TERMINATION_DFE" | "DO_ORDER_PAYMENT" + | "DO_TOP_UP" | "RADIUS_READ" | "RADIUS_UPDATE" + | "RADIUS_SYNCHRONIZE" | "NETWORK_RESET" | "UPDATE_YORK_COMMUNITY" + | "SUSPENSION" | "REACTIVATION" | "RESILIATION" + | "SORTIE_TEST" | "VALIDATION_RESILIATION" | "REFUS_RESILIATION"; + + export type ParametersGetMassAction = { + massActionId?: string, + unitActionId?: string, + createDateMin?: string, + createDateMax?: string, + dueDateMin?: string, + dueDateMax?: string, + endDateMin?: string, + endDateMax?: string, + "identifier.identifiers"?: string[], + "identifier.identifierType"?: Identifier, + actionTypes?: ActionType, + errorCodes?: string[], + pageNumber?: number, + pageSize?: number + } + + export type ResponseGetMassAction = { + id: number, + loginCreator?: string, + longinCancellor?: string, + actionType: ActionType, + dueDate?: string, + targetActionNumber?: number, + created: string, + started?: string, + ended?: string, + status: Status, + info?: string + } +} + + diff --git a/packages/sim-consumidor-objenious/index.ts b/packages/sim-consumidor-objenious/index.ts index dd51e76..7b486eb 100644 --- a/packages/sim-consumidor-objenious/index.ts +++ b/packages/sim-consumidor-objenious/index.ts @@ -1,15 +1,16 @@ import { OperationsRepository } from "#adapters/OperationRepository.js" -import { startRMQClient } from "#config/eventBus.config" -import { httpInstance } from "#config/httpClient.config" +import { startRMQClient } from "#config/eventBus.config.js" +import { httpInstance } from "#config/httpClient.config.js" import { pgPool } from "#config/postgreConfig.js" import { PgClient } from "#shared/infrastructure/PgClient.js" +import { SimUseCases } from "aplication/Sim.usecases.js" import { SimController } from "./aplication/Sim.controller.js" import { SimRouter } from "./aplication/Sim.router.js" -import { SimUseCases } from "./aplication/Sim.usecases.js" async function startWorker() { const rmqClient = await startRMQClient() + const httpClient = httpInstance const pgClient = new PgClient({ pool: pgPool }) diff --git a/packages/sim-consumidor-objenious/infrastructure/OperationRepository.ts b/packages/sim-consumidor-objenious/infrastructure/OperationRepository.ts index 821d394..9838004 100644 --- a/packages/sim-consumidor-objenious/infrastructure/OperationRepository.ts +++ b/packages/sim-consumidor-objenious/infrastructure/OperationRepository.ts @@ -1,6 +1,6 @@ -import { IOperationsRepository, ObjeniousOperation, ObjeniousOperationChange } from "#domain/operationsRepository.port"; -import { Result } from "#shared/domain/Result"; -import { PgClient } from "#shared/infrastructure/PgClient"; +import { IOperationsRepository, ObjeniousOperation, ObjeniousOperationChange } from "#domain/operationsRepository.port.js"; +import { Result } from "sim-shared/domain/Result.js"; +import { PgClient } from "sim-shared/infrastructure/PgClient.js"; @@ -33,8 +33,13 @@ export class OperationsRepository implements IOperationsRepository { // 1. Actualizar objenious_operation const updateOpQuery = ` UPDATE objenious_operation - SET status = $1, error = $2, request_id = $3, mass_action_id = $4, last_change_date = now(), - end_date = CASE WHEN $1 IN ('finished', 'error') THEN now() ELSE end_date END + SET + status = $1, + error = COALESCE($2,error), + request_id = COALESCE($3, request_id), + mass_action_id = COALESCE($4, mass_action_id), + last_change_date = now(), + end_date = CASE WHEN $1 IN ('finished', 'error') THEN now() ELSE end_date END WHERE id = $5`; const operation = await client.query(updateOpQuery, [new_status, error, new_request_id, new_mass_action_id, id]); diff --git a/packages/sim-consumidor-objenious/package.json b/packages/sim-consumidor-objenious/package.json index 1383e94..678d325 100644 --- a/packages/sim-consumidor-objenious/package.json +++ b/packages/sim-consumidor-objenious/package.json @@ -1,13 +1,15 @@ { "name": "sim-consumidor-objenious", "version": "1.0.0", + "type": "module", "description": "consumidor generico de envetos de RMQ", "main": "index.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "tsx watch index.ts", "build": "yarn tsc --project tsconfig.json && yarn tsc-alias && cp .env ../../dist/packages/sim-consumidor-objenious/", - "start": "node ../../dist/packages/sim-consumidor-objenious/index.js" + "start": "node ../../dist/packages/sim-consumidor-objenious/index.js", + "type:test": "tsc --noEmit" }, "author": "", "license": "ISC", @@ -18,6 +20,7 @@ "cors": "*", "dotenv": "*", "express": "*", + "sim-shared": "sim-shared:*", "typescript": "*" }, "devDependencies": { diff --git a/packages/sim-objenious-cron/.env b/packages/sim-objenious-cron/.env new file mode 100644 index 0000000..919cf75 --- /dev/null +++ b/packages/sim-objenious-cron/.env @@ -0,0 +1,8 @@ +# claves de Objenious +OBJ_PEM_PATH=./obj.pem +OBJ_AUTHORIZATION=XOc7FtwXD8hUX2SFVX94XSty8wkOmChkwDNF09O_aIxPubMDdFUdCDCB4zpzSIxi8nOcTg7r_LM_nmd5qm7uLbksf_XArjI8iAyhjKz_2BAXPhmvKs4Fc9f3vv5LDfCVrPB9lP8P7rJ66_qnWs4jvhLQxSfn29m96hgXeCf8oySdIDUjN2q9Js3KAS5LL52Ri6ryvUeO1PvMhaPQMWRqoHIqTV1wPfPtiqQwcjUPmu5GeW164Kq1JLgV3KaGzfCZ9Qv9lbv30EJrukXxWuLCAhBS0kzrBXZoWvf2pb9uh3Am_93_dDxiIGQfIap9ZU_m8ZD1HPgvZOMCY6ZkxQconQ +OBJ_CLI_ASSERTION=XOc7FtwXD8hUX2SFVX94XSty8wkOmChkwDNF09O_aIxPubMDdFUdCDCB4zpzSIxi8nOcTg7r_LM_nmd5qm7uLbksf_XArjI8iAyhjKz_2BAXPhmvKs4Fc9f3vv5LDfCVrPB9lP8P7rJ66_qnWs4jvhLQxSfn29m96hgXeCf8oySdIDUjN2q9Js3KAS5LL52Ri6ryvUeO1PvMhaPQMWRqoHIqTV1wPfPtiqQwcjUPmu5GeW164Kq1JLgV3KaGzfCZ9Qv9lbv30EJrukXxWuLCAhBS0kzrBXZoWvf2pb9uh3Am_93_dDxiIGQfIap9ZU_m8ZD1HPgvZOMCY6ZkxQconQ +OBJ_CLIENT_ID=savefamily_rest_ws +OBJ_KID=xNfbMiyL1ORXGP8lElhcv8nVaG3EJKye4Lc1YoN3I1E +OBJ_BASE_URL=https://api-getway.objenious.com/ws +//OBJ_BASE_URL=https://api-getway.objenious.com/ws/test diff --git a/packages/sim-objenious-cron/config/env/index.ts b/packages/sim-objenious-cron/config/env/index.ts new file mode 100644 index 0000000..8977540 --- /dev/null +++ b/packages/sim-objenious-cron/config/env/index.ts @@ -0,0 +1,34 @@ +import { loadEnvFile } from "node:process"; +import path from "node:path"; + +loadEnvFile(path.join("../../.env")) // Global +loadEnvFile(path.join("./.env")) // base + +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), + + // ESPECIFICO DE OBJENIOUS + OBJ_PEM_PATH: String(process.env.OBJ_PEM_PATH), + OBJ_AUTHOIZATION: String(process.env.OBJ_ATHORIZATION), + OBJ_CLI_ASSERTION: String(process.env.OBJ_CLI_ASSERTION), + OBJ_CLIENT_ID: String(process.env.OBJ_CLIENT_ID), + OBJ_KID: String(process.env.OBJ_KID), + OBJ_BASE_URL: String(process.env.OBJ_BASE_URL) + +}; + diff --git a/packages/sim-objenious-cron/config/httpClient.config.ts b/packages/sim-objenious-cron/config/httpClient.config.ts new file mode 100644 index 0000000..c17c495 --- /dev/null +++ b/packages/sim-objenious-cron/config/httpClient.config.ts @@ -0,0 +1,13 @@ +import { HttpClient } from "#shared/infrastructure/HTTPClient.js" +import { JWTService } from "sim-consumidor-objenious/aplication/JWT.service.js" +import { env } from "./env/index.js" + +const OBJ_BASE_URL = env.OBJ_BASE_URL + +export const httpInstance = new HttpClient({ + baseURL: OBJ_BASE_URL, + headers: { + "content-type": " application/json; charset=utf-8" + }, + jwtManager: new JWTService() +}) diff --git a/packages/sim-objenious-cron/config/postgreConfig.ts b/packages/sim-objenious-cron/config/postgreConfig.ts new file mode 100644 index 0000000..c95be9e --- /dev/null +++ b/packages/sim-objenious-cron/config/postgreConfig.ts @@ -0,0 +1,18 @@ +import { Pool, QueryResult } from 'pg'; +import { PgClient } from 'sim-shared/infrastructure/PgClient.js' +import { env } from 'config/env/index.js'; + +// Configuracion de la conexion a la BDD, deberia ser la +// Misma para todos los servicios pero hasta que se unifique todo +// se hace una por servicio. +export const pgPool = new Pool({ + user: env.POSTGRES_USER, + host: env.POSTGRES_HOST, + database: env.POSTGRES_DATABASE, + password: env.POSTGRES_PASSWORD, + port: Number(env.POSTGRES_PORT) || 5432, +}); + +export const postgrClient = new PgClient({ + pool: pgPool +}) diff --git a/packages/sim-objenious-cron/index.ts b/packages/sim-objenious-cron/index.ts new file mode 100644 index 0000000..0e1209d --- /dev/null +++ b/packages/sim-objenious-cron/index.ts @@ -0,0 +1,37 @@ + +import { pgPool } from "#config/postgreConfig.js" +import { PgClient } from "sim-shared/infrastructure/PgClient.js" +import { OperationsRepository } from "sim-consumidor-objenious/infrastructure/OperationRepository.js" +import cron from "node-cron" +import { httpInstance } from "#config/httpClient.config.js" +import { CheckObjeniousRequests } from "tasks/check_objenious_request.js" + +async function startCron() { + const commonSettings = { + maxRandomDelay: 1000, + noOverlap: true + } + + const httpClient = httpInstance + const pgClient = new PgClient({ pool: pgPool }) + await pgClient.checkDatabaseConnection() + await pgClient.checkDatabaseConnection() + const operationRepository = new OperationsRepository(pgClient) + + const objTask = new CheckObjeniousRequests( + operationRepository, + httpClient + ) + /* + const task = cron.createTask("* * * * *", objTask.getPendingOperations + , { + ...commonSettings, + name: "Test" + }) + */ + await objTask.getPendingOperations() + console.log("Lanzando task") + //task.start() +} + +startCron().then(e => console.log).catch(e => console.error) diff --git a/packages/sim-objenious-cron/package.json b/packages/sim-objenious-cron/package.json new file mode 100644 index 0000000..7f7f125 --- /dev/null +++ b/packages/sim-objenious-cron/package.json @@ -0,0 +1,38 @@ +{ + "name": "sim-objenious-cron", + "type": "module", + "version": "1.0.0", + "description": "", + "main": "index.ts", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "yarn tsc --project tsconfig.json && yarn tsc-alias", + "dev": "tsx watch index.ts", + "start": "node ../../dist/packages/sim-objenious-cron/index.js" + }, + "author": "", + "license": "ISC", + "packageManager": "yarn@4.12.0", + "dependencies": { + "@tsconfig/node22": "*", + "cors": "*", + "dotenv": "*", + "express": "*", + "node-cron": "^4.2.1", + "sim-consumidor-objenious": "sim-consumidor-objenious:*", + "sim-shared": "sim-shared:*", + "typescript": "*" + }, + "devDependencies": { + "@types/amqplib": "^0.10.8", + "@types/cors": "*", + "@types/express": "*", + "@types/node": "*", + "@types/supertest": "*", + "prettier": "*", + "supertest": "*", + "tsc-alias": "^1.8.16", + "tsx": "*", + "vitest": "*" + } +} diff --git a/packages/sim-objenious-cron/tasks/background1.ts b/packages/sim-objenious-cron/tasks/background1.ts new file mode 100644 index 0000000..e582b85 --- /dev/null +++ b/packages/sim-objenious-cron/tasks/background1.ts @@ -0,0 +1 @@ +export const task = async () => console.log("Background " + new Date().toISOString()) diff --git a/packages/sim-objenious-cron/tasks/check_objenious_request.ts b/packages/sim-objenious-cron/tasks/check_objenious_request.ts new file mode 100644 index 0000000..8de5566 --- /dev/null +++ b/packages/sim-objenious-cron/tasks/check_objenious_request.ts @@ -0,0 +1,176 @@ +import { IOperationsRepository, Objenious, ObjeniousOperation, ObjeniousOperationChange } from "#objenious-shared/domain/operationsRepository.port.js" +import { HttpClient } from "#shared/infrastructure/HTTPClient.js"; + +export class CheckObjeniousRequests { + constructor( + private readonly operationsRepository: IOperationsRepository, + private readonly httpClient: HttpClient + ) { + } + + /** + * TODO: meter a una funcion a parte task con los 3 pasos + */ + public async getPendingOperations() { + const pendingOperations = await this.operationsRepository.getPendingOperations() + + + if (pendingOperations.error != undefined) { + throw new Error("Error obteniendo las tareas pendientes " + pendingOperations.error) + } + + if (pendingOperations.data == undefined || pendingOperations.data.length == 0) { + //Nada pendiente + return; + } + + const erroneas = pendingOperations.data + .filter((e) => e.request_id == undefined) + + const operacionesValidas = pendingOperations.data + .filter((e) => e.request_id != undefined) + + const solicitarMassId = operacionesValidas + .filter((e) => e.mass_action_id == undefined) + + const consultarEstado = pendingOperations.data + .filter(e => e.mass_action_id != undefined) + + console.log("validas", operacionesValidas) + console.log("Solicitando mass id para", solicitarMassId) + + const newMassActions = await this.getMassIdFromRequest(solicitarMassId) + + const merged = [...newMassActions || [], ...consultarEstado] + + console.log("Solicitando status para", merged) + + const result = await this.getMassActionsStatus(merged) + } + + private async getMassActionsStatus(requestList: ObjeniousOperation[]) { + if (requestList.length == 0) return; + + const operationsList = structuredClone(requestList) + const PATH = "/actions/massActions" + const updated = [] + + const iccids = operationsList + .map(e => e.iccids) + .flat() + + const iccidSet = new Set(iccids) + + const req = this.httpClient.client.get(PATH, { + params: { + "identifier.identifierType": "ICCID", + "identifier.identifiers": Array.from(iccidSet) + } + }) + let res; + // 1. Comprobacion de la request. + try { + res = await req + } catch (e) { + console.error("Error comprobando el estado de ", iccidSet, e) + return; + } + + const { data, status } = res + + if (status != 200 || data == undefined) { + console.error("Error buscando los massActions") + return + } + + if (data.length == 0) return; + + // 2. Por cada elemento de la respuesta se comprueba si ha habido un cambio de estado + for (const action of data) { + const { id, status } = action + const original = operationsList.find(e => e.id == id) + + console.log("Comprobando", action, original) + + if (original == undefined) continue; + + if (status != original?.status) { + console.log("Actualizando", action, original) + const updateData: ObjeniousOperationChange = { + operation_id: original.id!, + new_status: status, + } + original.status = status; + original.last_change_date = new Date().toISOString() + + if (action.info != undefined) { + updateData.info = action.info + } + + try { + await this.operationsRepository.updateOperation(updateData) + updated.push(action) + } catch (e) { + console.error("Error actualizando el estado de ", action, e) + return; + } + } + } + + } + + /** + * Refrescar los requests hasta que conseguir una Id de mass action + * Como no se puede consultar por + * + */ + private async getMassIdFromRequest(requestList: ObjeniousOperation[]) { + if (requestList.length == 0) return; + + const PATH = "/actions/requests/" + const operationsList = structuredClone(requestList) + + + for (const request of operationsList) { + if (request.id == undefined) continue; + + const req = this.httpClient.client.get(PATH + request.request_id, { + }) + + let res; + + // 1. Comprobacion de la request. + try { + res = await req + } catch (e) { + console.error("Error comprobando el estado de ", request, e) + //todo actualizar el estado para incluir el error + continue; + } + + // 2. Modificacion del massId si ha habido un cambio + const massActionId = res.data.massActionIds[0] + try { + if (res.status == 200 && res.data != undefined && massActionId != undefined) { + const updateData: ObjeniousOperationChange = { + operation_id: request.id, + new_status: "IN_PROGRESS", + new_mass_action_id: String(massActionId) + } + + await this.operationsRepository.updateOperation(updateData) + //! Se actualiza el registro para futuras operaciones + request.mass_action_id = String(massActionId) + } + } catch (e) { + console.log("Error actualizando ell estado de ", request) + continue; + } + + } + + // 3. Se devuelve la lista de los requests con las actualizaciones + return operationsList + } +} + diff --git a/packages/sim-objenious-cron/tsconfig.json b/packages/sim-objenious-cron/tsconfig.json new file mode 100644 index 0000000..f2301fd --- /dev/null +++ b/packages/sim-objenious-cron/tsconfig.json @@ -0,0 +1,42 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "../../dist", + "baseUrl": ".", + "paths": { + "#config/*": [ + "config/*" + ], + "#adapters/*": [ + "adapters/*" + ], + "#domain/*": [ + "domain/*" + ], + "#ports/*": [ + "ports/*" + ], + "#tests/*": [ + "__tests__/*" + ], + "#shared/*": [ + "../shared/*" + ], + // De momento se usa el consumidor como principal + "#objenious-shared/*": [ + "../sim-consumidor-objenious/*" + ] + } + }, + "exclude": [ + "node_modules" + ], + "include": [ + "**/*.ts", + "src/**/*.d.ts", + "tasks/background1.js" + ], + "files": [ + "index.ts" + ] +} diff --git a/tsconfig.json b/tsconfig.json index 3262fd3..648d96b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,11 +8,14 @@ "sourceMap": true, "inlineSources": true, "skipLibCheck": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "module": "nodenext", + "moduleResolution": "nodenext" }, "include": [ "**/*.ts", - "tsconfig.vitest.json" + "tsconfig.vitest.json", + "packages/sim-objenious-cron/tasks/background1.js" ], "exclude": [ "dist" diff --git a/yarn.lock b/yarn.lock index e962808..a000b51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2086,6 +2086,13 @@ __metadata: languageName: node linkType: hard +"node-cron@npm:^4.2.1": + version: 4.2.1 + resolution: "node-cron@npm:4.2.1" + checksum: 10/7550b105e4aab772597383e24c4b31b6d5dc9604c96bcefb1a4b8a94a432b8835e3010a0dfc1d34492edfb64a2e55f334cf3ad0a76901b72de11ef506cbfd31a + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 12.1.0 resolution: "node-gyp@npm:12.1.0" @@ -2762,7 +2769,7 @@ __metadata: languageName: unknown linkType: soft -"sim-consumidor-objenious@workspace:packages/sim-consumidor-objenious": +"sim-consumidor-objenious@sim-consumidor-objenious:*, sim-consumidor-objenious@workspace:packages/sim-consumidor-objenious": version: 0.0.0-use.local resolution: "sim-consumidor-objenious@workspace:packages/sim-consumidor-objenious" dependencies: @@ -2777,6 +2784,7 @@ __metadata: dotenv: "npm:*" express: "npm:*" prettier: "npm:*" + sim-shared: "sim-shared:*" supertest: "npm:*" tsc-alias: "npm:^1.8.16" tsx: "npm:*" @@ -2838,7 +2846,32 @@ __metadata: languageName: unknown linkType: soft -"sim-shared@workspace:packages/shared": +"sim-objenious-cron@workspace:packages/sim-objenious-cron": + version: 0.0.0-use.local + resolution: "sim-objenious-cron@workspace:packages/sim-objenious-cron" + dependencies: + "@tsconfig/node22": "npm:*" + "@types/amqplib": "npm:^0.10.8" + "@types/cors": "npm:*" + "@types/express": "npm:*" + "@types/node": "npm:*" + "@types/supertest": "npm:*" + cors: "npm:*" + dotenv: "npm:*" + express: "npm:*" + node-cron: "npm:^4.2.1" + prettier: "npm:*" + sim-consumidor-objenious: "sim-consumidor-objenious:*" + sim-shared: "sim-shared:*" + supertest: "npm:*" + tsc-alias: "npm:^1.8.16" + tsx: "npm:*" + typescript: "npm:*" + vitest: "npm:*" + languageName: unknown + linkType: soft + +"sim-shared@sim-shared:*, sim-shared@workspace:packages/shared": version: 0.0.0-use.local resolution: "sim-shared@workspace:packages/shared" dependencies: