Merge branch 'main' into seguimiento-tareas
This commit is contained in:
@@ -9,8 +9,8 @@ export const env = {
|
||||
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_USER: String(process.env.RABBITMQ_USER ?? "test"),
|
||||
RABBITMQ_PASSWORD: String(process.env.RABBITMQ_PASSWORD ?? "test"),
|
||||
RABBITMQ_EXCHANGE: String(process.env.RABBITMQ_EXCHANGE ?? "/"),
|
||||
RABBITMQ_PORT: parseInt(process.env.RABBITMQ_PORT ?? "5672"),
|
||||
RABBITMQ_MODULENAME: process.env.MODULENAME,
|
||||
|
||||
@@ -8,7 +8,6 @@ import { ObjeniousOperation, IOperationsRepository as OperationsRepositoryPort }
|
||||
// - Pasar a un archivo de DTOs
|
||||
// - Mucha repeticion por funcion, deberia hacer una plantilla
|
||||
|
||||
|
||||
export class SimUseCases {
|
||||
private readonly httpClient: HttpClient
|
||||
private readonly operationRepository: OperationsRepositoryPort
|
||||
@@ -41,7 +40,7 @@ export class SimUseCases {
|
||||
|
||||
const operation: ObjeniousOperation = {
|
||||
operation: "activate",
|
||||
iccids: activationData.identifier.identifiers,
|
||||
iccids: String(activationData.identifier.identifiers),
|
||||
status: "noMassID",
|
||||
request_id: response.data.requestId
|
||||
}
|
||||
@@ -84,7 +83,7 @@ export class SimUseCases {
|
||||
console.log("Sim preactivada con exito", resp.data)
|
||||
const operation: ObjeniousOperation = {
|
||||
operation: "preActivate",
|
||||
iccids: preActivateData.identifier.identifiers,
|
||||
iccids: String(preActivateData.identifier.identifiers),
|
||||
status: "noMassID",
|
||||
request_id: resp.data.requestId
|
||||
}
|
||||
|
||||
@@ -12,8 +12,8 @@ export const env = {
|
||||
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_USER: String(process.env.RABBITMQ_USER ?? "test"),
|
||||
RABBITMQ_PASSWORD: String(process.env.RABBITMQ_PASSWORD ?? "test"),
|
||||
RABBITMQ_EXCHANGE: String(process.env.RABBITMQ_EXCHANGE ?? "/"),
|
||||
RABBITMQ_PORT: parseInt(process.env.RABBITMQ_PORT ?? "5672"),
|
||||
RABBITMQ_MODULENAME: process.env.MODULENAME,
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { loadEnvFile } from "node:process";
|
||||
import path from "node:path";
|
||||
|
||||
loadEnvFile(path.join(import.meta.dirname, "../../../../.env"))
|
||||
|
||||
loadEnvFile(path.join("../../.env")) // Global
|
||||
|
||||
export const env = {
|
||||
ENVIRONMENT: process.env.ENVIORMENT,
|
||||
@@ -12,8 +13,8 @@ export const env = {
|
||||
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_USER: String(process.env.RABBITMQ_USER ?? "test"),
|
||||
RABBITMQ_PASSWORD: String(process.env.RABBITMQ_PASSWORD ?? "test"),
|
||||
RABBITMQ_EXCHANGE: String(process.env.RABBITMQ_EXCHANGE ?? "/"),
|
||||
RABBITMQ_PORT: parseInt(process.env.RABBITMQ_PORT ?? "5672"),
|
||||
RABBITMQ_MODULENAME: process.env.MODULENAME,
|
||||
|
||||
@@ -5,4 +5,7 @@ OBJ_CLI_ASSERTION=XOc7FtwXD8hUX2SFVX94XSty8wkOmChkwDNF09O_aIxPubMDdFUdCDCB4zpzSI
|
||||
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
|
||||
# OBJ_BASE_URL=https://api-getway.objenious.com/ws/test
|
||||
|
||||
NOTIFICATION_URL="https://sf-sim-activation.savefamilygps.net/send-activation-mail"
|
||||
SIM_ACTIVATION_API_KEY=9e48c4ac-1ab0-4397-b3f3-6c239200dfe6
|
||||
|
||||
24
packages/sim-objenious-cron/config/env/index.ts
vendored
24
packages/sim-objenious-cron/config/env/index.ts
vendored
@@ -1,5 +1,6 @@
|
||||
import { loadEnvFile } from "node:process";
|
||||
import path from "node:path";
|
||||
import assert from "node:assert";
|
||||
|
||||
loadEnvFile(path.join("../../.env")) // Global
|
||||
loadEnvFile(path.join("./.env")) // base
|
||||
@@ -12,9 +13,9 @@ export const env = {
|
||||
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_USER: String(process.env.RABBITMQ_USER),
|
||||
RABBITMQ_PASSWORD: String(process.env.RABBITMQ_PASSWORD),
|
||||
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,
|
||||
@@ -28,7 +29,22 @@ export const env = {
|
||||
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)
|
||||
OBJ_BASE_URL: String(process.env.OBJ_BASE_URL),
|
||||
|
||||
NOTIFICATION_URL: String(process.env.NOTIFICATION_URL),
|
||||
SIM_ACTIVATION_API_KEY: String(process.env.SIM_ACTIVATION_API_KEY)
|
||||
};
|
||||
|
||||
// assert las partes criticas
|
||||
assert(env.RABBITMQ_PASSWORD != undefined)
|
||||
assert(env.RABBITMQ_USER != undefined)
|
||||
assert(env.SIM_ACTIVATION_API_KEY != undefined)
|
||||
assert(env.NOTIFICATION_URL != undefined)
|
||||
|
||||
if (env.ENVIRONMENT == "production") {
|
||||
assert(env.RABBITMQ_PASSWORD != "guest")
|
||||
assert(env.RABBITMQ_HOST != "localhost")
|
||||
}
|
||||
|
||||
console.log("CRON: ENV", env)
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ async function startCron() {
|
||||
httpClient
|
||||
)
|
||||
|
||||
await objTask.getPendingOperations()
|
||||
const interval = setInterval(async () => {
|
||||
console.log("Updating...")
|
||||
await objTask.getPendingOperations()
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
export const task = async () => console.log("Background " + new Date().toISOString())
|
||||
@@ -1,3 +1,5 @@
|
||||
import { env } from "#config/env/index.js";
|
||||
import axios from "axios";
|
||||
import { IOperationsRepository, Objenious, ObjeniousOperation, ObjeniousOperationChange, StatusEnum } from "sim-shared/domain/operationsRepository.port.js";
|
||||
import { HttpClient } from "sim-shared/infrastructure/HTTPClient.js";
|
||||
|
||||
@@ -36,14 +38,13 @@ export class CheckObjeniousRequests {
|
||||
const consultarEstado = pendingOperations.data
|
||||
.filter(e => e.mass_action_id != undefined)
|
||||
|
||||
console.log("validas", operacionesValidas)
|
||||
console.log("Solicitando mass id para", solicitarMassId)
|
||||
console.log("[cron] Solicitando mass id para", solicitarMassId.map(e => e.id))
|
||||
|
||||
const newMassActions = await this.getMassIdFromRequest(solicitarMassId)
|
||||
|
||||
const merged = [...newMassActions || [], ...consultarEstado]
|
||||
|
||||
console.log("Solicitando status para", merged)
|
||||
console.log("[cron] Solicitando status para", merged.map(e => e.id))
|
||||
|
||||
const result = await this.getMassActionsStatus(merged)
|
||||
}
|
||||
@@ -55,16 +56,9 @@ export class CheckObjeniousRequests {
|
||||
const PATH = "/actions/massActions/"
|
||||
const updated = []
|
||||
|
||||
const iccids = operationsList
|
||||
.map(e => e.iccids)
|
||||
.flat()
|
||||
|
||||
const mass_actions = operationsList
|
||||
.filter(e => e.mass_action_id != undefined)
|
||||
|
||||
const iccidSet = new Set<string>(iccids)
|
||||
console.log("iccidSet", iccidSet)
|
||||
|
||||
// 1. Una peticion por cada accion a comprobar
|
||||
// Las peticiones por iccid u otro filtro tardan ~50s
|
||||
for (const originalAction of mass_actions) {
|
||||
@@ -79,18 +73,18 @@ export class CheckObjeniousRequests {
|
||||
try {
|
||||
res = await req
|
||||
} catch (e) {
|
||||
console.error("Error comprobando el estado de ", originalAction)
|
||||
console.error("Error: ", e)
|
||||
console.error("[cron] Error comprobando el estado de ", originalAction)
|
||||
console.error("[cron] Error: ", e)
|
||||
return;
|
||||
}
|
||||
|
||||
const { data } = res
|
||||
|
||||
console.log("Estado de : ", originalAction.mass_action_id, originalAction.iccids)
|
||||
console.log("[cron] Estado de : ", originalAction.mass_action_id, originalAction.iccids)
|
||||
console.log(res.status, data)
|
||||
|
||||
if (res.status != 200 || data == undefined) {
|
||||
console.error("Error buscando los massActions")
|
||||
console.error("[cron] Error buscando los massActions")
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -98,8 +92,7 @@ export class CheckObjeniousRequests {
|
||||
const { id, status, info } = data
|
||||
|
||||
if (status != originalAction.objenious_status) {
|
||||
console.log(status, "!=", originalAction.objenious_status)
|
||||
console.log("Actualizando", originalAction, status)
|
||||
console.log("[cron] Actualizando", originalAction.id, originalAction.iccids, status)
|
||||
const uorStatus = this.mapStatus(status)
|
||||
const updateData: ObjeniousOperationChange = {
|
||||
operation_id: originalAction.id!,
|
||||
@@ -112,6 +105,27 @@ export class CheckObjeniousRequests {
|
||||
originalAction.status = uorStatus;
|
||||
originalAction.objenious_status = status;
|
||||
originalAction.last_change_date = new Date().toISOString()
|
||||
originalAction.end_date = originalAction.last_change_date
|
||||
console.log(" ----> Status", uorStatus)
|
||||
if (uorStatus /*== "finished"*/) {
|
||||
console.log(" ****> Status", uorStatus)
|
||||
const targetIccids = originalAction.iccids
|
||||
const lineData = await this.getLineData(targetIccids)
|
||||
console.log("lineData", lineData.content[0])
|
||||
const msisdn = lineData.content[0].identifier.msisdn
|
||||
|
||||
this.notifyFinalization({
|
||||
...originalAction,
|
||||
msisdn
|
||||
})
|
||||
.then(e => {
|
||||
console.log("Notificada la activacion de ", originalAction.iccids)
|
||||
})
|
||||
.catch(e => {
|
||||
console.error("Error enviando la activacion de ", originalAction)
|
||||
console.error(e)
|
||||
})
|
||||
}
|
||||
|
||||
if (info != undefined) {
|
||||
updateData.info = info
|
||||
@@ -144,6 +158,26 @@ export class CheckObjeniousRequests {
|
||||
return res
|
||||
}
|
||||
|
||||
private async getLineData(iccids: string) {
|
||||
const PATH = "/lines"
|
||||
|
||||
const req = this.httpClient.client.get(PATH, {
|
||||
params: {
|
||||
pageSize: 100, // no hace fata
|
||||
"identifier.identifierType": "ICCID",
|
||||
"identifier.identifiers": iccids
|
||||
}
|
||||
})
|
||||
|
||||
try {
|
||||
const res = await req
|
||||
return res.data
|
||||
} catch (e) {
|
||||
console.error("Error obteniendo datos de la sim")
|
||||
throw new Error(String(e))
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refrescar los requests hasta que conseguir una Id de mass action
|
||||
* Como no se puede consultar por
|
||||
@@ -191,11 +225,26 @@ export class CheckObjeniousRequests {
|
||||
console.log("Error actualizando el estado de ", request)
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 3. Se devuelve la lista de los requests con las actualizaciones
|
||||
return operationsList
|
||||
}
|
||||
|
||||
/**
|
||||
* Se devuelve la respuesta de una operacion completa de objenious
|
||||
* al servicio que manda los mails
|
||||
*/
|
||||
private async notifyFinalization(operation: ObjeniousOperation & { msisdn: string }) {
|
||||
const req = axios.post(env.NOTIFICATION_URL, {
|
||||
...operation,
|
||||
iccids: [operation.iccids]
|
||||
}, {
|
||||
headers: {
|
||||
"x-apikey-sim-activation": env.SIM_ACTIVATION_API_KEY
|
||||
}
|
||||
})
|
||||
await req
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,11 +13,11 @@ export type ObjeniousOperation = {
|
||||
operation: string;
|
||||
retry_count?: number;
|
||||
max_retry?: number;
|
||||
max_date_retry?: Date | null;
|
||||
iccids: string[];
|
||||
max_date_retry?: string | null;
|
||||
iccids: string; // Deberia ser string[] pero no parseo la lista de iccids
|
||||
request_id?: string;
|
||||
mass_action_id?: string;
|
||||
end_date?: Date | null;
|
||||
end_date?: string | null;
|
||||
error?: string | null;
|
||||
status: StatusEnum;
|
||||
objenious_status?: string;
|
||||
|
||||
@@ -14,8 +14,7 @@ export class OperationsRepository implements IOperationsRepository {
|
||||
INSERT INTO objenious_operation (operation, iccids, status, max_retry, request_id)
|
||||
VALUES ($1, $2, $3, $4, $5)
|
||||
RETURNING *`;
|
||||
const iccids = JSON.stringify(data.iccids)
|
||||
const values = [data.operation, iccids, data.status, data.max_retry, data.request_id];
|
||||
const values = [data.operation, data.iccids, data.status, data.max_retry, data.request_id];
|
||||
const { rows } = await this.pgClient.query(query, values);
|
||||
return <Result<string, ObjeniousOperation>>{
|
||||
data: rows[0]
|
||||
|
||||
Reference in New Issue
Block a user