Orders para test y flujo de migraciones mas simple
This commit is contained in:
@@ -1,16 +0,0 @@
|
|||||||
CREATE TABLE IF NOT EXISTS db_versions (
|
|
||||||
id BIGINT BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
|
|
||||||
version TEXT, -- version semantica x.x.x
|
|
||||||
notes TEXT,
|
|
||||||
creation_date TIMESTAMP NOT NULL DEFAULT (now() at time zone 'utc'),
|
|
||||||
stable BOOLEAN DEFAULT FALSE -- Si la version ha sido testada y se puede desplegar
|
|
||||||
);
|
|
||||||
|
|
||||||
INSERT INTO db_versions (
|
|
||||||
version,
|
|
||||||
notes
|
|
||||||
)
|
|
||||||
VALUES (
|
|
||||||
'0.1.0',
|
|
||||||
'Versión base'
|
|
||||||
);
|
|
||||||
@@ -1,292 +0,0 @@
|
|||||||
--
|
|
||||||
-- PostgreSQL database dump
|
|
||||||
--
|
|
||||||
|
|
||||||
\restrict 8rNdhulAsfz5yOkZrPZ5f3riDYVBHnFPTcb2MraxKbPVyPsdTm81R2jsJppwk7u
|
|
||||||
|
|
||||||
-- Dumped from database version 16.11 (Ubuntu 16.11-0ubuntu0.24.04.1)
|
|
||||||
-- Dumped by pg_dump version 16.11 (Ubuntu 16.11-0ubuntu0.24.04.1)
|
|
||||||
|
|
||||||
SET statement_timeout = 0;
|
|
||||||
SET lock_timeout = 0;
|
|
||||||
SET idle_in_transaction_session_timeout = 0;
|
|
||||||
SET client_encoding = 'UTF8';
|
|
||||||
SET standard_conforming_strings = on;
|
|
||||||
SELECT pg_catalog.set_config('search_path', '', false);
|
|
||||||
SET check_function_bodies = false;
|
|
||||||
SET xmloption = content;
|
|
||||||
SET client_min_messages = warning;
|
|
||||||
SET row_security = off;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_status; Type: TYPE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TYPE public.order_status AS ENUM (
|
|
||||||
'pending',
|
|
||||||
'running',
|
|
||||||
'finished',
|
|
||||||
'failed',
|
|
||||||
'dlx'
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_types; Type: TYPE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TYPE public.order_types AS ENUM (
|
|
||||||
'activate',
|
|
||||||
'preactivate',
|
|
||||||
'cancel',
|
|
||||||
'pause',
|
|
||||||
'reactivate',
|
|
||||||
'unknown'
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: status_enum; Type: TYPE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TYPE public.status_enum AS ENUM (
|
|
||||||
'noRequestID',
|
|
||||||
'noMassID',
|
|
||||||
'running',
|
|
||||||
'finished',
|
|
||||||
'error',
|
|
||||||
'other'
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
SET default_tablespace = '';
|
|
||||||
|
|
||||||
SET default_table_access_method = heap;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation; Type: TABLE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE public.objenious_operation (
|
|
||||||
id bigint NOT NULL,
|
|
||||||
retry_count integer DEFAULT 0,
|
|
||||||
max_retry integer DEFAULT 5,
|
|
||||||
max_date_retry timestamp without time zone,
|
|
||||||
iccids text,
|
|
||||||
request_id text,
|
|
||||||
mass_action_id text,
|
|
||||||
operation text NOT NULL,
|
|
||||||
start_date timestamp with time zone DEFAULT now() NOT NULL,
|
|
||||||
last_change_date timestamp with time zone DEFAULT now() NOT NULL,
|
|
||||||
end_date timestamp with time zone,
|
|
||||||
error text,
|
|
||||||
status public.status_enum,
|
|
||||||
objenious_status text
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation_change; Type: TABLE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE public.objenious_operation_change (
|
|
||||||
id bigint NOT NULL,
|
|
||||||
operation_id bigint,
|
|
||||||
creation_date timestamp with time zone DEFAULT now() NOT NULL,
|
|
||||||
error text,
|
|
||||||
new_status public.status_enum,
|
|
||||||
previous_status public.status_enum,
|
|
||||||
new_objenious_status text,
|
|
||||||
previous_objenious_status text,
|
|
||||||
new_request_id text,
|
|
||||||
new_mass_action_id text
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation_change_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE public.objenious_operation_change ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
|
|
||||||
SEQUENCE NAME public.objenious_operation_change_id_seq
|
|
||||||
START WITH 1
|
|
||||||
INCREMENT BY 1
|
|
||||||
NO MINVALUE
|
|
||||||
NO MAXVALUE
|
|
||||||
CACHE 1
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE public.objenious_operation ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
|
|
||||||
SEQUENCE NAME public.objenious_operation_id_seq
|
|
||||||
START WITH 1
|
|
||||||
INCREMENT BY 1
|
|
||||||
NO MINVALUE
|
|
||||||
NO MAXVALUE
|
|
||||||
CACHE 1
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_history; Type: TABLE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE public.order_history (
|
|
||||||
id bigint NOT NULL,
|
|
||||||
order_id bigint NOT NULL,
|
|
||||||
previous_status public.order_status NOT NULL,
|
|
||||||
new_status public.order_status NOT NULL,
|
|
||||||
change_reason text,
|
|
||||||
change_date timestamp with time zone DEFAULT now() NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_history_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE public.order_history ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
|
|
||||||
SEQUENCE NAME public.order_history_id_seq
|
|
||||||
START WITH 1
|
|
||||||
INCREMENT BY 1
|
|
||||||
NO MINVALUE
|
|
||||||
NO MAXVALUE
|
|
||||||
CACHE 1
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_tracking; Type: TABLE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE public.order_tracking (
|
|
||||||
id bigint NOT NULL,
|
|
||||||
correlation_id character varying(255) NOT NULL,
|
|
||||||
exchange character varying(100),
|
|
||||||
routing_key character varying(100),
|
|
||||||
order_type public.order_types DEFAULT 'unknown'::public.order_types NOT NULL,
|
|
||||||
payload jsonb,
|
|
||||||
status public.order_status DEFAULT 'pending'::public.order_status NOT NULL,
|
|
||||||
retry_count integer DEFAULT 0,
|
|
||||||
error_message text,
|
|
||||||
error_stacktrace text,
|
|
||||||
start_date timestamp with time zone DEFAULT now() NOT NULL,
|
|
||||||
update_date timestamp with time zone DEFAULT now() NOT NULL,
|
|
||||||
finish_date timestamp with time zone
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_tracking_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE public.order_tracking ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
|
|
||||||
SEQUENCE NAME public.order_tracking_id_seq
|
|
||||||
START WITH 1
|
|
||||||
INCREMENT BY 1
|
|
||||||
NO MINVALUE
|
|
||||||
NO MAXVALUE
|
|
||||||
CACHE 1
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation_change objenious_operation_change_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE ONLY public.objenious_operation_change
|
|
||||||
ADD CONSTRAINT objenious_operation_change_pkey PRIMARY KEY (id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation objenious_operation_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE ONLY public.objenious_operation
|
|
||||||
ADD CONSTRAINT objenious_operation_pkey PRIMARY KEY (id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_history order_history_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE ONLY public.order_history
|
|
||||||
ADD CONSTRAINT order_history_pkey PRIMARY KEY (id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_tracking order_tracking_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE ONLY public.order_tracking
|
|
||||||
ADD CONSTRAINT order_tracking_pkey PRIMARY KEY (id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: idx_order_change_date; Type: INDEX; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX idx_order_change_date ON public.order_history USING btree (change_date);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: idx_order_correlation; Type: INDEX; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX idx_order_correlation ON public.order_tracking USING btree (correlation_id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: idx_order_id; Type: INDEX; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX idx_order_id ON public.order_history USING btree (order_id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: operation_change; Type: INDEX; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX operation_change ON public.objenious_operation_change USING btree (operation_id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: pending_operations; Type: INDEX; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX pending_operations ON public.objenious_operation USING btree (start_date) WHERE (end_date IS NULL);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: pending_orders; Type: INDEX; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX pending_orders ON public.order_tracking USING btree (start_date) WHERE (finish_date IS NULL);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation_change fk_operation_id; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE ONLY public.objenious_operation_change
|
|
||||||
ADD CONSTRAINT fk_operation_id FOREIGN KEY (operation_id) REFERENCES public.objenious_operation(id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_history fk_order_id; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE ONLY public.order_history
|
|
||||||
ADD CONSTRAINT fk_order_id FOREIGN KEY (order_id) REFERENCES public.order_tracking(id) ON DELETE CASCADE;
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- PostgreSQL database dump complete
|
|
||||||
--
|
|
||||||
|
|
||||||
\unrestrict 8rNdhulAsfz5yOkZrPZ5f3riDYVBHnFPTcb2MraxKbPVyPsdTm81R2jsJppwk7u
|
|
||||||
|
|
||||||
@@ -1,290 +1,48 @@
|
|||||||
--
|
|
||||||
-- PostgreSQL database dump
|
|
||||||
--
|
|
||||||
|
|
||||||
|
CREATE TYPE status_enum AS ENUM ('noRequestID','noMassID','running','finished','error','other');
|
||||||
|
|
||||||
-- Dumped from database version 16.11 (Ubuntu 16.11-0ubuntu0.24.04.1)
|
-- Tabla para gestionar las peticiones de cambio de objenious.
|
||||||
-- Dumped by pg_dump version 16.11 (Ubuntu 16.11-0ubuntu0.24.04.1)
|
-- Para una o mas lineas se pueden lanzar operacione que no sabemos
|
||||||
|
-- con certeza cuando van a terminar.
|
||||||
SET statement_timeout = 0;
|
-- Estas tablas está fuertemente ligadas al sistema que usa la plataforma
|
||||||
SET lock_timeout = 0;
|
-- de objenioius y no debe unsarse para otra compañia.
|
||||||
SET idle_in_transaction_session_timeout = 0;
|
CREATE TABLE if not exists objenious_operation (
|
||||||
SET client_encoding = 'UTF8';
|
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
|
||||||
SET standard_conforming_strings = on;
|
retry_count INT DEFAULT 0, -- No implementado en codigo
|
||||||
SELECT pg_catalog.set_config('search_path', '', false);
|
max_retry INT DEFAULT 5, -- No implementado en codigo
|
||||||
SET check_function_bodies = false;
|
max_date_retry TIMESTAMP DEFAULT NULL, -- No implementado en codigo
|
||||||
SET xmloption = content;
|
iccids TEXT,
|
||||||
SET client_min_messages = warning;
|
request_id TEXT,
|
||||||
SET row_security = off;
|
mass_action_id TEXT,
|
||||||
|
operation TEXT NOT NULL,
|
||||||
--
|
start_date TIMESTAMP NOT NULL DEFAULT now(),
|
||||||
-- Name: order_status; Type: TYPE; Schema: public; Owner: -
|
last_change_date TIMESTAMP NOT NULL DEFAULT now(),
|
||||||
--
|
end_date TIMESTAMP,
|
||||||
|
error TEXT,
|
||||||
CREATE TYPE public.order_status AS ENUM (
|
status status_enum,
|
||||||
'pending',
|
objenious_status TEXT
|
||||||
'running',
|
|
||||||
'finished',
|
|
||||||
'failed',
|
|
||||||
'dlx'
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
-- operaciones pendientes para revisar
|
||||||
|
CREATE INDEX IF NOT EXISTS pending_operations
|
||||||
|
ON objenious_operation(start_date)
|
||||||
|
WHERE end_date IS NULL;
|
||||||
|
|
||||||
--
|
CREATE TABLE if not exists objenious_operation_change (
|
||||||
-- Name: order_types; Type: TYPE; Schema: public; Owner: -
|
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
|
||||||
--
|
operation_id BIGINT,
|
||||||
|
creation_date TIMESTAMP NOT NULL DEFAULT now(),
|
||||||
|
error TEXT,
|
||||||
|
new_status status_enum,
|
||||||
|
previous_status status_enum,
|
||||||
|
new_objenious_status TEXT,
|
||||||
|
previous_objenious_status TEXT,
|
||||||
|
new_request_id TEXT,
|
||||||
|
new_mass_action_id TEXT,
|
||||||
|
|
||||||
CREATE TYPE public.order_types AS ENUM (
|
CONSTRAINT fk_operation_id
|
||||||
'activate',
|
FOREIGN KEY(operation_id) REFERENCES objenious_operation(id)
|
||||||
'preactivate',
|
|
||||||
'cancel',
|
|
||||||
'pause',
|
|
||||||
'reactivate',
|
|
||||||
'unknown'
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE INDEX operation_change
|
||||||
--
|
ON objenious_operation_change(operation_id);
|
||||||
-- Name: status_enum; Type: TYPE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TYPE public.status_enum AS ENUM (
|
|
||||||
'noRequestID',
|
|
||||||
'noMassID',
|
|
||||||
'running',
|
|
||||||
'finished',
|
|
||||||
'error',
|
|
||||||
'other'
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
SET default_tablespace = '';
|
|
||||||
|
|
||||||
SET default_table_access_method = heap;
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation; Type: TABLE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE public.objenious_operation (
|
|
||||||
id bigint NOT NULL,
|
|
||||||
retry_count integer DEFAULT 0,
|
|
||||||
max_retry integer DEFAULT 5,
|
|
||||||
max_date_retry timestamp without time zone,
|
|
||||||
iccids text,
|
|
||||||
request_id text,
|
|
||||||
mass_action_id text,
|
|
||||||
operation text NOT NULL,
|
|
||||||
start_date timestamp with time zone DEFAULT now() NOT NULL,
|
|
||||||
last_change_date timestamp with time zone DEFAULT now() NOT NULL,
|
|
||||||
end_date timestamp with time zone,
|
|
||||||
error text,
|
|
||||||
status public.status_enum,
|
|
||||||
objenious_status text
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation_change; Type: TABLE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE public.objenious_operation_change (
|
|
||||||
id bigint NOT NULL,
|
|
||||||
operation_id bigint,
|
|
||||||
creation_date timestamp with time zone DEFAULT now() NOT NULL,
|
|
||||||
error text,
|
|
||||||
new_status public.status_enum,
|
|
||||||
previous_status public.status_enum,
|
|
||||||
new_objenious_status text,
|
|
||||||
previous_objenious_status text,
|
|
||||||
new_request_id text,
|
|
||||||
new_mass_action_id text
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation_change_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE public.objenious_operation_change ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
|
|
||||||
SEQUENCE NAME public.objenious_operation_change_id_seq
|
|
||||||
START WITH 1
|
|
||||||
INCREMENT BY 1
|
|
||||||
NO MINVALUE
|
|
||||||
NO MAXVALUE
|
|
||||||
CACHE 1
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE public.objenious_operation ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
|
|
||||||
SEQUENCE NAME public.objenious_operation_id_seq
|
|
||||||
START WITH 1
|
|
||||||
INCREMENT BY 1
|
|
||||||
NO MINVALUE
|
|
||||||
NO MAXVALUE
|
|
||||||
CACHE 1
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_history; Type: TABLE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE public.order_history (
|
|
||||||
id bigint NOT NULL,
|
|
||||||
order_id bigint NOT NULL,
|
|
||||||
previous_status public.order_status NOT NULL,
|
|
||||||
new_status public.order_status NOT NULL,
|
|
||||||
change_reason text,
|
|
||||||
change_date timestamp with time zone DEFAULT now() NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_history_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE public.order_history ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
|
|
||||||
SEQUENCE NAME public.order_history_id_seq
|
|
||||||
START WITH 1
|
|
||||||
INCREMENT BY 1
|
|
||||||
NO MINVALUE
|
|
||||||
NO MAXVALUE
|
|
||||||
CACHE 1
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_tracking; Type: TABLE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE public.order_tracking (
|
|
||||||
id bigint NOT NULL,
|
|
||||||
correlation_id character varying(255) NOT NULL,
|
|
||||||
exchange character varying(100),
|
|
||||||
routing_key character varying(100),
|
|
||||||
order_type public.order_types DEFAULT 'unknown'::public.order_types NOT NULL,
|
|
||||||
payload jsonb,
|
|
||||||
status public.order_status DEFAULT 'pending'::public.order_status NOT NULL,
|
|
||||||
retry_count integer DEFAULT 0,
|
|
||||||
error_message text,
|
|
||||||
error_stacktrace text,
|
|
||||||
start_date timestamp with time zone DEFAULT now() NOT NULL,
|
|
||||||
update_date timestamp with time zone DEFAULT now() NOT NULL,
|
|
||||||
finish_date timestamp with time zone
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_tracking_id_seq; Type: SEQUENCE; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE public.order_tracking ALTER COLUMN id ADD GENERATED ALWAYS AS IDENTITY (
|
|
||||||
SEQUENCE NAME public.order_tracking_id_seq
|
|
||||||
START WITH 1
|
|
||||||
INCREMENT BY 1
|
|
||||||
NO MINVALUE
|
|
||||||
NO MAXVALUE
|
|
||||||
CACHE 1
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation_change objenious_operation_change_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE ONLY public.objenious_operation_change
|
|
||||||
ADD CONSTRAINT objenious_operation_change_pkey PRIMARY KEY (id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation objenious_operation_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE ONLY public.objenious_operation
|
|
||||||
ADD CONSTRAINT objenious_operation_pkey PRIMARY KEY (id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_history order_history_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE ONLY public.order_history
|
|
||||||
ADD CONSTRAINT order_history_pkey PRIMARY KEY (id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_tracking order_tracking_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE ONLY public.order_tracking
|
|
||||||
ADD CONSTRAINT order_tracking_pkey PRIMARY KEY (id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: idx_order_change_date; Type: INDEX; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX idx_order_change_date ON public.order_history USING btree (change_date);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: idx_order_correlation; Type: INDEX; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX idx_order_correlation ON public.order_tracking USING btree (correlation_id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: idx_order_id; Type: INDEX; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX idx_order_id ON public.order_history USING btree (order_id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: operation_change; Type: INDEX; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX operation_change ON public.objenious_operation_change USING btree (operation_id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: pending_operations; Type: INDEX; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX pending_operations ON public.objenious_operation USING btree (start_date) WHERE (end_date IS NULL);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: pending_orders; Type: INDEX; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE INDEX pending_orders ON public.order_tracking USING btree (start_date) WHERE (finish_date IS NULL);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: objenious_operation_change fk_operation_id; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE ONLY public.objenious_operation_change
|
|
||||||
ADD CONSTRAINT fk_operation_id FOREIGN KEY (operation_id) REFERENCES public.objenious_operation(id);
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Name: order_history fk_order_id; Type: FK CONSTRAINT; Schema: public; Owner: -
|
|
||||||
--
|
|
||||||
|
|
||||||
ALTER TABLE ONLY public.order_history
|
|
||||||
ADD CONSTRAINT fk_order_id FOREIGN KEY (order_id) REFERENCES public.order_tracking(id) ON DELETE CASCADE;
|
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
-- PostgreSQL database dump complete
|
|
||||||
--
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
48
deployment/database/migrations/0.1.0_objenious.sql
Normal file
48
deployment/database/migrations/0.1.0_objenious.sql
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
|
||||||
|
CREATE TYPE status_enum AS ENUM ('noRequestID','noMassID','running','finished','error','other');
|
||||||
|
|
||||||
|
-- Tabla para gestionar las peticiones de cambio de objenious.
|
||||||
|
-- Para una o mas lineas se pueden lanzar operacione que no sabemos
|
||||||
|
-- con certeza cuando van a terminar.
|
||||||
|
-- Estas tablas está fuertemente ligadas al sistema que usa la plataforma
|
||||||
|
-- de objenioius y no debe unsarse para otra compañia.
|
||||||
|
CREATE TABLE if not exists objenious_operation (
|
||||||
|
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
|
||||||
|
retry_count INT DEFAULT 0, -- No implementado en codigo
|
||||||
|
max_retry INT DEFAULT 5, -- No implementado en codigo
|
||||||
|
max_date_retry TIMESTAMP DEFAULT NULL, -- No implementado en codigo
|
||||||
|
iccids TEXT,
|
||||||
|
request_id TEXT,
|
||||||
|
mass_action_id TEXT,
|
||||||
|
operation TEXT NOT NULL,
|
||||||
|
start_date TIMESTAMP NOT NULL DEFAULT now(),
|
||||||
|
last_change_date TIMESTAMP NOT NULL DEFAULT now(),
|
||||||
|
end_date TIMESTAMP,
|
||||||
|
error TEXT,
|
||||||
|
status status_enum,
|
||||||
|
objenious_status TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
-- operaciones pendientes para revisar
|
||||||
|
CREATE INDEX IF NOT EXISTS pending_operations
|
||||||
|
ON objenious_operation(start_date)
|
||||||
|
WHERE end_date IS NULL;
|
||||||
|
|
||||||
|
CREATE TABLE if not exists objenious_operation_change (
|
||||||
|
id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
|
||||||
|
operation_id BIGINT,
|
||||||
|
creation_date TIMESTAMP NOT NULL DEFAULT now(),
|
||||||
|
error TEXT,
|
||||||
|
new_status status_enum,
|
||||||
|
previous_status status_enum,
|
||||||
|
new_objenious_status TEXT,
|
||||||
|
previous_objenious_status TEXT,
|
||||||
|
new_request_id TEXT,
|
||||||
|
new_mass_action_id TEXT,
|
||||||
|
|
||||||
|
CONSTRAINT fk_operation_id
|
||||||
|
FOREIGN KEY(operation_id) REFERENCES objenious_operation(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX operation_change
|
||||||
|
ON objenious_operation_change(operation_id);
|
||||||
10
deployment/database/migrations/1.1.0_webhook-order.sql
Normal file
10
deployment/database/migrations/1.1.0_webhook-order.sql
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
/**
|
||||||
|
* A que endpoint actualizar el estado de los order, si se especificase.
|
||||||
|
* Se asume que siempre se usa POST.
|
||||||
|
* Se separa host de enpoint para dejar host como default el origen de la
|
||||||
|
* peticion anterior y poder hacer filtrados
|
||||||
|
*/
|
||||||
|
|
||||||
|
ALTER TABLE order_tracking
|
||||||
|
ADD COLUMN webhook_host TEXT,
|
||||||
|
ADD COLUMN webhook_endpoint TEXT;
|
||||||
@@ -60,8 +60,11 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
rabbitmq-sim-broker:
|
rabbitmq-sim-broker:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
postgresql-sim:
|
||||||
|
condition: service_healthy
|
||||||
|
|
||||||
postgresql-sim:
|
postgresql-sim:
|
||||||
|
container_name: postgresql-sim
|
||||||
image: postgres:16.1
|
image: postgres:16.1
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
"express": "^5.2.1",
|
"express": "^5.2.1",
|
||||||
"pg": "^8.18.0",
|
"pg": "^8.18.0",
|
||||||
"typescript": "^5.9.3",
|
"typescript": "^5.9.3",
|
||||||
|
"uuidv7": "^1.1.0",
|
||||||
"vite": "^7.3.1",
|
"vite": "^7.3.1",
|
||||||
"vite-tsconfig-paths": "^6.0.5"
|
"vite-tsconfig-paths": "^6.0.5"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -3,13 +3,14 @@ import { SimUsecases } from "./Sim.usecases.js"
|
|||||||
import { activationValidator, iccidValidator } from "./httpValidators.js"
|
import { activationValidator, iccidValidator } from "./httpValidators.js"
|
||||||
import { companyFromIccid } from "#domain/companies.js"
|
import { companyFromIccid } from "#domain/companies.js"
|
||||||
import { BodyValidator } from "sim-shared/aplication/BodyValidator.js"
|
import { BodyValidator } from "sim-shared/aplication/BodyValidator.js"
|
||||||
|
import { error } from "node:console"
|
||||||
|
|
||||||
|
|
||||||
export class SimController {
|
export class SimController {
|
||||||
private simUseCases: SimUsecases
|
private simUseCases: SimUsecases
|
||||||
|
|
||||||
constructor(args: {
|
constructor(args: {
|
||||||
simUseCases: SimUsecases
|
simUseCases: SimUsecases,
|
||||||
}) {
|
}) {
|
||||||
this.simUseCases = args.simUseCases
|
this.simUseCases = args.simUseCases
|
||||||
|
|
||||||
@@ -79,6 +80,18 @@ export class SimController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public preactivationTest() {
|
||||||
|
return this.controllerGenerator({
|
||||||
|
validator: iccidValidator,
|
||||||
|
useCase: this.simUseCases.test,
|
||||||
|
onError: (data, error) => console.error(error),
|
||||||
|
onSuccess: (data) => {
|
||||||
|
console.log("OK", data)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public preactivation() {
|
public preactivation() {
|
||||||
return async (req: Request, res: Response) => {
|
return async (req: Request, res: Response) => {
|
||||||
console.warn("[!] Se deberia de usar la peticion /sim/activate directamente")
|
console.warn("[!] Se deberia de usar la peticion /sim/activate directamente")
|
||||||
|
|||||||
@@ -1,23 +1,65 @@
|
|||||||
|
import { OrderRepository } from "sim-shared/infrastructure/OrderRepository.js";
|
||||||
|
import assert from "node:assert";
|
||||||
import { EventBus } from "sim-shared/domain/EventBus.port";
|
import { EventBus } from "sim-shared/domain/EventBus.port";
|
||||||
import { SimEvents } from "sim-shared/domain/SimEvents";
|
import { SimEvents } from "sim-shared/domain/SimEvents";
|
||||||
|
import { uuidv7 } from "uuidv7";
|
||||||
|
import { CreateOrderDTO, OrderType } from "sim-shared/domain/Order.js";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO:
|
* Casos de uso de tarjetas sim. Garantiza que todos los metodos usan el mismo bus de mensajes
|
||||||
* - Conexion con la BDD
|
* y repositorio de registro de las ordenes.
|
||||||
* - Conexion con RabbitMQ
|
|
||||||
* - Pasar a clase cuando existan las conexiones
|
|
||||||
*/
|
*/
|
||||||
export class SimUsecases {
|
export class SimUsecases {
|
||||||
private eventBus: EventBus
|
private eventBus: EventBus;
|
||||||
|
private orderRepository: OrderRepository;
|
||||||
|
|
||||||
constructor(args: {
|
constructor(args: {
|
||||||
eventBus: EventBus
|
eventBus: EventBus,
|
||||||
|
orderRepository: OrderRepository
|
||||||
}
|
}
|
||||||
) {
|
) {
|
||||||
this.eventBus = args.eventBus
|
this.eventBus = args.eventBus
|
||||||
|
this.orderRepository = args.orderRepository
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async test(args: { iccid: string }) {
|
||||||
|
assert(args.iccid != undefined)
|
||||||
|
const uuid = uuidv7()
|
||||||
|
const event = <SimEvents.general>{
|
||||||
|
key: `sim.test.test`,
|
||||||
|
payload: {
|
||||||
|
iccid: args.iccid
|
||||||
|
},
|
||||||
|
headers: {
|
||||||
|
message_id: uuid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const publish = await this.eventBus.publish([event])
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO:
|
||||||
|
* De momento solo para mensajes publicados de 1 en 1 y si se les ha añadido cabecera
|
||||||
|
* Si se ha saltado el proceso de añadir un ID no se
|
||||||
|
*/
|
||||||
|
if (publish.success.length == 1) {
|
||||||
|
if (event.headers?.message_id != undefined) {
|
||||||
|
const orderType = (event.key.split(".")[2] as OrderType ?? "unknown")
|
||||||
|
assert(orderType)
|
||||||
|
const order: CreateOrderDTO = {
|
||||||
|
correlation_id: event.headers.message_id,
|
||||||
|
order_type: orderType,
|
||||||
|
routing_key: event.key,
|
||||||
|
payload: event
|
||||||
|
}
|
||||||
|
this.orderRepository.createOrder(order)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* WIP
|
||||||
* Crea una nueva sim de la que no se tenia registro anteriormente
|
* 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
|
* Si ya existia se modifican los campos pero no se hace un cambio
|
||||||
* de estado.
|
* de estado.
|
||||||
|
|||||||
@@ -8,8 +8,10 @@ export type DomainEventType = string
|
|||||||
export type DomainEvent = {
|
export type DomainEvent = {
|
||||||
key: string,
|
key: string,
|
||||||
payload: Object,
|
payload: Object,
|
||||||
options: Object,
|
headers?: Object & {
|
||||||
occurredOn: Date,
|
message_id?: string
|
||||||
|
},
|
||||||
|
occurredOn?: Date,
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DomainEventSubscriber<T extends DomainEvent> {
|
export interface DomainEventSubscriber<T extends DomainEvent> {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { ConsumeMessage } from "amqplib";
|
|||||||
import { DomainEvent, DomainEventSubscriber } from "./DomainEvent.js";
|
import { DomainEvent, DomainEventSubscriber } from "./DomainEvent.js";
|
||||||
|
|
||||||
export interface EventBus {
|
export interface EventBus {
|
||||||
publish(events: Array<DomainEvent>): Promise<void>;
|
publish(events: Array<DomainEvent>): Promise<{ success: DomainEvent[], error: DomainEvent[] }>;
|
||||||
// Sacado de NEKI, posiblemente no haga falta
|
// Sacado de NEKI, posiblemente no haga falta
|
||||||
addSubscribers(subscribers: Array<DomainEventSubscriber<DomainEvent>>): void;
|
addSubscribers(subscribers: Array<DomainEventSubscriber<DomainEvent>>): void;
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,11 @@ export class RabbitMQEventBus implements EventBus {
|
|||||||
private buildStructure?: (chan: Channel) => Promise<void>
|
private buildStructure?: (chan: Channel) => Promise<void>
|
||||||
private maxRetry: number = 0
|
private maxRetry: number = 0
|
||||||
|
|
||||||
|
connection?: AmqpConnectionManager
|
||||||
|
channel?: ChannelWrapper
|
||||||
|
connected: Boolean = false
|
||||||
|
|
||||||
|
private connectionOptions: RMQConnectionParams
|
||||||
constructor(args: {
|
constructor(args: {
|
||||||
connectionParams: RMQConnectionParams,
|
connectionParams: RMQConnectionParams,
|
||||||
buildStructure?: (chan: Channel) => Promise<void>,
|
buildStructure?: (chan: Channel) => Promise<void>,
|
||||||
@@ -73,11 +78,6 @@ export class RabbitMQEventBus implements EventBus {
|
|||||||
//return this.channel.nack(msg, false, requeue)
|
//return this.channel.nack(msg, false, requeue)
|
||||||
}
|
}
|
||||||
|
|
||||||
connection?: AmqpConnectionManager
|
|
||||||
channel?: ChannelWrapper
|
|
||||||
connected: Boolean = false
|
|
||||||
|
|
||||||
private connectionOptions: RMQConnectionParams
|
|
||||||
|
|
||||||
public async connect() {
|
public async connect() {
|
||||||
|
|
||||||
@@ -96,28 +96,35 @@ export class RabbitMQEventBus implements EventBus {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("[RMQ] Error estableciendo la conexion con el servidor", e)
|
console.error("[RMQ] Error estableciendo la conexion con el servidor", e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
publish(events: DomainEvent[]): Promise<void> {
|
publish(events: DomainEvent[]): Promise<{ success: DomainEvent[], error: DomainEvent[] }> {
|
||||||
|
return new Promise(async (res, rej) => {
|
||||||
return new Promise((res, rej) => {
|
const successEvents: DomainEvent[] = []
|
||||||
|
const errorEvents: DomainEvent[] = []
|
||||||
try {
|
try {
|
||||||
for (const event of events) {
|
for (const event of events) {
|
||||||
const exchange = "sim.exchange"
|
const exchange = "sim.exchange"
|
||||||
const routingKey = event.key
|
const routingKey = event.key
|
||||||
const content = Buffer.from(JSON.stringify(event))
|
const content = Buffer.from(JSON.stringify(event))
|
||||||
this.channel?.publish(exchange, routingKey, content, {}, (err, ok) => {
|
await this.channel?.publish(exchange, routingKey, content, {
|
||||||
|
headers: {
|
||||||
|
...event.headers
|
||||||
|
}
|
||||||
|
}, (err, ok) => {
|
||||||
if (err == undefined) {
|
if (err == undefined) {
|
||||||
console.log("Evento publicado ", event)
|
console.log("Evento publicado ", event)
|
||||||
|
successEvents.push(event)
|
||||||
} else {
|
} else {
|
||||||
console.error("Error publicando", event)
|
console.error("Error publicando", event)
|
||||||
|
errorEvents.push(event)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return res()
|
return res({
|
||||||
|
success: successEvents,
|
||||||
|
error: errorEvents
|
||||||
|
})
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return rej(err)
|
return rej(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
rm deployment/database/init.sql
|
rm deployment/database/init.sql
|
||||||
|
|
||||||
# init sql debe juntar todos los scripts de "base" (sin contar migraciones)
|
# init sql debe juntar todos los scripts de "base" (sin contar migraciones)
|
||||||
# cat deployment/database/base/*.sql >deployment/database/init.sql
|
cat deployment/database/base/*.sql >deployment/database/init.sql
|
||||||
cp deployment/database/esquema_final* deployment/database/init.sql
|
#cp deployment/database/esquema_final* deployment/database/init.sql
|
||||||
|
|
||||||
# compatibilidad con postgresql < 17
|
# compatibilidad con postgresql < 17
|
||||||
sed -i '/\\restrict/d' deployment/database/init.sql
|
sed -i '/\\restrict/d' deployment/database/init.sql
|
||||||
|
|||||||
10
yarn.lock
10
yarn.lock
@@ -2893,6 +2893,7 @@ __metadata:
|
|||||||
tsc-alias: "npm:^1.8.16"
|
tsc-alias: "npm:^1.8.16"
|
||||||
tsx: "npm:^4.21.0"
|
tsx: "npm:^4.21.0"
|
||||||
typescript: "npm:^5.9.3"
|
typescript: "npm:^5.9.3"
|
||||||
|
uuidv7: "npm:^1.1.0"
|
||||||
vite: "npm:^7.3.1"
|
vite: "npm:^7.3.1"
|
||||||
vite-tsconfig-paths: "npm:^6.0.5"
|
vite-tsconfig-paths: "npm:^6.0.5"
|
||||||
vitest: "npm:^4.0.16"
|
vitest: "npm:^4.0.16"
|
||||||
@@ -3328,6 +3329,15 @@ __metadata:
|
|||||||
languageName: node
|
languageName: node
|
||||||
linkType: hard
|
linkType: hard
|
||||||
|
|
||||||
|
"uuidv7@npm:^1.1.0":
|
||||||
|
version: 1.1.0
|
||||||
|
resolution: "uuidv7@npm:1.1.0"
|
||||||
|
bin:
|
||||||
|
uuidv7: cli.js
|
||||||
|
checksum: 10/a611c4918b1662ec8f4f927b96ccc975ca050d3b221e2943ade6796c956117719a94a9edcc3f26ec8597c2ab270fed074ef5ab9fcc3b46f42c26cb4caafa4ac2
|
||||||
|
languageName: node
|
||||||
|
linkType: hard
|
||||||
|
|
||||||
"vary@npm:^1, vary@npm:^1.1.2":
|
"vary@npm:^1, vary@npm:^1.1.2":
|
||||||
version: 1.1.2
|
version: 1.1.2
|
||||||
resolution: "vary@npm:1.1.2"
|
resolution: "vary@npm:1.1.2"
|
||||||
|
|||||||
Reference in New Issue
Block a user