69 lines
2.5 KiB
Python
69 lines
2.5 KiB
Python
"""add_system_settings_table
|
|
|
|
Revision ID: ec4cb4a49cde
|
|
Revises: 4fa11836f7fd
|
|
Create Date: 2026-01-16 18:16:00.283455
|
|
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
from sqlalchemy.dialects.postgresql import UUID
|
|
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = 'ec4cb4a49cde'
|
|
down_revision: Union[str, None] = '4fa11836f7fd'
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
# Create enum for setting types (only if not exists)
|
|
op.execute("""
|
|
DO $$ BEGIN
|
|
CREATE TYPE settingtype AS ENUM ('plaintext', 'encrypted', 'json');
|
|
EXCEPTION
|
|
WHEN duplicate_object THEN null;
|
|
END $$;
|
|
""")
|
|
|
|
# Create system_settings table
|
|
op.execute("""
|
|
CREATE TABLE system_settings (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
setting_key VARCHAR(100) UNIQUE NOT NULL,
|
|
setting_value TEXT,
|
|
setting_type settingtype NOT NULL DEFAULT 'plaintext'::settingtype,
|
|
description TEXT,
|
|
updated_by UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
is_sensitive BOOLEAN NOT NULL DEFAULT FALSE
|
|
);
|
|
|
|
COMMENT ON COLUMN system_settings.setting_key IS 'Unique setting identifier (e.g., stripe_secret_key)';
|
|
COMMENT ON COLUMN system_settings.setting_value IS 'Setting value (encrypted if setting_type is encrypted)';
|
|
COMMENT ON COLUMN system_settings.setting_type IS 'Type of setting: plaintext, encrypted, or json';
|
|
COMMENT ON COLUMN system_settings.description IS 'Human-readable description of the setting';
|
|
COMMENT ON COLUMN system_settings.updated_by IS 'User who last updated this setting';
|
|
COMMENT ON COLUMN system_settings.is_sensitive IS 'Whether this setting contains sensitive data';
|
|
""")
|
|
|
|
# Create indexes
|
|
op.create_index('idx_system_settings_key', 'system_settings', ['setting_key'])
|
|
op.create_index('idx_system_settings_updated_at', 'system_settings', ['updated_at'])
|
|
|
|
|
|
def downgrade() -> None:
|
|
# Drop indexes
|
|
op.drop_index('idx_system_settings_updated_at')
|
|
op.drop_index('idx_system_settings_key')
|
|
|
|
# Drop table
|
|
op.drop_table('system_settings')
|
|
|
|
# Drop enum
|
|
op.execute('DROP TYPE IF EXISTS settingtype')
|