Nueva bdd y entidades generales
This commit is contained in:
103
deployment/database/init.sql
Normal file
103
deployment/database/init.sql
Normal 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
|
||||
);
|
||||
@@ -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);
|
||||
@@ -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
|
||||
|
||||
20
packages/shared/domain/SimCard.ts
Normal file
20
packages/shared/domain/SimCard.ts
Normal 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,
|
||||
}
|
||||
|
||||
@@ -36,4 +36,14 @@ export namespace SimEvents {
|
||||
options: {
|
||||
}
|
||||
}
|
||||
|
||||
export type save = DomainEvent & {
|
||||
key: "sim.save",
|
||||
payload: {
|
||||
iccid: string,
|
||||
imei: string
|
||||
},
|
||||
options: {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
0
packages/shared/domain/SimOrder.ts
Normal file
0
packages/shared/domain/SimOrder.ts
Normal file
0
packages/shared/domain/SimSubscription.ts
Normal file
0
packages/shared/domain/SimSubscription.ts
Normal file
6
packages/shared/domain/User.ts
Normal file
6
packages/shared/domain/User.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export type User = {
|
||||
userId: string,
|
||||
userName?: string,
|
||||
email?: string,
|
||||
tlfn?: string,
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user