From 263e411dacdc129bdce67d0a26cc8d578c777f68 Mon Sep 17 00:00:00 2001 From: Keane Chan Date: Fri, 7 Oct 2022 14:18:47 +0800 Subject: [PATCH] [resumes][feat] add resumeprofiles model --- .../20221007060537_add_resumes/migration.sql | 94 +++++++++++++++ apps/portal/prisma/schema.prisma | 112 ++++++++++-------- .../router/resumes-resume-user-router.ts | 13 +- 3 files changed, 168 insertions(+), 51 deletions(-) create mode 100644 apps/portal/prisma/migrations/20221007060537_add_resumes/migration.sql diff --git a/apps/portal/prisma/migrations/20221007060537_add_resumes/migration.sql b/apps/portal/prisma/migrations/20221007060537_add_resumes/migration.sql new file mode 100644 index 00000000..b21aaf01 --- /dev/null +++ b/apps/portal/prisma/migrations/20221007060537_add_resumes/migration.sql @@ -0,0 +1,94 @@ +-- CreateEnum +CREATE TYPE "ResumesSection" AS ENUM ('GENERAL', 'EDUCATION', 'EXPERIENCE', 'PROJECTS', 'SKILLS'); + +-- CreateTable +CREATE TABLE "ResumesProfile" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + + CONSTRAINT "ResumesProfile_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ResumesResume" ( + "id" TEXT NOT NULL, + "resumesProfileId" TEXT NOT NULL, + "title" TEXT NOT NULL, + "role" TEXT NOT NULL, + "experience" TEXT NOT NULL, + "location" TEXT NOT NULL, + "url" TEXT NOT NULL, + "additionalInfo" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ResumesResume_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ResumesStar" ( + "id" TEXT NOT NULL, + "resumesProfileId" TEXT NOT NULL, + "resumeId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ResumesStar_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ResumesComment" ( + "id" TEXT NOT NULL, + "resumesProfileId" TEXT NOT NULL, + "resumeId" TEXT NOT NULL, + "description" TEXT NOT NULL, + "section" "ResumesSection" NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ResumesComment_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ResumesCommentVote" ( + "id" TEXT NOT NULL, + "resumesProfileId" TEXT NOT NULL, + "commentId" TEXT NOT NULL, + "value" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ResumesCommentVote_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "ResumesProfile_userId_key" ON "ResumesProfile"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ResumesStar_resumeId_resumesProfileId_key" ON "ResumesStar"("resumeId", "resumesProfileId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ResumesCommentVote_commentId_resumesProfileId_key" ON "ResumesCommentVote"("commentId", "resumesProfileId"); + +-- AddForeignKey +ALTER TABLE "ResumesProfile" ADD CONSTRAINT "ResumesProfile_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ResumesResume" ADD CONSTRAINT "ResumesResume_resumesProfileId_fkey" FOREIGN KEY ("resumesProfileId") REFERENCES "ResumesProfile"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ResumesStar" ADD CONSTRAINT "ResumesStar_resumesProfileId_fkey" FOREIGN KEY ("resumesProfileId") REFERENCES "ResumesProfile"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ResumesStar" ADD CONSTRAINT "ResumesStar_resumeId_fkey" FOREIGN KEY ("resumeId") REFERENCES "ResumesResume"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ResumesComment" ADD CONSTRAINT "ResumesComment_resumesProfileId_fkey" FOREIGN KEY ("resumesProfileId") REFERENCES "ResumesProfile"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ResumesComment" ADD CONSTRAINT "ResumesComment_resumeId_fkey" FOREIGN KEY ("resumeId") REFERENCES "ResumesResume"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ResumesCommentVote" ADD CONSTRAINT "ResumesCommentVote_resumesProfileId_fkey" FOREIGN KEY ("resumesProfileId") REFERENCES "ResumesProfile"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ResumesCommentVote" ADD CONSTRAINT "ResumesCommentVote_commentId_fkey" FOREIGN KEY ("commentId") REFERENCES "ResumesComment"("id") ON DELETE CASCADE ON UPDATE CASCADE; \ No newline at end of file diff --git a/apps/portal/prisma/schema.prisma b/apps/portal/prisma/schema.prisma index 95c4381f..086eb2bc 100644 --- a/apps/portal/prisma/schema.prisma +++ b/apps/portal/prisma/schema.prisma @@ -37,18 +37,15 @@ model Session { } model User { - id String @id @default(cuid()) - name String? - email String? @unique - emailVerified DateTime? - image String? - accounts Account[] - sessions Session[] - todos Todo[] - resumesResumes ResumesResume[] - resumesStars ResumesStar[] - resumesComments ResumesComment[] - resumesCommentVotes ResumesCommentVote[] + id String @id @default(cuid()) + name String? + email String? @unique + emailVerified DateTime? + image String? + accounts Account[] + sessions Session[] + todos Todo[] + resumesProfile ResumesProfile? } model VerificationToken { @@ -88,45 +85,56 @@ model Company { // Add Resumes project models here, prefix all models with "Resumes", // use camelCase for field names, and try to name them consistently // across all models in this file. -// End of Resumes project models. + +model ResumesProfile { + id String @id @default(cuid()) + userId String @unique + resumesResumes ResumesResume[] + resumesStars ResumesStar[] + resumesComments ResumesComment[] + resumesCommentVotes ResumesCommentVote[] + user User @relation(fields: [userId], references: [id], onDelete: Cascade) +} model ResumesResume { - id String @id @default(cuid()) - userId String - title String @db.Text + id String @id @default(cuid()) + resumesProfileId String + title String @db.Text // TODO: Update role, experience, location to use Enums - role String @db.Text - experience String @db.Text - location String @db.Text - url String - additionalInfo String? @db.Text - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - stars ResumesStar[] - comments ResumesComment[] + role String @db.Text + experience String @db.Text + location String @db.Text + url String + additionalInfo String? @db.Text + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + resumesProfile ResumesProfile @relation(fields: [resumesProfileId], references: [id], onDelete: Cascade) + stars ResumesStar[] + comments ResumesComment[] } model ResumesStar { - id String @id @default(cuid()) - resumeId String - userId String - createdAt DateTime @default(now()) - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - resume ResumesResume @relation(fields: [resumeId], references: [id], onDelete: Cascade) + id String @id @default(cuid()) + resumesProfileId String + resumeId String + createdAt DateTime @default(now()) + resumesProfile ResumesProfile @relation(fields: [resumesProfileId], references: [id], onDelete: Cascade) + resume ResumesResume @relation(fields: [resumeId], references: [id], onDelete: Cascade) + + @@unique([resumeId, resumesProfileId]) } model ResumesComment { - id String @id @default(cuid()) - resumeId String - userId String - description String @db.Text - section ResumesSection - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - resume ResumesResume @relation(fields: [resumeId], references: [id], onDelete: Cascade) - votes ResumesCommentVote[] + id String @id @default(cuid()) + resumesProfileId String + resumeId String + description String @db.Text + section ResumesSection + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + resumesProfile ResumesProfile @relation(fields: [resumesProfileId], references: [id], onDelete: Cascade) + resume ResumesResume @relation(fields: [resumeId], references: [id], onDelete: Cascade) + votes ResumesCommentVote[] } enum ResumesSection { @@ -138,16 +146,20 @@ enum ResumesSection { } model ResumesCommentVote { - id String @id @default(cuid()) - commentId String - userId String - value Int - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - comment ResumesComment @relation(fields: [commentId], references: [id], onDelete: Cascade) + id String @id @default(cuid()) + resumesProfileId String + commentId String + value Int + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + resumesProfile ResumesProfile @relation(fields: [resumesProfileId], references: [id], onDelete: Cascade) + comment ResumesComment @relation(fields: [commentId], references: [id], onDelete: Cascade) + + @@unique([commentId, resumesProfileId]) } +// End of Resumes project models. + // Start of Offers project models. // Add Offers project models here, prefix all models with "Offer", // use camelCase for field names, and try to name them consistently diff --git a/apps/portal/src/server/router/resumes-resume-user-router.ts b/apps/portal/src/server/router/resumes-resume-user-router.ts index 3d47ee57..b4da7822 100644 --- a/apps/portal/src/server/router/resumes-resume-user-router.ts +++ b/apps/portal/src/server/router/resumes-resume-user-router.ts @@ -15,14 +15,25 @@ export const resumesResumeUserRouter = createProtectedRouter().mutation( }), async resolve({ ctx, input }) { const userId = ctx.session?.user.id; + const resumeProfile = await ctx.prisma.resumesProfile.upsert({ + create: { + userId, + }, + update: {}, + where: { + userId, + }, + }); // TODO: Store file in file storage and retrieve URL + await ctx.prisma.resumesResume.findMany; + return await ctx.prisma.resumesResume.create({ data: { ...input, + resumesProfileId: resumeProfile.id, url: '', - userId, }, }); },