The NestJS API serves the public profile through Apollo Sandbox and loads only the relations selected by the query.
207 lines
6.4 KiB
SQL
207 lines
6.4 KiB
SQL
-- CreateSchema
|
|
CREATE SCHEMA IF NOT EXISTS "public";
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "LinkKind" AS ENUM ('GITHUB', 'WEBSITE', 'TELEGRAM', 'EMAIL', 'PHONE');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "SkillGroup" AS ENUM ('LANGUAGE', 'BACKEND', 'FRONTEND', 'MOBILE', 'DATA', 'SYSTEMS');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "ProjectStatus" AS ENUM ('ACTIVE', 'COMPLETED', 'PROTOTYPE');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Profile" (
|
|
"id" TEXT NOT NULL,
|
|
"slug" TEXT NOT NULL,
|
|
"contentHash" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"description" TEXT NOT NULL,
|
|
"location" TEXT NOT NULL,
|
|
"availability" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Profile_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Link" (
|
|
"id" TEXT NOT NULL,
|
|
"profileId" TEXT NOT NULL,
|
|
"kind" "LinkKind" NOT NULL,
|
|
"label" TEXT NOT NULL,
|
|
"url" TEXT NOT NULL,
|
|
"sortOrder" INTEGER NOT NULL,
|
|
|
|
CONSTRAINT "Link_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Skill" (
|
|
"id" TEXT NOT NULL,
|
|
"profileId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"group" "SkillGroup" NOT NULL,
|
|
"sortOrder" INTEGER NOT NULL,
|
|
|
|
CONSTRAINT "Skill_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Experience" (
|
|
"id" TEXT NOT NULL,
|
|
"profileId" TEXT NOT NULL,
|
|
"company" TEXT NOT NULL,
|
|
"position" TEXT NOT NULL,
|
|
"startYear" INTEGER NOT NULL,
|
|
"endYear" INTEGER,
|
|
"summary" TEXT NOT NULL,
|
|
"sortOrder" INTEGER NOT NULL,
|
|
|
|
CONSTRAINT "Experience_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Achievement" (
|
|
"id" TEXT NOT NULL,
|
|
"experienceId" TEXT NOT NULL,
|
|
"description" TEXT NOT NULL,
|
|
"sortOrder" INTEGER NOT NULL,
|
|
|
|
CONSTRAINT "Achievement_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Project" (
|
|
"id" TEXT NOT NULL,
|
|
"profileId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"url" TEXT,
|
|
"description" TEXT NOT NULL,
|
|
"role" TEXT,
|
|
"status" "ProjectStatus",
|
|
"startYear" INTEGER,
|
|
"endYear" INTEGER,
|
|
"sortOrder" INTEGER NOT NULL,
|
|
|
|
CONSTRAINT "Project_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ProjectHighlight" (
|
|
"id" TEXT NOT NULL,
|
|
"projectId" TEXT NOT NULL,
|
|
"text" TEXT NOT NULL,
|
|
"sortOrder" INTEGER NOT NULL,
|
|
|
|
CONSTRAINT "ProjectHighlight_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ProjectSkill" (
|
|
"projectId" TEXT NOT NULL,
|
|
"skillId" TEXT NOT NULL,
|
|
|
|
CONSTRAINT "ProjectSkill_pkey" PRIMARY KEY ("projectId","skillId")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Education" (
|
|
"id" TEXT NOT NULL,
|
|
"profileId" TEXT NOT NULL,
|
|
"institution" TEXT NOT NULL,
|
|
"specialty" TEXT NOT NULL,
|
|
"specialtyCode" TEXT NOT NULL,
|
|
"graduatedYear" INTEGER NOT NULL,
|
|
|
|
CONSTRAINT "Education_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Award" (
|
|
"id" TEXT NOT NULL,
|
|
"profileId" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"result" TEXT NOT NULL,
|
|
"year" INTEGER,
|
|
"url" TEXT,
|
|
"sortOrder" INTEGER NOT NULL,
|
|
|
|
CONSTRAINT "Award_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Profile_slug_key" ON "Profile"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Link_profileId_sortOrder_idx" ON "Link"("profileId", "sortOrder");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Skill_profileId_sortOrder_idx" ON "Skill"("profileId", "sortOrder");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Skill_profileId_name_key" ON "Skill"("profileId", "name");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Experience_profileId_sortOrder_idx" ON "Experience"("profileId", "sortOrder");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Achievement_experienceId_sortOrder_idx" ON "Achievement"("experienceId", "sortOrder");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Project_profileId_sortOrder_idx" ON "Project"("profileId", "sortOrder");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ProjectHighlight_projectId_sortOrder_idx" ON "ProjectHighlight"("projectId", "sortOrder");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ProjectSkill_skillId_idx" ON "ProjectSkill"("skillId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Education_profileId_key" ON "Education"("profileId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Award_profileId_sortOrder_idx" ON "Award"("profileId", "sortOrder");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Link" ADD CONSTRAINT "Link_profileId_fkey" FOREIGN KEY ("profileId") REFERENCES "Profile"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Skill" ADD CONSTRAINT "Skill_profileId_fkey" FOREIGN KEY ("profileId") REFERENCES "Profile"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Experience" ADD CONSTRAINT "Experience_profileId_fkey" FOREIGN KEY ("profileId") REFERENCES "Profile"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Achievement" ADD CONSTRAINT "Achievement_experienceId_fkey" FOREIGN KEY ("experienceId") REFERENCES "Experience"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Project" ADD CONSTRAINT "Project_profileId_fkey" FOREIGN KEY ("profileId") REFERENCES "Profile"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ProjectHighlight" ADD CONSTRAINT "ProjectHighlight_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ProjectSkill" ADD CONSTRAINT "ProjectSkill_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ProjectSkill" ADD CONSTRAINT "ProjectSkill_skillId_fkey" FOREIGN KEY ("skillId") REFERENCES "Skill"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Education" ADD CONSTRAINT "Education_profileId_fkey" FOREIGN KEY ("profileId") REFERENCES "Profile"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Award" ADD CONSTRAINT "Award_profileId_fkey" FOREIGN KEY ("profileId") REFERENCES "Profile"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- Periods are stored as years. An end year cannot precede the start year.
|
|
ALTER TABLE "Experience" ADD CONSTRAINT "Experience_period_check" CHECK ("endYear" IS NULL OR "endYear" >= "startYear");
|
|
|
|
ALTER TABLE "Project" ADD CONSTRAINT "Project_period_check" CHECK (
|
|
("startYear" IS NULL AND "endYear" IS NULL)
|
|
OR ("startYear" IS NOT NULL AND ("endYear" IS NULL OR "endYear" >= "startYear"))
|
|
);
|
|
|
|
ALTER TABLE "Education" ADD CONSTRAINT "Education_year_check" CHECK ("graduatedYear" BETWEEN 1950 AND 2100);
|