"""create tasks table Revision ID: 0002 Revises: 0001 Create Date: 2025-01-01 00:00:00.000000 """ from alembic import op revision = "0002" down_revision = "0001" branch_labels = None depends_on = None def upgrade() -> None: op.execute(""" DO $$ BEGIN CREATE TYPE task_status AS ENUM ('todo', 'in_progress', 'done'); EXCEPTION WHEN duplicate_object THEN null; END $$ """) op.execute(""" DO $$ BEGIN CREATE TYPE task_priority AS ENUM ('none', 'low', 'medium', 'high'); EXCEPTION WHEN duplicate_object THEN null; END $$ """) op.execute(""" CREATE TABLE IF NOT EXISTS tasks ( id SERIAL PRIMARY KEY, title TEXT NOT NULL DEFAULT '', description TEXT NOT NULL DEFAULT '', status task_status NOT NULL DEFAULT 'todo', priority task_priority NOT NULL DEFAULT 'none', due_date DATE, note_id INTEGER REFERENCES notes(id) ON DELETE SET NULL, tags TEXT[] NOT NULL DEFAULT '{}', created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ) """) op.execute("CREATE INDEX IF NOT EXISTS ix_tasks_tags ON tasks USING gin (tags)") op.execute("CREATE INDEX IF NOT EXISTS ix_tasks_note_id ON tasks (note_id)") op.execute("CREATE INDEX IF NOT EXISTS ix_tasks_status ON tasks (status)") def downgrade() -> None: op.execute("DROP INDEX IF EXISTS ix_tasks_status") op.execute("DROP INDEX IF EXISTS ix_tasks_note_id") op.execute("DROP INDEX IF EXISTS ix_tasks_tags") op.execute("DROP TABLE IF EXISTS tasks") op.execute("DROP TYPE IF EXISTS task_priority") op.execute("DROP TYPE IF EXISTS task_status")