"""Initial schema Revision ID: 001 Revises: Create Date: 2025-01-01 00:00:00.000000 """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql # revision identifiers, used by Alembic. revision = '001' down_revision = None branch_labels = None depends_on = None def upgrade() -> None: # Create users table op.create_table('users', sa.Column('id', sa.Integer(), nullable=False), sa.Column('email', sa.String(), nullable=False), sa.Column('username', sa.String(), nullable=False), sa.Column('hashed_password', sa.String(), nullable=False), sa.Column('full_name', sa.String(), nullable=True), sa.Column('is_active', sa.Boolean(), nullable=True), sa.Column('is_superuser', sa.Boolean(), nullable=True), sa.Column('is_verified', sa.Boolean(), nullable=True), sa.Column('role', sa.String(), nullable=True), sa.Column('permissions', sa.JSON(), nullable=True), sa.Column('avatar_url', sa.String(), nullable=True), sa.Column('bio', sa.Text(), nullable=True), sa.Column('company', sa.String(), nullable=True), sa.Column('website', sa.String(), nullable=True), sa.Column('created_at', sa.DateTime(), nullable=True), sa.Column('updated_at', sa.DateTime(), nullable=True), sa.Column('last_login', sa.DateTime(), nullable=True), sa.Column('preferences', sa.JSON(), nullable=True), sa.Column('notification_settings', sa.JSON(), nullable=True), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_users_email'), 'users', ['email'], unique=True) op.create_index(op.f('ix_users_id'), 'users', ['id'], unique=False) op.create_index(op.f('ix_users_username'), 'users', ['username'], unique=True) # Create api_keys table op.create_table('api_keys', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(), nullable=False), sa.Column('key_hash', sa.String(), nullable=False), sa.Column('key_prefix', sa.String(), nullable=False), sa.Column('user_id', sa.Integer(), nullable=False), sa.Column('is_active', sa.Boolean(), nullable=True), sa.Column('permissions', sa.JSON(), nullable=True), sa.Column('scopes', sa.JSON(), nullable=True), sa.Column('rate_limit_per_minute', sa.Integer(), nullable=True), sa.Column('rate_limit_per_hour', sa.Integer(), nullable=True), sa.Column('rate_limit_per_day', sa.Integer(), nullable=True), sa.Column('allowed_models', sa.JSON(), nullable=True), sa.Column('allowed_endpoints', sa.JSON(), nullable=True), sa.Column('allowed_ips', sa.JSON(), nullable=True), sa.Column('description', sa.Text(), nullable=True), sa.Column('tags', sa.JSON(), nullable=True), sa.Column('created_at', sa.DateTime(), nullable=True), sa.Column('updated_at', sa.DateTime(), nullable=True), sa.Column('last_used_at', sa.DateTime(), nullable=True), sa.Column('expires_at', sa.DateTime(), nullable=True), sa.Column('total_requests', sa.Integer(), nullable=True), sa.Column('total_tokens', sa.Integer(), nullable=True), sa.Column('total_cost', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_api_keys_id'), 'api_keys', ['id'], unique=False) op.create_index(op.f('ix_api_keys_key_hash'), 'api_keys', ['key_hash'], unique=True) op.create_index(op.f('ix_api_keys_key_prefix'), 'api_keys', ['key_prefix'], unique=False) # Create budgets table op.create_table('budgets', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(), nullable=False), sa.Column('description', sa.String(), nullable=True), sa.Column('user_id', sa.Integer(), nullable=False), sa.Column('limit_amount', sa.Float(), nullable=False), sa.Column('currency', sa.String(), nullable=True), sa.Column('period', sa.String(), nullable=True), sa.Column('current_usage', sa.Float(), nullable=True), sa.Column('remaining_amount', sa.Float(), nullable=True), sa.Column('status', sa.String(), nullable=True), sa.Column('is_active', sa.Boolean(), nullable=True), sa.Column('alert_thresholds', sa.JSON(), nullable=True), sa.Column('alerts_sent', sa.JSON(), nullable=True), sa.Column('auto_suspend_on_exceed', sa.Boolean(), nullable=True), sa.Column('auto_notify_on_exceed', sa.Boolean(), nullable=True), sa.Column('period_start', sa.DateTime(), nullable=False), sa.Column('period_end', sa.DateTime(), nullable=False), sa.Column('allowed_models', sa.JSON(), nullable=True), sa.Column('allowed_endpoints', sa.JSON(), nullable=True), sa.Column('user_groups', sa.JSON(), nullable=True), sa.Column('tags', sa.JSON(), nullable=True), sa.Column('metadata', sa.JSON(), nullable=True), sa.Column('created_at', sa.DateTime(), nullable=True), sa.Column('updated_at', sa.DateTime(), nullable=True), sa.Column('last_reset_at', sa.DateTime(), nullable=True), sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_budgets_id'), 'budgets', ['id'], unique=False) # Create usage_tracking table op.create_table('usage_tracking', sa.Column('id', sa.Integer(), nullable=False), sa.Column('request_id', sa.String(), nullable=False), sa.Column('session_id', sa.String(), nullable=True), sa.Column('user_id', sa.Integer(), nullable=False), sa.Column('api_key_id', sa.Integer(), nullable=True), sa.Column('endpoint', sa.String(), nullable=False), sa.Column('method', sa.String(), nullable=False), sa.Column('user_agent', sa.String(), nullable=True), sa.Column('ip_address', sa.String(), nullable=True), sa.Column('model_name', sa.String(), nullable=True), sa.Column('provider', sa.String(), nullable=True), sa.Column('model_version', sa.String(), nullable=True), sa.Column('request_data', sa.JSON(), nullable=True), sa.Column('response_data', sa.JSON(), nullable=True), sa.Column('prompt_tokens', sa.Integer(), nullable=True), sa.Column('completion_tokens', sa.Integer(), nullable=True), sa.Column('total_tokens', sa.Integer(), nullable=True), sa.Column('cost_per_token', sa.Float(), nullable=True), sa.Column('total_cost', sa.Float(), nullable=True), sa.Column('currency', sa.String(), nullable=True), sa.Column('response_time', sa.Float(), nullable=True), sa.Column('queue_time', sa.Float(), nullable=True), sa.Column('processing_time', sa.Float(), nullable=True), sa.Column('status', sa.String(), nullable=True), sa.Column('status_code', sa.Integer(), nullable=True), sa.Column('error_message', sa.Text(), nullable=True), sa.Column('error_type', sa.String(), nullable=True), sa.Column('modules_used', sa.JSON(), nullable=True), sa.Column('interceptor_chain', sa.JSON(), nullable=True), sa.Column('tags', sa.JSON(), nullable=True), sa.Column('metadata', sa.JSON(), nullable=True), sa.Column('created_at', sa.DateTime(), nullable=True), sa.Column('started_at', sa.DateTime(), nullable=True), sa.Column('completed_at', sa.DateTime(), nullable=True), sa.Column('cache_hit', sa.Boolean(), nullable=True), sa.Column('cache_key', sa.String(), nullable=True), sa.Column('rate_limit_remaining', sa.Integer(), nullable=True), sa.Column('rate_limit_reset', sa.DateTime(), nullable=True), sa.ForeignKeyConstraint(['api_key_id'], ['api_keys.id'], ), sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_usage_tracking_id'), 'usage_tracking', ['id'], unique=False) op.create_index(op.f('ix_usage_tracking_request_id'), 'usage_tracking', ['request_id'], unique=True) op.create_index(op.f('ix_usage_tracking_session_id'), 'usage_tracking', ['session_id'], unique=False) # Create audit_logs table op.create_table('audit_logs', sa.Column('id', sa.Integer(), nullable=False), sa.Column('user_id', sa.Integer(), nullable=True), sa.Column('action', sa.String(), nullable=False), sa.Column('resource_type', sa.String(), nullable=False), sa.Column('resource_id', sa.String(), nullable=True), sa.Column('description', sa.Text(), nullable=False), sa.Column('details', sa.JSON(), nullable=True), sa.Column('ip_address', sa.String(), nullable=True), sa.Column('user_agent', sa.String(), nullable=True), sa.Column('session_id', sa.String(), nullable=True), sa.Column('request_id', sa.String(), nullable=True), sa.Column('severity', sa.String(), nullable=True), sa.Column('category', sa.String(), nullable=True), sa.Column('success', sa.Boolean(), nullable=True), sa.Column('error_message', sa.Text(), nullable=True), sa.Column('tags', sa.JSON(), nullable=True), sa.Column('metadata', sa.JSON(), nullable=True), sa.Column('old_values', sa.JSON(), nullable=True), sa.Column('new_values', sa.JSON(), nullable=True), sa.Column('created_at', sa.DateTime(), nullable=True), sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_audit_logs_created_at'), 'audit_logs', ['created_at'], unique=False) op.create_index(op.f('ix_audit_logs_id'), 'audit_logs', ['id'], unique=False) # Create modules table op.create_table('modules', sa.Column('id', sa.Integer(), nullable=False), sa.Column('name', sa.String(), nullable=False), sa.Column('display_name', sa.String(), nullable=False), sa.Column('description', sa.Text(), nullable=True), sa.Column('module_type', sa.String(), nullable=True), sa.Column('category', sa.String(), nullable=True), sa.Column('version', sa.String(), nullable=False), sa.Column('author', sa.String(), nullable=True), sa.Column('license', sa.String(), nullable=True), sa.Column('status', sa.String(), nullable=True), sa.Column('is_enabled', sa.Boolean(), nullable=True), sa.Column('is_core', sa.Boolean(), nullable=True), sa.Column('config_schema', sa.JSON(), nullable=True), sa.Column('config_values', sa.JSON(), nullable=True), sa.Column('default_config', sa.JSON(), nullable=True), sa.Column('dependencies', sa.JSON(), nullable=True), sa.Column('conflicts', sa.JSON(), nullable=True), sa.Column('install_path', sa.String(), nullable=True), sa.Column('entry_point', sa.String(), nullable=True), sa.Column('interceptor_chains', sa.JSON(), nullable=True), sa.Column('execution_order', sa.Integer(), nullable=True), sa.Column('api_endpoints', sa.JSON(), nullable=True), sa.Column('required_permissions', sa.JSON(), nullable=True), sa.Column('security_level', sa.String(), nullable=True), sa.Column('tags', sa.JSON(), nullable=True), sa.Column('metadata', sa.JSON(), nullable=True), sa.Column('last_error', sa.Text(), nullable=True), sa.Column('error_count', sa.Integer(), nullable=True), sa.Column('last_started', sa.DateTime(), nullable=True), sa.Column('last_stopped', sa.DateTime(), nullable=True), sa.Column('request_count', sa.Integer(), nullable=True), sa.Column('success_count', sa.Integer(), nullable=True), sa.Column('error_count_runtime', sa.Integer(), nullable=True), sa.Column('created_at', sa.DateTime(), nullable=True), sa.Column('updated_at', sa.DateTime(), nullable=True), sa.Column('installed_at', sa.DateTime(), nullable=True), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_modules_id'), 'modules', ['id'], unique=False) op.create_index(op.f('ix_modules_name'), 'modules', ['name'], unique=True) def downgrade() -> None: op.drop_index(op.f('ix_modules_name'), table_name='modules') op.drop_index(op.f('ix_modules_id'), table_name='modules') op.drop_table('modules') op.drop_index(op.f('ix_audit_logs_id'), table_name='audit_logs') op.drop_index(op.f('ix_audit_logs_created_at'), table_name='audit_logs') op.drop_table('audit_logs') op.drop_index(op.f('ix_usage_tracking_session_id'), table_name='usage_tracking') op.drop_index(op.f('ix_usage_tracking_request_id'), table_name='usage_tracking') op.drop_index(op.f('ix_usage_tracking_id'), table_name='usage_tracking') op.drop_table('usage_tracking') op.drop_index(op.f('ix_budgets_id'), table_name='budgets') op.drop_table('budgets') op.drop_index(op.f('ix_api_keys_key_prefix'), table_name='api_keys') op.drop_index(op.f('ix_api_keys_key_hash'), table_name='api_keys') op.drop_index(op.f('ix_api_keys_id'), table_name='api_keys') op.drop_table('api_keys') op.drop_index(op.f('ix_users_username'), table_name='users') op.drop_index(op.f('ix_users_id'), table_name='users') op.drop_index(op.f('ix_users_email'), table_name='users') op.drop_table('users')