Monitorizacion de las operaciones lanzadas a objenious

This commit is contained in:
2026-02-04 17:32:54 +01:00
parent 5e99ea084a
commit c7d3423f66
14 changed files with 219 additions and 30 deletions

View File

@@ -26,4 +26,16 @@ export class PgClient {
return await this.pgPool.query(text, params);
};
/**
* Función para validar la conexión al inicio.
*/
public async checkDatabaseConnection(): Promise<void> {
const client = await this.pgPool.connect();
const res = await client.query('SELECT NOW()');
console.log(`[o] Database connected successfully at: ${res.rows[0].now}`);
client.release(); // Liberamos el cliente de vuelta al pool
return;
// Si algo falla se tiene que propagar
};
}

View File

@@ -84,6 +84,7 @@ export class SimController {
this.tryUseCase(msg, this.useCases.activate({
dueDate: this.genDueDate(2 * 60).toISOString(),
customerAccountCode: "9.49411.10", // TODO: Al .env
identifier: {
identifierType: "ICCID",
identifiers: [iccid]

View File

@@ -2,6 +2,7 @@ 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"
// TODO:
// - Pasar a un archivo de DTOs
@@ -9,38 +10,54 @@ import { Result } from "#shared/domain/Result"
export class SimUseCases {
private httpClient: HttpClient
private readonly httpClient: HttpClient
private readonly operationRepository: OperationsRepositoryPort
constructor(args: {
httpClient: HttpClient
httpClient: HttpClient,
operationRepository: OperationsRepositoryPort
}) {
this.httpClient = args.httpClient
this.operationRepository = args.operationRepository
}
private async logOperation(data: ObjeniousOperation) {
await this.operationRepository.createOperation({
...data
})
}
public activate(activationData: ActivationData): () => Promise<Result<string, boolean>> {
const OPERATION_URL = "/actions/activateLine"
return async () => {
// TODO: validacion de campos
const req = this.httpClient.client.post(OPERATION_URL, {
...activationData
})
try {
const response = await req
console.log("[!] El status de la respuesta es", response.status)
if (response.status == 200) {
console.log("Activacion con exito", response.data.response)
const operation: ObjeniousOperation = {
operation: "activate",
iccids: activationData.identifier.identifiers,
status: "noMassID"
}
this.logOperation(operation).then(e => {
console.log("Logueada operacion", operation)
}).catch(e => console.error(e))
return <Result<string, boolean>>{
error: undefined,
data: true
}
} else {
// muy mejorable el control de errores
return {
error: String(response.status),
data: undefined

View File

@@ -9,6 +9,7 @@ export type ActionData = {
}
export type ActivationData = ActionData & {
customerAccountCode: "9.49411.10" | string,
offer: {
code: string | "SAVEFAMILY1" | "SAVEFAMILY2",
services: any[]

View File

@@ -5,7 +5,7 @@ export type StatusEnum = 'noRequestID' | 'noMassID' | 'running' | 'finished' | '
export interface IOperationsRepository {
createOperation(data: ObjeniousOperation): Promise<Result<string, ObjeniousOperation>>
updateOperation(data: ObjeniousOperationChange): Promise<Result<string, ObjeniousOperation>>
getPendingOerations(): Promise<Result<string, ObjeniousOperation>>
getPendingOperations(): Promise<Result<string, ObjeniousOperation[]>>
}
export type ObjeniousOperation = {

View File

@@ -1,6 +1,9 @@
import { OperationsRepository } from "#adapters/OperationRepository.js"
import { startRMQClient } from "#config/eventBus.config"
import { httpInstance } from "#config/httpClient.config"
import { pgPool } from "#config/postgreConfig.js"
import { PgClient } from "#shared/infrastructure/PgClient.js"
import { SimController } from "./aplication/Sim.controller.js"
import { SimRouter } from "./aplication/Sim.router.js"
import { SimUseCases } from "./aplication/Sim.usecases.js"
@@ -8,10 +11,18 @@ import { SimUseCases } from "./aplication/Sim.usecases.js"
async function startWorker() {
const rmqClient = await startRMQClient()
const httpClient = httpInstance
const pgClient = new PgClient({ pool: pgPool })
await pgClient.checkDatabaseConnection()
const operationRepository = new OperationsRepository(pgClient)
const simActivationController = new SimController(
rmqClient,
new SimUseCases({
httpClient: httpClient
httpClient: httpClient,
operationRepository: operationRepository
})
)
const simRouter = new SimRouter(simActivationController, rmqClient)

View File

@@ -13,11 +13,11 @@ export class OperationsRepository implements IOperationsRepository {
async createOperation(data: ObjeniousOperation): Promise<Result<string, ObjeniousOperation>> {
const query = `
INSERT INTO objenious_operation (operacion, iccids, status, max_rety)
VALUES ($1, $2, $3, $4)
INSERT INTO objenious_operation (operation, iccids, status, max_retry, request_id)
VALUES ($1, $2, $3, $4, $5)
RETURNING *`;
const iccids = data.iccids.join(",")
const values = [data.operation, data.iccids, data.status, data.max_retry];
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]