From 2e947f5fb056dedc7c72bf438d0f247c8ccfdcd1 Mon Sep 17 00:00:00 2001 From: Peirong <35712975+peironggg@users.noreply.github.com> Date: Fri, 7 Oct 2022 23:33:24 +0800 Subject: [PATCH] [resumes][feat] Fetch resume details from database (#322) * [resumes][feat] Add resume details router * [resumes][feat] Change review page to dynamic routing * [resumes][feat] Toggle resume star button * [resumes][refactor] Revert routers to User model --- apps/portal/package.json | 1 + .../migration.sql | 73 +++++++++ apps/portal/prisma/schema.prisma | 110 ++++++------- .../src/components/resumes/ResumePdf.tsx | 8 +- apps/portal/src/pages/resumes/[resumeId].tsx | 148 ++++++++++++++++++ apps/portal/src/pages/resumes/review.tsx | 82 ---------- apps/portal/src/server/router/index.ts | 2 + .../server/router/resumes-details-router.ts | 79 ++++++++++ .../router/resumes-resume-user-router.ts | 13 +- .../server/router/resumes-reviews-router.ts | 25 +-- .../router/resumes-reviews-user-router.ts | 15 +- yarn.lock | 2 +- 12 files changed, 371 insertions(+), 187 deletions(-) create mode 100644 apps/portal/prisma/migrations/20221007135344_remove_resumes_profile_model/migration.sql create mode 100644 apps/portal/src/pages/resumes/[resumeId].tsx delete mode 100644 apps/portal/src/pages/resumes/review.tsx create mode 100644 apps/portal/src/server/router/resumes-details-router.ts diff --git a/apps/portal/package.json b/apps/portal/package.json index d57cdf43..9948c01e 100644 --- a/apps/portal/package.json +++ b/apps/portal/package.json @@ -22,6 +22,7 @@ "@trpc/react": "^9.27.2", "@trpc/server": "^9.27.2", "clsx": "^1.2.1", + "date-fns": "^2.29.3", "next": "12.3.1", "next-auth": "~4.10.3", "react": "18.2.0", diff --git a/apps/portal/prisma/migrations/20221007135344_remove_resumes_profile_model/migration.sql b/apps/portal/prisma/migrations/20221007135344_remove_resumes_profile_model/migration.sql new file mode 100644 index 00000000..5b9baead --- /dev/null +++ b/apps/portal/prisma/migrations/20221007135344_remove_resumes_profile_model/migration.sql @@ -0,0 +1,73 @@ +/* + Warnings: + + - You are about to drop the column `resumesProfileId` on the `ResumesComment` table. All the data in the column will be lost. + - You are about to drop the column `resumesProfileId` on the `ResumesCommentVote` table. All the data in the column will be lost. + - You are about to drop the column `resumesProfileId` on the `ResumesResume` table. All the data in the column will be lost. + - You are about to drop the column `resumesProfileId` on the `ResumesStar` table. All the data in the column will be lost. + - You are about to drop the `ResumesProfile` table. If the table is not empty, all the data it contains will be lost. + - A unique constraint covering the columns `[userId,commentId]` on the table `ResumesCommentVote` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[userId,resumeId]` on the table `ResumesStar` will be added. If there are existing duplicate values, this will fail. + - Added the required column `userId` to the `ResumesComment` table without a default value. This is not possible if the table is not empty. + - Added the required column `userId` to the `ResumesCommentVote` table without a default value. This is not possible if the table is not empty. + - Added the required column `userId` to the `ResumesResume` table without a default value. This is not possible if the table is not empty. + - Added the required column `userId` to the `ResumesStar` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropForeignKey +ALTER TABLE "ResumesComment" DROP CONSTRAINT "ResumesComment_resumesProfileId_fkey"; + +-- DropForeignKey +ALTER TABLE "ResumesCommentVote" DROP CONSTRAINT "ResumesCommentVote_resumesProfileId_fkey"; + +-- DropForeignKey +ALTER TABLE "ResumesProfile" DROP CONSTRAINT "ResumesProfile_userId_fkey"; + +-- DropForeignKey +ALTER TABLE "ResumesResume" DROP CONSTRAINT "ResumesResume_resumesProfileId_fkey"; + +-- DropForeignKey +ALTER TABLE "ResumesStar" DROP CONSTRAINT "ResumesStar_resumesProfileId_fkey"; + +-- DropIndex +DROP INDEX "ResumesCommentVote_commentId_resumesProfileId_key"; + +-- DropIndex +DROP INDEX "ResumesStar_resumeId_resumesProfileId_key"; + +-- AlterTable +ALTER TABLE "ResumesComment" DROP COLUMN "resumesProfileId", +ADD COLUMN "userId" TEXT NOT NULL; + +-- AlterTable +ALTER TABLE "ResumesCommentVote" DROP COLUMN "resumesProfileId", +ADD COLUMN "userId" TEXT NOT NULL; + +-- AlterTable +ALTER TABLE "ResumesResume" DROP COLUMN "resumesProfileId", +ADD COLUMN "userId" TEXT NOT NULL; + +-- AlterTable +ALTER TABLE "ResumesStar" DROP COLUMN "resumesProfileId", +ADD COLUMN "userId" TEXT NOT NULL; + +-- DropTable +DROP TABLE "ResumesProfile"; + +-- CreateIndex +CREATE UNIQUE INDEX "ResumesCommentVote_userId_commentId_key" ON "ResumesCommentVote"("userId", "commentId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ResumesStar_userId_resumeId_key" ON "ResumesStar"("userId", "resumeId"); + +-- AddForeignKey +ALTER TABLE "ResumesResume" ADD CONSTRAINT "ResumesResume_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ResumesStar" ADD CONSTRAINT "ResumesStar_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ResumesComment" ADD CONSTRAINT "ResumesComment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ResumesCommentVote" ADD CONSTRAINT "ResumesCommentVote_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/portal/prisma/schema.prisma b/apps/portal/prisma/schema.prisma index 086eb2bc..7ece9c5d 100644 --- a/apps/portal/prisma/schema.prisma +++ b/apps/portal/prisma/schema.prisma @@ -37,15 +37,18 @@ model Session { } model User { - id String @id @default(cuid()) - name String? - email String? @unique - emailVerified DateTime? - image String? - accounts Account[] - sessions Session[] - todos Todo[] - resumesProfile ResumesProfile? + 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[] } model VerificationToken { @@ -85,56 +88,45 @@ 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. - -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()) - resumesProfileId String - title String @db.Text + id String @id @default(cuid()) + userId 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 - resumesProfile ResumesProfile @relation(fields: [resumesProfileId], 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 + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + stars ResumesStar[] + comments ResumesComment[] } model ResumesStar { - 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) + id String @id @default(cuid()) + userId String + resumeId String + createdAt DateTime @default(now()) + resume ResumesResume @relation(fields: [resumeId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) - @@unique([resumeId, resumesProfileId]) + @@unique([userId, resumeId]) } model ResumesComment { - 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[] + id String @id @default(cuid()) + userId String + resumeId String + description String @db.Text + section ResumesSection + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + resume ResumesResume @relation(fields: [resumeId], references: [id], onDelete: Cascade) + votes ResumesCommentVote[] + user User @relation(fields: [userId], references: [id], onDelete: Cascade) } enum ResumesSection { @@ -146,16 +138,16 @@ enum ResumesSection { } model ResumesCommentVote { - 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) + id String @id @default(cuid()) + userId String + commentId String + value Int + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + comment ResumesComment @relation(fields: [commentId], references: [id], onDelete: Cascade) + user User @relation(fields: [userId], references: [id], onDelete: Cascade) - @@unique([commentId, resumesProfileId]) + @@unique([userId, commentId]) } // End of Resumes project models. diff --git a/apps/portal/src/components/resumes/ResumePdf.tsx b/apps/portal/src/components/resumes/ResumePdf.tsx index 12debea4..82e26395 100644 --- a/apps/portal/src/components/resumes/ResumePdf.tsx +++ b/apps/portal/src/components/resumes/ResumePdf.tsx @@ -6,7 +6,11 @@ import { Button, Spinner } from '@tih/ui'; pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.min.js`; -export default function ResumePdf() { +type Props = Readonly<{ + url: string; +}>; + +export default function ResumePdf({ url }: Props) { const [numPages, setNumPages] = useState(0); const [pageNumber] = useState(1); @@ -18,7 +22,7 @@ export default function ResumePdf() {