Nueva bdd y entidades generales

This commit is contained in:
2026-01-14 17:30:55 +01:00
parent 42cef3f9ba
commit 20482915de
9 changed files with 157 additions and 32 deletions

View File

@@ -0,0 +1,103 @@
-- eliminar los drop para prod
drop domain if exists imei_type cascade;
CREATE DOMAIN imei_type as varchar(15);
drop domain if exists iccid_type cascade;
CREATE DOMAIN iccid_type as varchar(22);
drop domain if exists imsi_type cascade;
CREATE DOMAIN imsi_type as varchar(15);
CREATE table if not exists sim_cards (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
imei imei_type,
iccid iccid_type,
imsi imsi_type,
user_id BIGINT,
subscription_id BIGINT,
created_at TIMESTAMP,
last_update TIMESTAMP,
deleted_at TIMESTAMP
);
CREATE TABLE if not exists sim_operations (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
sim_id BIGINT,
operation_type TEXT NOT NULL,
happened_at TIMESTAMP,
CONSTRAINT valid_operations CHECK (
operation_type in ('free','preactivate','activate','pause','cancel')
),
CONSTRAINT fk_sim_id
FOREIGN KEY(sim_id)
REFERENCES sim_cards(id)
);
CREATE TABLE if not exists sim_envio (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
codigo_origen TEXT,
codigo_distrito TEXT,
pedido_id BIGINT,
sim_id BIGINT,
fecha_envio TIMESTAMP,
fecha_email TIMESTAMP,
is_preactivado BOOLEAN,
fecha_devolucion TIMESTAMP,
created_at TIMESTAMP,
CONSTRAINT fk_sim_id
FOREIGN KEY(sim_id) REFERENCES sim_cards(id)
);
-- Mock, No es parte de SIMs
CREATE TABLE if not exists sf_subscription (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY
);
-- No habria que meterle las propiedades del tipo de subscripcion
CREATE TABLE if not exists sim_subscription_types (
id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
subscription TEXT NOT NULL,
created_at TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP
);
CREATE TABLE if not exists sim_company (
id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
name TEXT,
created_at TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP
);
CREATE TABLE sim_subscription (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
company_id INT,
subscription_type_id INT,
sim_id BIGINT,
order_id BIGINT,
created_at TIMESTAMP,
updated_at TIMESTAMP,
deleted_at TIMESTAMP,
CONSTRAINT fk_sim_id
FOREIGN KEY(sim_id) REFERENCES sim_cards(id),
CONSTRAINT fk_company_id
FOREIGN KEY(company_id) REFERENCES sim_company(id),
CONSTRAINT fk_subscription_type_id
FOREIGN KEY(subscription_type_id) REFERENCES sim_subscription_types(id)
);
-- Se supone que indica un cambio
CREATE TABLE sim_subscription_historic (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
subscription_id BIGINT,
iccid iccid_type,
company_id INT
);

View File

@@ -1,31 +0,0 @@
CREATE TABLE sim_job_queue (
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
job_type TEXT NOT NULL,
sim_id INT, -- NOT NULL???
payload JSONB NOT NULL,
status TEXT NOT NULL DEFAULT "pending", -- pasar a enum
priority SMALLINT NOT NULL DEFAULT 100, -- trabajamos entre 200 y 0 para 0 la maxima prioridad
retry_count INT NOT NULL DEFAULT 0,
max_retries INT NOT NULL DEFAULT 3, -- lo definiria en runtime
scheduled_for TIMESTAMP NOT NULL DEFAULT now(),
created_at TIMESTAMP NOT NULL DEFAULT now(),
started_at TIMESTAMP,
completed_at TIMESTAMP,
error_msg TEXT,
-- En teoria el check es mas flexible que el enum
CONSTRAINT valid_status CHECK (
status IN ('pending', 'processing', 'completed', 'failed', 'dead')
)
-- Revisar si interesa asociar cada trabajo a un id o permitir que sean independientes
CONSTRAINT fk_sim_id
FOREIGN KEY(sim_id) REFERENCES tableName(tarjetas_sim)
)
-- Indice de pendientes de consumir
CREATE INDEX idx_job_fetch ON sim_job_queue (status, scheduled_for, priority DESC, created_at)
WHERE status = 'pending';
-- Indice del resto de procesos
CREATE INDEX idx_job_monitor ON sim_job_queue (job_type, status, created_at);

View File

@@ -58,7 +58,7 @@ services:
- "5432:${DEV_POSTGRES_PORT}"
volumes:
- ./sql-data/:/var/lib/postgres/data
- ./deployment/database/test.sql:/docker-entrypoint-initdb.d/init.sql
- ./deployment/database/init.sql:/docker-entrypoint-initdb.d/init.sql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s

View File

@@ -0,0 +1,20 @@
import { User } from "./User"
export type SimCard = {
iccid: string,
imei: string,
/* Pedido de shopify */
orderdId?: string, // Pasar a tipo
/* Subscripcion de shopify */
subscriptionId?: string, // Pasar a tipo
user?: User
createdAt?: Date,
updatedAt?: Date,
codigoOrigen?: string,
}

View File

@@ -36,4 +36,14 @@ export namespace SimEvents {
options: {
}
}
export type save = DomainEvent & {
key: "sim.save",
payload: {
iccid: string,
imei: string
},
options: {
}
}
}

View File

View File

@@ -0,0 +1,6 @@
export type User = {
userId: string,
userName?: string,
email?: string,
tlfn?: string,
}

View File

@@ -17,6 +17,23 @@ export class SimUsecases {
this.eventBus = args.eventBus
}
/**
* Crea una nueva sim de la que no se tenia registro anteriormente
* Si ya existia se modifican los campos pero no se hace un cambio
* de estado.
*/
async save(args: { iccid: string, imei: string }) {
const activationEvent = <SimEvents.save>{
key: "sim.save",
payload: {
iccid: args.iccid,
imei: args.imei
}
}
return this.eventBus.publish([activationEvent])
}
async activation(args: { iccid: string }) {
const activationEvent = <SimEvents.activation>{
key: "sim.activation",