Registro de peticiones y cron
Tambien mejora de las rutas de typescript
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -37,7 +37,7 @@ body:form-urlencoded {
|
||||
}
|
||||
|
||||
vars:pre-request {
|
||||
params.id: 14097
|
||||
params.id: 14111
|
||||
}
|
||||
|
||||
settings {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { AxiosInstance, create as axiosCreate } from "axios"
|
||||
import axios, { AxiosInstance } from "axios"
|
||||
import { JWTToken } from "../domain/JWT"
|
||||
|
||||
export type JWTProvider<T> = {
|
||||
@@ -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
|
||||
})
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"name": "sim-shared",
|
||||
"type": "module",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"scripts": {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 => {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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<Result<string, ObjeniousOperation>>
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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 })
|
||||
|
||||
@@ -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<ObjeniousOperation>(updateOpQuery, [new_status, error, new_request_id, new_mass_action_id, id]);
|
||||
|
||||
|
||||
@@ -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": {
|
||||
|
||||
8
packages/sim-objenious-cron/.env
Normal file
8
packages/sim-objenious-cron/.env
Normal file
@@ -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
|
||||
34
packages/sim-objenious-cron/config/env/index.ts
vendored
Normal file
34
packages/sim-objenious-cron/config/env/index.ts
vendored
Normal file
@@ -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)
|
||||
|
||||
};
|
||||
|
||||
13
packages/sim-objenious-cron/config/httpClient.config.ts
Normal file
13
packages/sim-objenious-cron/config/httpClient.config.ts
Normal file
@@ -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()
|
||||
})
|
||||
18
packages/sim-objenious-cron/config/postgreConfig.ts
Normal file
18
packages/sim-objenious-cron/config/postgreConfig.ts
Normal file
@@ -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
|
||||
})
|
||||
37
packages/sim-objenious-cron/index.ts
Normal file
37
packages/sim-objenious-cron/index.ts
Normal file
@@ -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)
|
||||
38
packages/sim-objenious-cron/package.json
Normal file
38
packages/sim-objenious-cron/package.json
Normal file
@@ -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": "*"
|
||||
}
|
||||
}
|
||||
1
packages/sim-objenious-cron/tasks/background1.ts
Normal file
1
packages/sim-objenious-cron/tasks/background1.ts
Normal file
@@ -0,0 +1 @@
|
||||
export const task = async () => console.log("Background " + new Date().toISOString())
|
||||
176
packages/sim-objenious-cron/tasks/check_objenious_request.ts
Normal file
176
packages/sim-objenious-cron/tasks/check_objenious_request.ts
Normal file
@@ -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<string>(iccids)
|
||||
|
||||
const req = this.httpClient.client.get<Objenious.ResponseGetMassAction[]>(PATH, {
|
||||
params: <Objenious.ParametersGetMassAction>{
|
||||
"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<Objenious.ResponseGetRequestById>(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
|
||||
}
|
||||
}
|
||||
|
||||
42
packages/sim-objenious-cron/tsconfig.json
Normal file
42
packages/sim-objenious-cron/tsconfig.json
Normal file
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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"
|
||||
|
||||
37
yarn.lock
37
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:
|
||||
|
||||
Reference in New Issue
Block a user