-- CreateTable CREATE TABLE "users" ( "id" UUID NOT NULL, "email" TEXT NOT NULL, "password_hash" TEXT NOT NULL, "name" TEXT NOT NULL, CONSTRAINT "users_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "projects" ( "id" UUID NOT NULL, "title" TEXT NOT NULL, "slug" TEXT NOT NULL, "description" TEXT NOT NULL, "image_url" TEXT, "repo_url" TEXT, "live_url" TEXT, "category" TEXT NOT NULL, "is_published" BOOLEAN NOT NULL DEFAULT false, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "projects_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "skills" ( "id" UUID NOT NULL, "name" TEXT NOT NULL, "icon_name" TEXT, "category" TEXT NOT NULL, CONSTRAINT "skills_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "project_skills" ( "project_id" UUID NOT NULL, "skill_id" UUID NOT NULL, CONSTRAINT "project_skills_pkey" PRIMARY KEY ("project_id","skill_id") ); -- CreateTable CREATE TABLE "messages" ( "id" UUID NOT NULL, "sender_name" TEXT NOT NULL, "sender_email" TEXT NOT NULL, "content" TEXT NOT NULL, "is_read" BOOLEAN NOT NULL DEFAULT false, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "messages_pkey" PRIMARY KEY ("id") ); -- CreateTable CREATE TABLE "experiences" ( "id" UUID NOT NULL, "year" TEXT NOT NULL, "title" TEXT NOT NULL, "company" TEXT NOT NULL, "description" TEXT NOT NULL, "achievements" JSONB NOT NULL DEFAULT '[]', "order" INTEGER NOT NULL DEFAULT 0, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "experiences_pkey" PRIMARY KEY ("id") ); -- CreateIndex CREATE UNIQUE INDEX "users_email_key" ON "users"("email"); -- CreateIndex CREATE UNIQUE INDEX "projects_slug_key" ON "projects"("slug"); -- AddForeignKey ALTER TABLE "project_skills" ADD CONSTRAINT "project_skills_project_id_fkey" FOREIGN KEY ("project_id") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "project_skills" ADD CONSTRAINT "project_skills_skill_id_fkey" FOREIGN KEY ("skill_id") REFERENCES "skills"("id") ON DELETE CASCADE ON UPDATE CASCADE;