platform-deployments/docker/features/feature-flags/init.sql

64 lines
2.4 KiB
MySQL
Raw Permalink Normal View History

-- Feature Flags Database Initialization
CREATE SCHEMA IF NOT EXISTS flags;
-- Feature flags table
CREATE TABLE IF NOT EXISTS flags.feature_flags (
id VARCHAR(100) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
type VARCHAR(50) NOT NULL DEFAULT 'boolean',
default_value JSONB NOT NULL DEFAULT 'false',
enabled BOOLEAN DEFAULT TRUE,
environments TEXT[] DEFAULT ARRAY['development', 'staging', 'production'],
tags TEXT[] DEFAULT '{}',
created_by UUID,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Flag overrides (per-user, per-group, percentage)
CREATE TABLE IF NOT EXISTS flags.feature_flag_overrides (
id SERIAL PRIMARY KEY,
flag_id VARCHAR(100) NOT NULL REFERENCES flags.feature_flags(id) ON DELETE CASCADE,
override_type VARCHAR(50) NOT NULL,
target_id VARCHAR(255),
target_value JSONB NOT NULL,
percentage INTEGER,
priority INTEGER DEFAULT 0,
expires_at TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
CONSTRAINT valid_override CHECK (
(override_type = 'user' AND target_id IS NOT NULL) OR
(override_type = 'group' AND target_id IS NOT NULL) OR
(override_type = 'percentage' AND percentage IS NOT NULL)
)
);
-- Audit log
CREATE TABLE IF NOT EXISTS flags.feature_flag_audit (
id SERIAL PRIMARY KEY,
flag_id VARCHAR(100) NOT NULL,
action VARCHAR(50) NOT NULL,
old_value JSONB,
new_value JSONB,
changed_by UUID,
changed_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
reason TEXT
);
-- Indexes
CREATE INDEX IF NOT EXISTS idx_flags_enabled ON flags.feature_flags(enabled);
CREATE INDEX IF NOT EXISTS idx_flags_tags ON flags.feature_flags USING GIN(tags);
CREATE INDEX IF NOT EXISTS idx_overrides_flag ON flags.feature_flag_overrides(flag_id);
CREATE INDEX IF NOT EXISTS idx_overrides_target ON flags.feature_flag_overrides(override_type, target_id);
CREATE INDEX IF NOT EXISTS idx_audit_flag ON flags.feature_flag_audit(flag_id);
CREATE INDEX IF NOT EXISTS idx_audit_time ON flags.feature_flag_audit(changed_at DESC);
-- Permissions
GRANT ALL PRIVILEGES ON SCHEMA flags TO lilith;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA flags TO lilith;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA flags TO lilith;
DO $$ BEGIN RAISE NOTICE 'Feature flags database initialized'; END $$;