-- Guided-tour scenarios, their steps, the catalogue of valid highlight -- targets, and per-user "seen" progress. All four tables are new — plain -- CREATEs, nothing to backfill. See issues #42 (the tour engine) and #44 -- (admin CRUD + the DB-backed model this migration implements, which -- revises #42's originally-planned in-code registry). -- CreateTable CREATE TABLE "tour_target" ( "key" TEXT NOT NULL, "description" TEXT NOT NULL, CONSTRAINT "tour_target_pkey" PRIMARY KEY ("key") ); -- CreateTable CREATE TABLE "tour_scenario" ( "id" SERIAL NOT NULL, "key" TEXT NOT NULL, "name" TEXT NOT NULL, "enabled" BOOLEAN NOT NULL DEFAULT true, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL, CONSTRAINT "tour_scenario_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "tour_scenario_step" ( "id" SERIAL NOT NULL, "scenario_id" INTEGER NOT NULL, "order" INTEGER NOT NULL, "route" TEXT, "target_key" TEXT NOT NULL, "title" TEXT NOT NULL, "content" TEXT NOT NULL, CONSTRAINT "tour_scenario_step_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "tour_progress" ( "user_profile_id" INTEGER NOT NULL, "scenario_id" INTEGER NOT NULL, "completed_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "tour_progress_pkey" PRIMARY KEY ("user_profile_id","scenario_id") ); -- CreateIndex CREATE UNIQUE INDEX "tour_scenario_key_key" ON "tour_scenario"("key"); -- CreateIndex CREATE UNIQUE INDEX "tour_scenario_step_scenario_id_order_key" ON "tour_scenario_step"("scenario_id", "order"); -- AddForeignKey ALTER TABLE "tour_scenario_step" ADD CONSTRAINT "tour_scenario_step_scenario_id_fkey" FOREIGN KEY ("scenario_id") REFERENCES "tour_scenario"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "tour_scenario_step" ADD CONSTRAINT "tour_scenario_step_target_key_fkey" FOREIGN KEY ("target_key") REFERENCES "tour_target"("key") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "tour_progress" ADD CONSTRAINT "tour_progress_user_profile_id_fkey" FOREIGN KEY ("user_profile_id") REFERENCES "user_profiles"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "tour_progress" ADD CONSTRAINT "tour_progress_scenario_id_fkey" FOREIGN KEY ("scenario_id") REFERENCES "tour_scenario"("id") ON DELETE CASCADE ON UPDATE CASCADE;