"""Add creative projects tables Revision ID: 004 Revises: 003 Create Date: 2024-12-20 12:00:00.000000 """ from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql # revision identifiers revision = '004' down_revision = '003' branch_labels = None depends_on = None def upgrade(): # Create creative_projects table op.create_table('creative_projects', sa.Column('id', sa.String(255), primary_key=True, index=True), sa.Column('title', sa.String(200), nullable=False), sa.Column('description', sa.Text(), nullable=False), sa.Column('project_type', sa.String(50), nullable=False), sa.Column('status', sa.String(50), default='proposed'), sa.Column('initiator_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('created_at', sa.DateTime(), server_default=sa.func.now()), sa.Column('target_completion', sa.DateTime()), sa.Column('project_goals', sa.JSON(), default=list), sa.Column('style_guidelines', sa.JSON(), default=dict), sa.Column('current_content', sa.Text(), default=''), sa.Column('metadata', sa.JSON(), default=dict) ) # Create indexes for creative_projects op.create_index('ix_projects_status', 'creative_projects', ['status']) op.create_index('ix_projects_type', 'creative_projects', ['project_type']) op.create_index('ix_projects_initiator', 'creative_projects', ['initiator_id', 'created_at']) # Create project_collaborators table op.create_table('project_collaborators', sa.Column('id', sa.Integer(), primary_key=True, index=True), sa.Column('project_id', sa.String(255), sa.ForeignKey('creative_projects.id'), nullable=False), sa.Column('character_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('role_description', sa.String(200), default='collaborator'), sa.Column('joined_at', sa.DateTime(), server_default=sa.func.now()), sa.Column('is_active', sa.Boolean(), default=True) ) # Create indexes for project_collaborators op.create_index('ix_collaborators_project', 'project_collaborators', ['project_id']) op.create_index('ix_collaborators_character', 'project_collaborators', ['character_id']) # Create project_contributions table op.create_table('project_contributions', sa.Column('id', sa.String(255), primary_key=True, index=True), sa.Column('project_id', sa.String(255), sa.ForeignKey('creative_projects.id'), nullable=False), sa.Column('contributor_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('contribution_type', sa.String(50), nullable=False), sa.Column('content', sa.Text(), nullable=False), sa.Column('timestamp', sa.DateTime(), server_default=sa.func.now()), sa.Column('build_on_contribution_id', sa.String(255), sa.ForeignKey('project_contributions.id')), sa.Column('feedback_for_contribution_id', sa.String(255), sa.ForeignKey('project_contributions.id')), sa.Column('metadata', sa.JSON(), default=dict) ) # Create indexes for project_contributions op.create_index('ix_contributions_project', 'project_contributions', ['project_id', 'timestamp']) op.create_index('ix_contributions_contributor', 'project_contributions', ['contributor_id', 'timestamp']) op.create_index('ix_contributions_type', 'project_contributions', ['contribution_type']) # Create project_invitations table op.create_table('project_invitations', sa.Column('id', sa.String(255), primary_key=True, index=True), sa.Column('project_id', sa.String(255), sa.ForeignKey('creative_projects.id'), nullable=False), sa.Column('inviter_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('invitee_id', sa.Integer(), sa.ForeignKey('characters.id'), nullable=False), sa.Column('role_description', sa.String(200), default='collaborator'), sa.Column('invitation_message', sa.Text()), sa.Column('created_at', sa.DateTime(), server_default=sa.func.now()), sa.Column('expires_at', sa.DateTime(), nullable=False), sa.Column('status', sa.String(50), default='pending'), sa.Column('response_message', sa.Text()), sa.Column('responded_at', sa.DateTime()) ) # Create indexes for project_invitations op.create_index('ix_invitations_invitee', 'project_invitations', ['invitee_id', 'status']) op.create_index('ix_invitations_project', 'project_invitations', ['project_id', 'created_at']) def downgrade(): # Drop tables in reverse order op.drop_table('project_invitations') op.drop_table('project_contributions') op.drop_table('project_collaborators') op.drop_table('creative_projects')