95 lines
3.3 KiB
SQL
95 lines
3.3 KiB
SQL
-- Script base para despliegue limpio (solo API INVIMA + autenticacion)
|
|
|
|
DROP TABLE IF EXISTS app_sessions CASCADE;
|
|
DROP TABLE IF EXISTS app_users CASCADE;
|
|
DROP TABLE IF EXISTS invima_api_catalog CASCADE;
|
|
DROP TABLE IF EXISTS invima_api_raw CASCADE;
|
|
|
|
CREATE TABLE app_users (
|
|
id bigserial PRIMARY KEY,
|
|
username text NOT NULL UNIQUE,
|
|
full_name text NOT NULL,
|
|
role text NOT NULL DEFAULT 'ADMIN',
|
|
password_hash text NOT NULL,
|
|
is_active boolean NOT NULL DEFAULT true,
|
|
created_at timestamptz NOT NULL DEFAULT NOW(),
|
|
updated_at timestamptz NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE app_sessions (
|
|
token_hash text PRIMARY KEY,
|
|
user_id bigint NOT NULL REFERENCES app_users(id) ON DELETE CASCADE,
|
|
expires_at timestamptz NOT NULL,
|
|
created_at timestamptz NOT NULL DEFAULT NOW(),
|
|
last_used_at timestamptz NOT NULL DEFAULT NOW(),
|
|
user_agent text,
|
|
ip_address text
|
|
);
|
|
|
|
CREATE INDEX idx_app_sessions_user_id ON app_sessions (user_id);
|
|
CREATE INDEX idx_app_sessions_expires_at ON app_sessions (expires_at);
|
|
|
|
CREATE TABLE invima_api_raw (
|
|
id bigserial PRIMARY KEY,
|
|
source_dataset_key text NOT NULL,
|
|
source_dataset_id text NOT NULL,
|
|
source_uid text NOT NULL,
|
|
raw_payload jsonb NOT NULL,
|
|
fetched_at timestamptz NOT NULL DEFAULT NOW(),
|
|
created_at timestamptz NOT NULL DEFAULT NOW(),
|
|
updated_at timestamptz NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT invima_api_raw_unique UNIQUE (source_dataset_key, source_uid)
|
|
);
|
|
|
|
CREATE TABLE invima_api_catalog (
|
|
source_dataset_key text NOT NULL,
|
|
source_dataset_id text NOT NULL,
|
|
source_uid text NOT NULL,
|
|
source_dataset_name text NOT NULL,
|
|
categoria_linea text NOT NULL,
|
|
categoria_canonica text,
|
|
categoria_slug text,
|
|
expediente text,
|
|
registro_sanitario text,
|
|
producto text,
|
|
titular text,
|
|
estado_registro text,
|
|
fecha_expedicion date,
|
|
fecha_vencimiento date,
|
|
modalidad text,
|
|
grupo text,
|
|
marca text,
|
|
principio_activo text,
|
|
forma_farmaceutica text,
|
|
presentacion_comercial text,
|
|
atc text,
|
|
rol_nombre text,
|
|
rol_tipo text,
|
|
ciudad_titular text,
|
|
pais_titular text,
|
|
fabricante text,
|
|
importador text,
|
|
vigencia text,
|
|
search_text text,
|
|
extra jsonb NOT NULL,
|
|
fetched_at timestamptz NOT NULL DEFAULT NOW(),
|
|
updated_at timestamptz NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT invima_api_catalog_pk PRIMARY KEY (source_dataset_key, source_uid)
|
|
);
|
|
|
|
CREATE EXTENSION IF NOT EXISTS pg_trgm;
|
|
|
|
CREATE INDEX idx_invima_api_catalog_dataset ON invima_api_catalog (source_dataset_key);
|
|
CREATE INDEX idx_invima_api_catalog_categoria_slug ON invima_api_catalog (categoria_slug);
|
|
CREATE INDEX idx_invima_api_catalog_estado ON invima_api_catalog (estado_registro);
|
|
CREATE INDEX idx_invima_api_catalog_registro ON invima_api_catalog (registro_sanitario);
|
|
CREATE INDEX idx_invima_api_catalog_expediente ON invima_api_catalog (expediente);
|
|
CREATE INDEX idx_invima_api_catalog_modalidad ON invima_api_catalog (modalidad);
|
|
CREATE INDEX idx_invima_api_catalog_grupo ON invima_api_catalog (grupo);
|
|
CREATE INDEX idx_invima_api_catalog_vencimiento ON invima_api_catalog (fecha_vencimiento);
|
|
CREATE INDEX idx_invima_api_catalog_expedicion ON invima_api_catalog (fecha_expedicion);
|
|
CREATE INDEX idx_invima_api_catalog_search_fts
|
|
ON invima_api_catalog USING GIN (to_tsvector('spanish', COALESCE(search_text, '')));
|
|
CREATE INDEX idx_invima_api_catalog_search_trgm
|
|
ON invima_api_catalog USING GIN (search_text gin_trgm_ops);
|