-- =====================================================
-- Migration: API REST pública /api/v1 + Webhooks inbound
-- Data: 2026-04-29
-- =====================================================
--
-- Tabelas:
--   api_audit_log       — uma linha por chamada HTTP processada
--   webhook_endpoints   — configuração de canais de webhook inbound
--   api_rate_limit      — buckets de janela fixa por usuário/IP/endpoint
--
-- Block columns são populadas pelo framework via customerControl/companyControl;
-- não declarar DEFAULT 1 nem alocar manualmente nas queries dos Laboratórios.
-- =====================================================

CREATE TABLE api_audit_log (
    id BIGSERIAL PRIMARY KEY,

    -- Identificação da requisição
    request_id    CHAR(36)     NOT NULL,
    customer_id   INTEGER,
    user_id       INTEGER,

    -- HTTP
    method        VARCHAR(10)  NOT NULL,
    path          VARCHAR(255) NOT NULL,
    route_pattern VARCHAR(255),
    status_code   SMALLINT     NOT NULL,

    -- Conteúdo (redacted: otp_codigo, password e secret são mascarados antes de gravar)
    request_body  TEXT,
    response_body TEXT,

    -- Metadados de origem
    ip            VARCHAR(45),
    user_agent    VARCHAR(500),

    -- Performance
    latency_ms    INTEGER NOT NULL,

    -- Contexto interno
    laboratorio   VARCHAR(200),
    error_message VARCHAR(500),

    -- Block padrão Galaxia (preenchido pelo framework)
    data_cadastro       TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    block_filial_id     INTEGER,
    block_usuario_id    INTEGER,
    usuario_cadastro    VARCHAR(255),
    data_atualizacao    TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(255),
    block_data          TIMESTAMP WITHOUT TIME ZONE,
    block_quem          VARCHAR(255),
    block               INTEGER,
    block_empresa_id    INTEGER
);

CREATE INDEX idx_api_audit_log_user_data       ON api_audit_log (user_id, data_cadastro);
CREATE INDEX idx_api_audit_log_path_data       ON api_audit_log (path, data_cadastro);
CREATE INDEX idx_api_audit_log_request_id      ON api_audit_log (request_id);
CREATE INDEX idx_api_audit_log_status_data     ON api_audit_log (status_code, data_cadastro);


CREATE TABLE webhook_endpoints (
    id SERIAL PRIMARY KEY,

    -- Identificação do canal (slug usado em /api/webhooks/{channel})
    channel          VARCHAR(60)  NOT NULL UNIQUE,
    description      VARCHAR(255),

    -- Validação HMAC
    secret           VARCHAR(255) NOT NULL,
    signature_header VARCHAR(60)  NOT NULL DEFAULT 'X-Signature',
    signature_algo   VARCHAR(20)  NOT NULL DEFAULT 'hmac_sha256',
        -- hmac_sha256 | hmac_sha1

    -- Despacho interno
    target_lab       VARCHAR(200) NOT NULL,
    payload_mapper   VARCHAR(200),

    -- Estado
    active           SMALLINT     NOT NULL DEFAULT 1,
    customer_id      INTEGER,

    -- Block padrão Galaxia (preenchido pelo framework)
    data_cadastro       TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    block_filial_id     INTEGER,
    block_usuario_id    INTEGER,
    usuario_cadastro    VARCHAR(255),
    data_atualizacao    TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(255),
    block_data          TIMESTAMP WITHOUT TIME ZONE,
    block_quem          VARCHAR(255),
    block               INTEGER,
    block_empresa_id    INTEGER
);

CREATE INDEX idx_webhook_endpoints_channel ON webhook_endpoints (channel);


CREATE TABLE api_rate_limit (
    bucket_key   VARCHAR(160)                 NOT NULL,
    hits         INTEGER                      NOT NULL DEFAULT 0,
    window_start TIMESTAMP WITHOUT TIME ZONE  NOT NULL,
    expires_at   TIMESTAMP WITHOUT TIME ZONE  NOT NULL,

    -- Block padrão Galaxia (preenchido pelo framework)
    data_cadastro       TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
    block_filial_id     INTEGER,
    block_usuario_id    INTEGER,
    usuario_cadastro    VARCHAR(255),
    data_atualizacao    TIMESTAMP WITHOUT TIME ZONE,
    usuario_atualizacao VARCHAR(255),
    block_data          TIMESTAMP WITHOUT TIME ZONE,
    block_quem          VARCHAR(255),
    block               INTEGER,
    block_empresa_id    INTEGER,

    PRIMARY KEY (bucket_key)
);

CREATE INDEX idx_api_rate_limit_expires ON api_rate_limit (expires_at);
