- Fixed 'relation session_kb_associations does not exist' error in core consolidated migration. - Renamed migration directories from timestamp-based to version-based (6.0.x, 6.1.x, 6.2.x). - Reorganized migrations into dedicated feature folders (products, dashboards, learn, video). - Updated migration execution order in core/shared/utils.rs. - Moves legacy migrations to 6.0.x/6.1.x and workflow to 6.2.0.
81 lines
3.5 KiB
SQL
81 lines
3.5 KiB
SQL
-- Legacy Tasks Tables extracted from consolidated
|
|
|
|
-- Core tasks table
|
|
CREATE TABLE IF NOT EXISTS tasks (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
title TEXT NOT NULL,
|
|
description TEXT,
|
|
status TEXT NOT NULL DEFAULT 'todo',
|
|
priority TEXT NOT NULL DEFAULT 'medium',
|
|
assignee_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
reporter_id UUID REFERENCES users(id) ON DELETE SET NULL,
|
|
project_id UUID,
|
|
due_date TIMESTAMPTZ,
|
|
tags TEXT[] DEFAULT '{}',
|
|
dependencies UUID[] DEFAULT '{}',
|
|
estimated_hours FLOAT8,
|
|
actual_hours FLOAT8,
|
|
progress INT DEFAULT 0,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
completed_at TIMESTAMPTZ,
|
|
CONSTRAINT check_task_status CHECK (status IN ('todo', 'in_progress', 'review', 'blocked', 'on_hold', 'done', 'completed', 'cancelled')),
|
|
CONSTRAINT check_task_priority CHECK (priority IN ('low', 'medium', 'high', 'urgent'))
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_tasks_assignee ON tasks(assignee_id);
|
|
CREATE INDEX IF NOT EXISTS idx_tasks_reporter ON tasks(reporter_id);
|
|
CREATE INDEX IF NOT EXISTS idx_tasks_project ON tasks(project_id);
|
|
CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status);
|
|
CREATE INDEX IF NOT EXISTS idx_tasks_due_date ON tasks(due_date);
|
|
CREATE INDEX IF NOT EXISTS idx_tasks_created ON tasks(created_at);
|
|
|
|
-- Task dependencies
|
|
CREATE TABLE IF NOT EXISTS task_dependencies (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
task_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
depends_on_task_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
dependency_type VARCHAR(20) DEFAULT 'finish_to_start',
|
|
lag_days INTEGER DEFAULT 0,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
CONSTRAINT check_dependency_type CHECK (dependency_type IN ('finish_to_start', 'start_to_start', 'finish_to_finish', 'start_to_finish')),
|
|
CONSTRAINT unique_task_dependency UNIQUE (task_id, depends_on_task_id)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_task_dependencies_task ON task_dependencies(task_id);
|
|
CREATE INDEX IF NOT EXISTS idx_task_dependencies_depends ON task_dependencies(depends_on_task_id);
|
|
|
|
-- Task time tracking
|
|
CREATE TABLE IF NOT EXISTS task_time_entries (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
task_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
description TEXT,
|
|
started_at TIMESTAMPTZ NOT NULL,
|
|
ended_at TIMESTAMPTZ,
|
|
duration_minutes INTEGER,
|
|
is_billable BOOLEAN DEFAULT false,
|
|
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_task_time_task ON task_time_entries(task_id);
|
|
CREATE INDEX IF NOT EXISTS idx_task_time_user ON task_time_entries(user_id, started_at);
|
|
|
|
-- Task recurring rules
|
|
CREATE TABLE IF NOT EXISTS task_recurrence (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
task_template_id UUID NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
|
|
recurrence_pattern VARCHAR(20) NOT NULL,
|
|
interval_value INTEGER DEFAULT 1,
|
|
days_of_week_json TEXT,
|
|
day_of_month INTEGER,
|
|
month_of_year INTEGER,
|
|
end_date TIMESTAMPTZ,
|
|
occurrence_count INTEGER,
|
|
next_occurrence TIMESTAMPTZ,
|
|
is_active BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
CONSTRAINT check_recurrence CHECK (recurrence_pattern IN ('daily', 'weekly', 'monthly', 'yearly', 'custom'))
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_task_recurrence_next ON task_recurrence(next_occurrence) WHERE is_active = true;
|