mirror of
https://origin.cursor.com/mrdevmx/panels.git
synced 2026-10-09 18:43:18 +00:00
- Fase 0: scripts de aprovisionamiento (db/provision/) para roles, dos bases de datos separadas (panels_platform / panels_product con esquemas iam+core) y ACLs de Redis por modulo, con verificacion automatizada de aislamiento (verify-isolation.sh) y setup local reproducible (dev-local.sh). - Fase 1: changelogs de Liquibase reescritos para Postgres (db/platform, db/iam, db/core reemplazan db/app + los changesets SQLite de platform). Baseline como estado final (no replay literal), tipos traducidos (IDENTITY, TIMESTAMPTZ/DATE, NUMERIC, BOOLEAN, CITEXT), contexts dev vs. schema/catalogos, RLS por tenant_id como defensa en profundidad, uploaded_by/created_by como snapshot desnormalizado (sin FK hacia iam). - Migraciones ya no corren en el arranque de la API: paso explicito de deploy via db/update.sh con credenciales _owner. Verificado end-to-end contra Postgres 16 + Redis local. Co-authored-by: alberto.martinez <alberto.martinez@mrdev.mx>
66 lines
3.2 KiB
SQL
66 lines
3.2 KiB
SQL
--liquibase formatted sql
|
|
-- PANELS · panels_platform (Postgres) · baseline
|
|
--
|
|
-- Control plane SaaS: tenants, operadores de PANELS (platform_users) y
|
|
-- configuración SMTP. Base de datos físicamente separada de panels_product
|
|
-- (ver plan de migración) -- nada aquí se referencia desde iam/core con FK.
|
|
--
|
|
-- Este baseline representa el ESTADO FINAL equivalente a los changesets
|
|
-- SQLite 001..007 de la implementación anterior, no un replay literal
|
|
-- (varios de esos changesets eran parches específicos de SQLite, p. ej.
|
|
-- el rebuild de tabla en 004-tenant-status-expand.sql para ampliar un CHECK).
|
|
|
|
--changeset panel:platform-001a-tenants endDelimiter:;
|
|
--preconditions onFail:MARK_RAN
|
|
--precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='public' AND table_name='tenants'
|
|
CREATE TABLE tenants (
|
|
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
code TEXT NOT NULL UNIQUE,
|
|
name TEXT NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'activo' CHECK (status IN ('activo', 'suspendido', 'cancelado')),
|
|
plan TEXT NOT NULL DEFAULT 'trial',
|
|
valid_until DATE,
|
|
notes TEXT NOT NULL DEFAULT '',
|
|
contact_email TEXT NOT NULL DEFAULT '',
|
|
contact_name TEXT NOT NULL DEFAULT '',
|
|
access_sent_at TIMESTAMPTZ,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
--changeset panel:platform-001b-platform-users endDelimiter:;
|
|
--preconditions onFail:MARK_RAN
|
|
--precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='public' AND table_name='platform_users'
|
|
CREATE TABLE platform_users (
|
|
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
username TEXT NOT NULL UNIQUE,
|
|
password_hash TEXT NOT NULL,
|
|
display_name TEXT NOT NULL,
|
|
status TEXT NOT NULL DEFAULT 'activo' CHECK (status IN ('activo', 'inactivo')),
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
--changeset panel:platform-001c-smtp-settings endDelimiter:; splitStatements:true
|
|
--preconditions onFail:MARK_RAN
|
|
--precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='public' AND table_name='smtp_settings'
|
|
CREATE TABLE smtp_settings (
|
|
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
host TEXT NOT NULL DEFAULT '',
|
|
port INTEGER NOT NULL DEFAULT 587,
|
|
username TEXT NOT NULL DEFAULT '',
|
|
password TEXT NOT NULL DEFAULT '',
|
|
from_address TEXT NOT NULL DEFAULT '',
|
|
enabled BOOLEAN NOT NULL DEFAULT false,
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
INSERT INTO smtp_settings (id, host, port, username, password, from_address, enabled)
|
|
VALUES (1, '', 587, '', '', '', false);
|
|
|
|
--changeset panel:platform-001d-seed-arctec-tenant context:dev endDelimiter:; splitStatements:true
|
|
--comment: Datos de demostración -- nunca en staging/producción. id=1 fijo a
|
|
-- propósito: los changesets de dev-seed de core/iam asumen este mismo id
|
|
-- para tenant_id (no hay FK real entre bases, así que se sincroniza a mano).
|
|
--preconditions onFail:MARK_RAN
|
|
--precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM tenants WHERE code = 'ARCT2608'
|
|
INSERT INTO tenants (id, code, name, status) OVERRIDING SYSTEM VALUE VALUES (1, 'ARCT2608', 'ARCTEC', 'activo');
|
|
SELECT setval(pg_get_serial_sequence('tenants', 'id'), (SELECT MAX(id) FROM tenants));
|