dotnet-cqrs/Svrnty.CQRS.Events.PostgreSQL/Migrations/004_StreamConfiguration.sql

85 lines
4.1 KiB
SQL

-- Migration 004: Stream Configuration
-- Creates stream_configurations table for per-stream configuration management
-- Stream configuration table
CREATE TABLE IF NOT EXISTS event_streaming.stream_configurations (
stream_name VARCHAR(255) PRIMARY KEY,
description TEXT,
tags JSONB,
-- Retention configuration
retention_max_age_seconds BIGINT,
retention_max_size_bytes BIGINT,
retention_max_event_count BIGINT,
retention_enable_partitioning BOOLEAN,
retention_partition_interval_seconds BIGINT,
-- Dead Letter Queue configuration
dlq_enabled BOOLEAN DEFAULT FALSE,
dlq_stream_name VARCHAR(255),
dlq_max_delivery_attempts INTEGER DEFAULT 3,
dlq_retry_delay_seconds BIGINT,
dlq_store_original_event BOOLEAN DEFAULT TRUE,
dlq_store_error_details BOOLEAN DEFAULT TRUE,
-- Lifecycle configuration
lifecycle_auto_create BOOLEAN DEFAULT TRUE,
lifecycle_auto_archive BOOLEAN DEFAULT FALSE,
lifecycle_archive_after_seconds BIGINT,
lifecycle_archive_location TEXT,
lifecycle_auto_delete BOOLEAN DEFAULT FALSE,
lifecycle_delete_after_seconds BIGINT,
-- Performance configuration
performance_batch_size INTEGER,
performance_enable_compression BOOLEAN,
performance_compression_algorithm VARCHAR(50),
performance_enable_indexing BOOLEAN,
performance_indexed_fields JSONB,
performance_cache_size INTEGER,
-- Access control
access_public_read BOOLEAN DEFAULT FALSE,
access_public_write BOOLEAN DEFAULT FALSE,
access_allowed_readers JSONB,
access_allowed_writers JSONB,
access_max_consumer_groups INTEGER,
access_max_events_per_second BIGINT,
-- Metadata
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ,
created_by VARCHAR(255),
updated_by VARCHAR(255)
);
-- Index for efficient tag queries
CREATE INDEX IF NOT EXISTS idx_stream_config_tags
ON event_streaming.stream_configurations USING GIN (tags);
-- Index for lifecycle queries (used by background services)
CREATE INDEX IF NOT EXISTS idx_stream_config_lifecycle
ON event_streaming.stream_configurations (lifecycle_auto_archive, lifecycle_auto_delete)
WHERE lifecycle_auto_archive = TRUE OR lifecycle_auto_delete = TRUE;
-- Index for DLQ queries
CREATE INDEX IF NOT EXISTS idx_stream_config_dlq
ON event_streaming.stream_configurations (dlq_enabled)
WHERE dlq_enabled = TRUE;
-- Comments for documentation
COMMENT ON TABLE event_streaming.stream_configurations IS 'Per-stream configuration for retention, DLQ, lifecycle, performance, and access control';
COMMENT ON COLUMN event_streaming.stream_configurations.stream_name IS 'Unique stream name';
COMMENT ON COLUMN event_streaming.stream_configurations.tags IS 'JSON object with arbitrary tags for categorization';
COMMENT ON COLUMN event_streaming.stream_configurations.retention_max_age_seconds IS 'Maximum age of events in seconds before cleanup';
COMMENT ON COLUMN event_streaming.stream_configurations.retention_max_size_bytes IS 'Maximum total size in bytes before cleanup';
COMMENT ON COLUMN event_streaming.stream_configurations.retention_max_event_count IS 'Maximum number of events before cleanup';
COMMENT ON COLUMN event_streaming.stream_configurations.dlq_enabled IS 'Whether dead letter queue is enabled for this stream';
COMMENT ON COLUMN event_streaming.stream_configurations.dlq_stream_name IS 'Name of the dead letter stream (defaults to {stream_name}-dlq)';
COMMENT ON COLUMN event_streaming.stream_configurations.dlq_max_delivery_attempts IS 'Maximum delivery attempts before sending to DLQ';
COMMENT ON COLUMN event_streaming.stream_configurations.lifecycle_auto_create IS 'Whether to automatically create stream if it does not exist';
COMMENT ON COLUMN event_streaming.stream_configurations.lifecycle_auto_archive IS 'Whether to automatically archive old events';
COMMENT ON COLUMN event_streaming.stream_configurations.lifecycle_auto_delete IS 'Whether to automatically delete old events';
COMMENT ON COLUMN event_streaming.stream_configurations.access_public_read IS 'Whether anyone can read from this stream';
COMMENT ON COLUMN event_streaming.stream_configurations.access_public_write IS 'Whether anyone can write to this stream';