"""Initial migration Revision ID: 001 Revises: Create Date: 2025-11-30 """ from typing import Sequence, Union from alembic import op import sqlalchemy as sa revision: str = '001' down_revision: Union[str, None] = None branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: # Users table op.create_table( 'users', sa.Column('id', sa.Integer(), primary_key=True), sa.Column('email', sa.String(255), nullable=False, unique=True, index=True), sa.Column('username', sa.String(100), nullable=False), sa.Column('password_hash', sa.String(255), nullable=False), sa.Column('role', sa.String(20), default='participant'), sa.Column('is_active', sa.Boolean(), default=True), sa.Column('created_at', sa.DateTime(), default=sa.func.now()), ) # Contests table op.create_table( 'contests', sa.Column('id', sa.Integer(), primary_key=True), sa.Column('title', sa.String(255), nullable=False), sa.Column('description', sa.Text(), nullable=True), sa.Column('start_time', sa.DateTime(), nullable=False), sa.Column('end_time', sa.DateTime(), nullable=False), sa.Column('is_active', sa.Boolean(), default=False), sa.Column('created_by', sa.Integer(), sa.ForeignKey('users.id'), nullable=True), sa.Column('created_at', sa.DateTime(), default=sa.func.now()), ) # Problems table op.create_table( 'problems', sa.Column('id', sa.Integer(), primary_key=True), sa.Column('contest_id', sa.Integer(), sa.ForeignKey('contests.id', ondelete='CASCADE'), nullable=False), sa.Column('title', sa.String(255), nullable=False), sa.Column('description', sa.Text(), nullable=False), sa.Column('input_format', sa.Text(), nullable=True), sa.Column('output_format', sa.Text(), nullable=True), sa.Column('constraints', sa.Text(), nullable=True), sa.Column('time_limit_ms', sa.Integer(), default=1000), sa.Column('memory_limit_kb', sa.Integer(), default=262144), sa.Column('total_points', sa.Integer(), default=100), sa.Column('order_index', sa.Integer(), default=0), sa.Column('created_at', sa.DateTime(), default=sa.func.now()), ) # Test cases table op.create_table( 'test_cases', sa.Column('id', sa.Integer(), primary_key=True), sa.Column('problem_id', sa.Integer(), sa.ForeignKey('problems.id', ondelete='CASCADE'), nullable=False), sa.Column('input', sa.Text(), nullable=False), sa.Column('expected_output', sa.Text(), nullable=False), sa.Column('is_sample', sa.Boolean(), default=False), sa.Column('points', sa.Integer(), default=0), sa.Column('order_index', sa.Integer(), default=0), ) # Submissions table op.create_table( 'submissions', sa.Column('id', sa.Integer(), primary_key=True), sa.Column('user_id', sa.Integer(), sa.ForeignKey('users.id'), nullable=False), sa.Column('problem_id', sa.Integer(), sa.ForeignKey('problems.id'), nullable=False), sa.Column('contest_id', sa.Integer(), sa.ForeignKey('contests.id'), nullable=False), sa.Column('source_code', sa.Text(), nullable=False), sa.Column('language_id', sa.Integer(), nullable=False), sa.Column('language_name', sa.String(50), nullable=True), sa.Column('status', sa.String(50), default='pending'), sa.Column('score', sa.Integer(), default=0), sa.Column('total_points', sa.Integer(), default=0), sa.Column('tests_passed', sa.Integer(), default=0), sa.Column('tests_total', sa.Integer(), default=0), sa.Column('execution_time_ms', sa.Integer(), nullable=True), sa.Column('memory_used_kb', sa.Integer(), nullable=True), sa.Column('judge_response', sa.JSON(), nullable=True), sa.Column('created_at', sa.DateTime(), default=sa.func.now()), ) # Contest participants table op.create_table( 'contest_participants', sa.Column('id', sa.Integer(), primary_key=True), sa.Column('contest_id', sa.Integer(), sa.ForeignKey('contests.id'), nullable=False), sa.Column('user_id', sa.Integer(), sa.ForeignKey('users.id'), nullable=False), sa.Column('joined_at', sa.DateTime(), default=sa.func.now()), sa.UniqueConstraint('contest_id', 'user_id', name='unique_contest_participant'), ) def downgrade() -> None: op.drop_table('contest_participants') op.drop_table('submissions') op.drop_table('test_cases') op.drop_table('problems') op.drop_table('contests') op.drop_table('users')