diff --git a/prisma/migrations/20260422184304_init/migration.sql b/prisma/migrations/20260422184304_init/migration.sql deleted file mode 100644 index 829ece2..0000000 --- a/prisma/migrations/20260422184304_init/migration.sql +++ /dev/null @@ -1,171 +0,0 @@ --- CreateTable -CREATE TABLE "users" ( - "id" TEXT NOT NULL PRIMARY KEY, - "username" TEXT NOT NULL, - "password_hash" TEXT NOT NULL, - "is_demo" BOOLEAN NOT NULL DEFAULT false, - "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" DATETIME NOT NULL -); - --- CreateTable -CREATE TABLE "user_roles" ( - "id" TEXT NOT NULL PRIMARY KEY, - "user_id" TEXT NOT NULL, - "role" TEXT NOT NULL, - CONSTRAINT "user_roles_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "api_tokens" ( - "id" TEXT NOT NULL PRIMARY KEY, - "user_id" TEXT NOT NULL, - "token_hash" TEXT NOT NULL, - "label" TEXT, - "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "revoked_at" DATETIME, - CONSTRAINT "api_tokens_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "products" ( - "id" TEXT NOT NULL PRIMARY KEY, - "user_id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "description" TEXT, - "repo_url" TEXT, - "definition_of_done" TEXT NOT NULL, - "archived" BOOLEAN NOT NULL DEFAULT false, - "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" DATETIME NOT NULL, - CONSTRAINT "products_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "pbis" ( - "id" TEXT NOT NULL PRIMARY KEY, - "product_id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "priority" INTEGER NOT NULL, - "sort_order" REAL NOT NULL, - "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" DATETIME NOT NULL, - CONSTRAINT "pbis_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "stories" ( - "id" TEXT NOT NULL PRIMARY KEY, - "pbi_id" TEXT NOT NULL, - "product_id" TEXT NOT NULL, - "sprint_id" TEXT, - "title" TEXT NOT NULL, - "description" TEXT, - "acceptance_criteria" TEXT, - "priority" INTEGER NOT NULL, - "sort_order" REAL NOT NULL, - "status" TEXT NOT NULL DEFAULT 'OPEN', - "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" DATETIME NOT NULL, - CONSTRAINT "stories_pbi_id_fkey" FOREIGN KEY ("pbi_id") REFERENCES "pbis" ("id") ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT "stories_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, - CONSTRAINT "stories_sprint_id_fkey" FOREIGN KEY ("sprint_id") REFERENCES "sprints" ("id") ON DELETE SET NULL ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "story_logs" ( - "id" TEXT NOT NULL PRIMARY KEY, - "story_id" TEXT NOT NULL, - "type" TEXT NOT NULL, - "content" TEXT NOT NULL, - "status" TEXT, - "commit_hash" TEXT, - "commit_message" TEXT, - "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT "story_logs_story_id_fkey" FOREIGN KEY ("story_id") REFERENCES "stories" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "sprints" ( - "id" TEXT NOT NULL PRIMARY KEY, - "product_id" TEXT NOT NULL, - "sprint_goal" TEXT NOT NULL, - "status" TEXT NOT NULL DEFAULT 'ACTIVE', - "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "completed_at" DATETIME, - CONSTRAINT "sprints_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "tasks" ( - "id" TEXT NOT NULL PRIMARY KEY, - "story_id" TEXT NOT NULL, - "sprint_id" TEXT, - "title" TEXT NOT NULL, - "description" TEXT, - "priority" INTEGER NOT NULL, - "sort_order" REAL NOT NULL, - "status" TEXT NOT NULL DEFAULT 'TO_DO', - "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" DATETIME NOT NULL, - CONSTRAINT "tasks_story_id_fkey" FOREIGN KEY ("story_id") REFERENCES "stories" ("id") ON DELETE CASCADE ON UPDATE CASCADE, - CONSTRAINT "tasks_sprint_id_fkey" FOREIGN KEY ("sprint_id") REFERENCES "sprints" ("id") ON DELETE SET NULL ON UPDATE CASCADE -); - --- CreateTable -CREATE TABLE "todos" ( - "id" TEXT NOT NULL PRIMARY KEY, - "user_id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "done" BOOLEAN NOT NULL DEFAULT false, - "archived" BOOLEAN NOT NULL DEFAULT false, - "created_at" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updated_at" DATETIME NOT NULL, - CONSTRAINT "todos_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users" ("id") ON DELETE CASCADE ON UPDATE CASCADE -); - --- CreateIndex -CREATE UNIQUE INDEX "users_username_key" ON "users"("username"); - --- CreateIndex -CREATE UNIQUE INDEX "user_roles_user_id_role_key" ON "user_roles"("user_id", "role"); - --- CreateIndex -CREATE UNIQUE INDEX "api_tokens_token_hash_key" ON "api_tokens"("token_hash"); - --- CreateIndex -CREATE INDEX "api_tokens_token_hash_idx" ON "api_tokens"("token_hash"); - --- CreateIndex -CREATE INDEX "products_user_id_archived_idx" ON "products"("user_id", "archived"); - --- CreateIndex -CREATE UNIQUE INDEX "products_user_id_name_key" ON "products"("user_id", "name"); - --- CreateIndex -CREATE INDEX "pbis_product_id_priority_sort_order_idx" ON "pbis"("product_id", "priority", "sort_order"); - --- CreateIndex -CREATE INDEX "stories_pbi_id_priority_sort_order_idx" ON "stories"("pbi_id", "priority", "sort_order"); - --- CreateIndex -CREATE INDEX "stories_sprint_id_sort_order_idx" ON "stories"("sprint_id", "sort_order"); - --- CreateIndex -CREATE INDEX "stories_product_id_status_idx" ON "stories"("product_id", "status"); - --- CreateIndex -CREATE INDEX "story_logs_story_id_created_at_idx" ON "story_logs"("story_id", "created_at"); - --- CreateIndex -CREATE INDEX "sprints_product_id_status_idx" ON "sprints"("product_id", "status"); - --- CreateIndex -CREATE INDEX "tasks_story_id_priority_sort_order_idx" ON "tasks"("story_id", "priority", "sort_order"); - --- CreateIndex -CREATE INDEX "tasks_sprint_id_status_idx" ON "tasks"("sprint_id", "status"); - --- CreateIndex -CREATE INDEX "todos_user_id_done_archived_idx" ON "todos"("user_id", "done", "archived"); diff --git a/prisma/migrations/20260424123750_init/migration.sql b/prisma/migrations/20260424123750_init/migration.sql new file mode 100644 index 0000000..e204fd2 --- /dev/null +++ b/prisma/migrations/20260424123750_init/migration.sql @@ -0,0 +1,233 @@ +-- CreateEnum +CREATE TYPE "Role" AS ENUM ('PRODUCT_OWNER', 'SCRUM_MASTER', 'DEVELOPER'); + +-- CreateEnum +CREATE TYPE "StoryStatus" AS ENUM ('OPEN', 'IN_SPRINT', 'DONE'); + +-- CreateEnum +CREATE TYPE "TaskStatus" AS ENUM ('TO_DO', 'IN_PROGRESS', 'DONE'); + +-- CreateEnum +CREATE TYPE "LogType" AS ENUM ('IMPLEMENTATION_PLAN', 'TEST_RESULT', 'COMMIT'); + +-- CreateEnum +CREATE TYPE "TestStatus" AS ENUM ('PASSED', 'FAILED'); + +-- CreateEnum +CREATE TYPE "SprintStatus" AS ENUM ('ACTIVE', 'COMPLETED'); + +-- CreateTable +CREATE TABLE "users" ( + "id" TEXT NOT NULL, + "username" TEXT NOT NULL, + "password_hash" TEXT NOT NULL, + "is_demo" BOOLEAN NOT NULL DEFAULT false, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "users_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "user_roles" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "role" "Role" NOT NULL, + + CONSTRAINT "user_roles_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "api_tokens" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "token_hash" TEXT NOT NULL, + "label" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "revoked_at" TIMESTAMP(3), + + CONSTRAINT "api_tokens_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "products" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT, + "repo_url" TEXT, + "definition_of_done" TEXT NOT NULL, + "archived" BOOLEAN NOT NULL DEFAULT false, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "products_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "pbis" ( + "id" TEXT NOT NULL, + "product_id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "priority" INTEGER NOT NULL, + "sort_order" DOUBLE PRECISION NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "pbis_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "stories" ( + "id" TEXT NOT NULL, + "pbi_id" TEXT NOT NULL, + "product_id" TEXT NOT NULL, + "sprint_id" TEXT, + "title" TEXT NOT NULL, + "description" TEXT, + "acceptance_criteria" TEXT, + "priority" INTEGER NOT NULL, + "sort_order" DOUBLE PRECISION NOT NULL, + "status" "StoryStatus" NOT NULL DEFAULT 'OPEN', + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "stories_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "story_logs" ( + "id" TEXT NOT NULL, + "story_id" TEXT NOT NULL, + "type" "LogType" NOT NULL, + "content" TEXT NOT NULL, + "status" "TestStatus", + "commit_hash" TEXT, + "commit_message" TEXT, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "story_logs_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "sprints" ( + "id" TEXT NOT NULL, + "product_id" TEXT NOT NULL, + "sprint_goal" TEXT NOT NULL, + "status" "SprintStatus" NOT NULL DEFAULT 'ACTIVE', + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "completed_at" TIMESTAMP(3), + + CONSTRAINT "sprints_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "tasks" ( + "id" TEXT NOT NULL, + "story_id" TEXT NOT NULL, + "sprint_id" TEXT, + "title" TEXT NOT NULL, + "description" TEXT, + "priority" INTEGER NOT NULL, + "sort_order" DOUBLE PRECISION NOT NULL, + "status" "TaskStatus" NOT NULL DEFAULT 'TO_DO', + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "tasks_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "todos" ( + "id" TEXT NOT NULL, + "user_id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "done" BOOLEAN NOT NULL DEFAULT false, + "archived" BOOLEAN NOT NULL DEFAULT false, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "todos_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "users_username_key" ON "users"("username"); + +-- CreateIndex +CREATE UNIQUE INDEX "user_roles_user_id_role_key" ON "user_roles"("user_id", "role"); + +-- CreateIndex +CREATE UNIQUE INDEX "api_tokens_token_hash_key" ON "api_tokens"("token_hash"); + +-- CreateIndex +CREATE INDEX "api_tokens_token_hash_idx" ON "api_tokens"("token_hash"); + +-- CreateIndex +CREATE INDEX "products_user_id_archived_idx" ON "products"("user_id", "archived"); + +-- CreateIndex +CREATE UNIQUE INDEX "products_user_id_name_key" ON "products"("user_id", "name"); + +-- CreateIndex +CREATE INDEX "pbis_product_id_priority_sort_order_idx" ON "pbis"("product_id", "priority", "sort_order"); + +-- CreateIndex +CREATE INDEX "stories_pbi_id_priority_sort_order_idx" ON "stories"("pbi_id", "priority", "sort_order"); + +-- CreateIndex +CREATE INDEX "stories_sprint_id_sort_order_idx" ON "stories"("sprint_id", "sort_order"); + +-- CreateIndex +CREATE INDEX "stories_product_id_status_idx" ON "stories"("product_id", "status"); + +-- CreateIndex +CREATE INDEX "story_logs_story_id_created_at_idx" ON "story_logs"("story_id", "created_at"); + +-- CreateIndex +CREATE INDEX "sprints_product_id_status_idx" ON "sprints"("product_id", "status"); + +-- CreateIndex +CREATE INDEX "tasks_story_id_priority_sort_order_idx" ON "tasks"("story_id", "priority", "sort_order"); + +-- CreateIndex +CREATE INDEX "tasks_sprint_id_status_idx" ON "tasks"("sprint_id", "status"); + +-- CreateIndex +CREATE INDEX "todos_user_id_done_archived_idx" ON "todos"("user_id", "done", "archived"); + +-- AddForeignKey +ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "api_tokens" ADD CONSTRAINT "api_tokens_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "products" ADD CONSTRAINT "products_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "pbis" ADD CONSTRAINT "pbis_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "stories" ADD CONSTRAINT "stories_pbi_id_fkey" FOREIGN KEY ("pbi_id") REFERENCES "pbis"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "stories" ADD CONSTRAINT "stories_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "stories" ADD CONSTRAINT "stories_sprint_id_fkey" FOREIGN KEY ("sprint_id") REFERENCES "sprints"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "story_logs" ADD CONSTRAINT "story_logs_story_id_fkey" FOREIGN KEY ("story_id") REFERENCES "stories"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "sprints" ADD CONSTRAINT "sprints_product_id_fkey" FOREIGN KEY ("product_id") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "tasks" ADD CONSTRAINT "tasks_story_id_fkey" FOREIGN KEY ("story_id") REFERENCES "stories"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "tasks" ADD CONSTRAINT "tasks_sprint_id_fkey" FOREIGN KEY ("sprint_id") REFERENCES "sprints"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "todos" ADD CONSTRAINT "todos_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml index 2a5a444..044d57c 100644 --- a/prisma/migrations/migration_lock.toml +++ b/prisma/migrations/migration_lock.toml @@ -1,3 +1,3 @@ # Please do not edit this file manually # It should be added in your version-control system (e.g., Git) -provider = "sqlite" +provider = "postgresql"