From 025801a689ed6cf7146786766c081451012a8230 Mon Sep 17 00:00:00 2001 From: Alvar San Martin Date: Wed, 25 Mar 2026 11:51:14 +0100 Subject: [PATCH] Repositorio de lineas funciona --- .../database/base/xx-volcado-objenious.sql | 4 +- .../config/intranetPostgresConfig.ts | 2 +- .../ObjeniousLinesRepository.test.ts | 40 +++++++++++++++ .../ObjeniousLinesRepository.ts | 51 +++++++++++++++---- packages/sim-objenious-cron/package.json | 16 +----- 5 files changed, 86 insertions(+), 27 deletions(-) create mode 100644 packages/sim-objenious-cron/infranstructure/ObjeniousLinesRepository.test.ts diff --git a/deployment/database/base/xx-volcado-objenious.sql b/deployment/database/base/xx-volcado-objenious.sql index 8637c89..4417b5c 100644 --- a/deployment/database/base/xx-volcado-objenious.sql +++ b/deployment/database/base/xx-volcado-objenious.sql @@ -7,7 +7,6 @@ CREATE table if not exists objenious_lines ( imei TEXT, imeiChangeDate TIMESTAMPTZ, offerCode TEXT, - status TEXT, preactivationDate TIMESTAMPTZ, -- No viene con hora activationDate TIMESTAMPTZ, commercialStatus TEXT, @@ -16,5 +15,6 @@ CREATE table if not exists objenious_lines ( billingStatusChangeDate TIMESTAMPTZ, billingActivationDate TIMESTAMPTZ, createDate TIMESTAMPTZ, - raw JSONB + raw JSONB, + hash TEXT ) diff --git a/packages/sim-objenious-cron/config/intranetPostgresConfig.ts b/packages/sim-objenious-cron/config/intranetPostgresConfig.ts index a9d94ee..7797136 100644 --- a/packages/sim-objenious-cron/config/intranetPostgresConfig.ts +++ b/packages/sim-objenious-cron/config/intranetPostgresConfig.ts @@ -15,6 +15,6 @@ export const pgPoolIntranet = new Pool({ port: Number(env.POSTGRES_PORT) || 5432, }); -export const postgrClientIntranet = new PgClient({ +export const postgresClientIntranet = new PgClient({ pool: pgPoolIntranet }) diff --git a/packages/sim-objenious-cron/infranstructure/ObjeniousLinesRepository.test.ts b/packages/sim-objenious-cron/infranstructure/ObjeniousLinesRepository.test.ts new file mode 100644 index 0000000..83a9f80 --- /dev/null +++ b/packages/sim-objenious-cron/infranstructure/ObjeniousLinesRepository.test.ts @@ -0,0 +1,40 @@ +import test, { describe } from "node:test"; +import { CreateObjeniousLineDTO } from "sim-shared/domain/objeniousLine.js"; +import { ObjeniousLinesRepository } from "./ObjeniousLinesRepository.js"; +import { postgrClient } from "../config/postgreConfig.js"; +import assert from "node:assert"; + +describe("Line insertion test", async () => { + //const pgClient = postgreClientIntranet + const pgClient = postgrClient // En prod hay que usar el de Intrantet para usar la otra base de datos + const lineRepository = new ObjeniousLinesRepository(pgClient) + const lineaTest: CreateObjeniousLineDTO = { + simId: "1234", + iccid: "9999999999999", + msisdn: "34654674732", + imei: "219789481293", + imeiChangeDate: new Date(), + offerCode: "SAVEFAMILY1", + status: "ACTIVATED", + preactivationDate: new Date(), + activationDate: new Date(), + commercialStatus: "test", + commercialStatusDate: new Date(), + billingStatus: "test", + billingStatusChangeDate: new Date(), + billingActivationDate: new Date(), + createDate: new Date(), + raw: { test: "test" } as any // Para este test no hace falta + } + + test("Should insert new line", async () => { + const res = await lineRepository.insertOrUpdate(lineaTest) + assert.ok(res != undefined, "The line wasn't created") + }) + + test("Should not update a line if the hash is the same", async () => { + const res = await lineRepository.insertOrUpdate(lineaTest) + console.log("Update", res) + assert.ok(res != undefined, "The line wasn't updated") + }) +}) diff --git a/packages/sim-objenious-cron/infranstructure/ObjeniousLinesRepository.ts b/packages/sim-objenious-cron/infranstructure/ObjeniousLinesRepository.ts index 3bafa70..7499db6 100644 --- a/packages/sim-objenious-cron/infranstructure/ObjeniousLinesRepository.ts +++ b/packages/sim-objenious-cron/infranstructure/ObjeniousLinesRepository.ts @@ -8,15 +8,38 @@ export class ObjeniousLinesRepository { ) { } + private generateLineHash(data: CreateObjeniousLineDTO) { + try { + const lineStr = JSON.stringify(data) + return lineStr + } catch (e) { + console.error("[x] Error generando el hash de la linea", data) + return undefined + } + } + public async insertOrUpdate(data: CreateObjeniousLineDTO) { const query = ` INSERT INTO objenious_lines ( - simId, iccid, msisdn, imei, imeiChangeDate, - offerCode, status, preactivationDate, activationDate, - commercialStatus, commercialStatusDate, billingStatus, - billingStatusChangeDate, billingActivationDate, createDate, raw + simId, + iccid, + msisdn, + imei, + imeiChangeDate, + offerCode, + status, + preactivationDate, + activationDate, + commercialStatus, + commercialStatusDate, + billingStatus, + billingStatusChangeDate, + billingActivationDate, + createDate, + raw, + hash ) VALUES ( - $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16 + $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17 ) ON CONFLICT (simId) DO UPDATE SET @@ -33,10 +56,19 @@ export class ObjeniousLinesRepository { billingStatus = EXCLUDED.billingStatus, billingStatusChangeDate = EXCLUDED.billingStatusChangeDate, billingActivationDate = EXCLUDED.billingActivationDate, - raw = EXCLUDED.raw + raw = EXCLUDED.raw, + hash = EXCLUDED.hash + WHERE objenious_lines.hash IS DISTINCT FROM EXCLUDED.hash RETURNING id; `; + const lineHash = this.generateLineHash(data) + + if (lineHash == undefined) { + console.error("[x] Ignorando linea ", data) + return; + } + const values = [ data.simId, data.iccid, @@ -53,14 +85,15 @@ export class ObjeniousLinesRepository { data.billingStatusChangeDate, data.billingActivationDate, data.createDate || new Date(), // Default a ahora si no viene - JSON.stringify(data.raw) // El driver de pg requiere string o el objeto directo para JSONB + JSON.stringify(data.raw), // El driver de pg requiere string o el objeto directo para JSONB + lineHash ]; let client: PoolClient | undefined = undefined; try { client = await this.pgClient.connect(); - const res = await client.query(query, values); - return res.rows[0].id; + const res = await client.query<{ id: number }>(query, values); + return res.rows[0]; } catch (err) { console.error('Error en la inserción:', err); throw err; diff --git a/packages/sim-objenious-cron/package.json b/packages/sim-objenious-cron/package.json index bf8da38..af8ef70 100644 --- a/packages/sim-objenious-cron/package.json +++ b/packages/sim-objenious-cron/package.json @@ -5,20 +5,6 @@ "description": "", "main": "index.ts", "imports": { - "#config/*.js": { - "types": "./config/*.ts", - "default": "./config/*.js" - }, - "#config/*": { - "types": "./config/*.ts", - "default": "./config/*.js" - }, - "#shared/*.js": { - "default": "../sim-shared/*.js" - }, - "#shared/*": { - "default": "../sim-shared/*.js" - }, "#adapters/*.js": { "types": "./infrastructure/*.ts", "default": "./infrastructure/*.js" @@ -45,7 +31,7 @@ } }, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", + "test": "node --import tsx --test ./**/*.test.ts", "build": "tsc --build && tsc-alias -p tsconfig.json && cp package.json ../../dist/packages/sim-objenious-cron/", "dev": "tsx watch index.ts", "start": "node ../../dist/packages/sim-objenious-cron/index.js"