mirror of
https://github.com/yangshun/tech-interview-handbook.git
synced 2025-07-28 20:52:00 +08:00
[questions][feat] add questions models (#323)
* [questions] [feat] add questions models * [questions][feat] add question types * [questions][chore] update schema naming scheme * [questions][chore] update naming scheme * [questions][chore] updating naming scheme * [questions][feat] add location, role and comapny * [questions][feat] update vote enum
This commit is contained in:
@ -0,0 +1,171 @@
|
||||
-- CreateEnum
|
||||
CREATE TYPE "QuestionsVote" AS ENUM ('NO_VOTE', 'UPVOTE', 'DOWNVOTE');
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "QuestionsQuestion" (
|
||||
"id" TEXT NOT NULL,
|
||||
"userId" TEXT,
|
||||
"content" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "QuestionsQuestion_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "QuestionsQuestionEncounter" (
|
||||
"id" TEXT NOT NULL,
|
||||
"questionId" TEXT NOT NULL,
|
||||
"userId" TEXT,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "QuestionsQuestionEncounter_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "QuestionsQuestionVote" (
|
||||
"id" TEXT NOT NULL,
|
||||
"questionId" TEXT NOT NULL,
|
||||
"userId" TEXT,
|
||||
"vote" "QuestionsVote" NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "QuestionsQuestionVote_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "QuestionsQuestionComment" (
|
||||
"id" TEXT NOT NULL,
|
||||
"questionId" TEXT NOT NULL,
|
||||
"userId" TEXT,
|
||||
"content" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "QuestionsQuestionComment_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "QuestionsQuestionCommentVote" (
|
||||
"id" TEXT NOT NULL,
|
||||
"questionCommentId" TEXT NOT NULL,
|
||||
"userId" TEXT,
|
||||
"vote" "QuestionsVote" NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "QuestionsQuestionCommentVote_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "QuestionsAnswer" (
|
||||
"id" TEXT NOT NULL,
|
||||
"questionId" TEXT NOT NULL,
|
||||
"userId" TEXT,
|
||||
"content" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "QuestionsAnswer_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "QuestionsAnswerVote" (
|
||||
"id" TEXT NOT NULL,
|
||||
"answerId" TEXT NOT NULL,
|
||||
"userId" TEXT,
|
||||
"vote" "QuestionsVote" NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "QuestionsAnswerVote_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "QuestionsAnswerComment" (
|
||||
"id" TEXT NOT NULL,
|
||||
"answerId" TEXT NOT NULL,
|
||||
"userId" TEXT,
|
||||
"content" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "QuestionsAnswerComment_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "QuestionsAnswerCommentVote" (
|
||||
"id" TEXT NOT NULL,
|
||||
"answerCommentId" TEXT NOT NULL,
|
||||
"userId" TEXT,
|
||||
"vote" "QuestionsVote" NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "QuestionsAnswerCommentVote_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "QuestionsQuestionVote_questionId_userId_key" ON "QuestionsQuestionVote"("questionId", "userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "QuestionsQuestionCommentVote_questionCommentId_userId_key" ON "QuestionsQuestionCommentVote"("questionCommentId", "userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "QuestionsAnswerVote_answerId_userId_key" ON "QuestionsAnswerVote"("answerId", "userId");
|
||||
|
||||
-- CreateIndex
|
||||
CREATE UNIQUE INDEX "QuestionsAnswerCommentVote_answerCommentId_userId_key" ON "QuestionsAnswerCommentVote"("answerCommentId", "userId");
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsQuestion" ADD CONSTRAINT "QuestionsQuestion_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsQuestionEncounter" ADD CONSTRAINT "QuestionsQuestionEncounter_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsQuestionEncounter" ADD CONSTRAINT "QuestionsQuestionEncounter_questionId_fkey" FOREIGN KEY ("questionId") REFERENCES "QuestionsQuestion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsQuestionVote" ADD CONSTRAINT "QuestionsQuestionVote_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsQuestionVote" ADD CONSTRAINT "QuestionsQuestionVote_questionId_fkey" FOREIGN KEY ("questionId") REFERENCES "QuestionsQuestion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsQuestionComment" ADD CONSTRAINT "QuestionsQuestionComment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsQuestionComment" ADD CONSTRAINT "QuestionsQuestionComment_questionId_fkey" FOREIGN KEY ("questionId") REFERENCES "QuestionsQuestion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsQuestionCommentVote" ADD CONSTRAINT "QuestionsQuestionCommentVote_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsQuestionCommentVote" ADD CONSTRAINT "QuestionsQuestionCommentVote_questionCommentId_fkey" FOREIGN KEY ("questionCommentId") REFERENCES "QuestionsQuestionComment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsAnswer" ADD CONSTRAINT "QuestionsAnswer_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsAnswer" ADD CONSTRAINT "QuestionsAnswer_questionId_fkey" FOREIGN KEY ("questionId") REFERENCES "QuestionsQuestion"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsAnswerVote" ADD CONSTRAINT "QuestionsAnswerVote_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsAnswerVote" ADD CONSTRAINT "QuestionsAnswerVote_answerId_fkey" FOREIGN KEY ("answerId") REFERENCES "QuestionsAnswer"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsAnswerComment" ADD CONSTRAINT "QuestionsAnswerComment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsAnswerComment" ADD CONSTRAINT "QuestionsAnswerComment_answerId_fkey" FOREIGN KEY ("answerId") REFERENCES "QuestionsAnswer"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsAnswerCommentVote" ADD CONSTRAINT "QuestionsAnswerCommentVote_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "QuestionsAnswerCommentVote" ADD CONSTRAINT "QuestionsAnswerCommentVote_answerCommentId_fkey" FOREIGN KEY ("answerCommentId") REFERENCES "QuestionsAnswerComment"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
@ -0,0 +1,11 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- Added the required column `questionType` to the `QuestionsQuestion` table without a default value. This is not possible if the table is not empty.
|
||||
|
||||
*/
|
||||
-- CreateEnum
|
||||
CREATE TYPE "QuestionsQuestionType" AS ENUM ('CODING', 'SYSTEM_DESIGN', 'BEHAVIORAL');
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "QuestionsQuestion" ADD COLUMN "questionType" "QuestionsQuestionType" NOT NULL;
|
@ -0,0 +1,12 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- Added the required column `company` to the `QuestionsQuestionEncounter` table without a default value. This is not possible if the table is not empty.
|
||||
- Added the required column `location` to the `QuestionsQuestionEncounter` table without a default value. This is not possible if the table is not empty.
|
||||
- Added the required column `role` to the `QuestionsQuestionEncounter` table without a default value. This is not possible if the table is not empty.
|
||||
|
||||
*/
|
||||
-- AlterTable
|
||||
ALTER TABLE "QuestionsQuestionEncounter" ADD COLUMN "company" TEXT NOT NULL,
|
||||
ADD COLUMN "location" TEXT NOT NULL,
|
||||
ADD COLUMN "role" TEXT NOT NULL;
|
@ -0,0 +1,30 @@
|
||||
/*
|
||||
Warnings:
|
||||
|
||||
- Changed the type of `vote` on the `QuestionsAnswerCommentVote` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required.
|
||||
- Changed the type of `vote` on the `QuestionsAnswerVote` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required.
|
||||
- Changed the type of `vote` on the `QuestionsQuestionCommentVote` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required.
|
||||
- Changed the type of `vote` on the `QuestionsQuestionVote` table. No cast exists, the column would be dropped and recreated, which cannot be done if there is data, since the column is required.
|
||||
|
||||
*/
|
||||
-- CreateEnum
|
||||
CREATE TYPE "Vote" AS ENUM ('UPVOTE', 'DOWNVOTE');
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "QuestionsAnswerCommentVote" DROP COLUMN "vote",
|
||||
ADD COLUMN "vote" "Vote" NOT NULL;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "QuestionsAnswerVote" DROP COLUMN "vote",
|
||||
ADD COLUMN "vote" "Vote" NOT NULL;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "QuestionsQuestionCommentVote" DROP COLUMN "vote",
|
||||
ADD COLUMN "vote" "Vote" NOT NULL;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "QuestionsQuestionVote" DROP COLUMN "vote",
|
||||
ADD COLUMN "vote" "Vote" NOT NULL;
|
||||
|
||||
-- DropEnum
|
||||
DROP TYPE "QuestionsVote";
|
@ -37,18 +37,32 @@ 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[]
|
||||
resumesResumes ResumesResume[]
|
||||
resumesStars ResumesStar[]
|
||||
resumesComments ResumesComment[]
|
||||
resumesCommentVotes ResumesCommentVote[]
|
||||
questionsQuestions QuestionsQuestion[]
|
||||
questionsQuestionEncounters QuestionsQuestionEncounter[]
|
||||
questionsQuestionVotes QuestionsQuestionVote[]
|
||||
questionsQuestionComments QuestionsQuestionComment[]
|
||||
questionsQuestionCommentVotes QuestionsQuestionCommentVote[]
|
||||
questionsAnswers QuestionsAnswer[]
|
||||
questionsAnswerVotes QuestionsAnswerVote[]
|
||||
questionsAnswerComments QuestionsAnswerComment[]
|
||||
questionsAnswerCommentVotes QuestionsAnswerCommentVote[]
|
||||
}
|
||||
|
||||
enum Vote {
|
||||
UPVOTE
|
||||
DOWNVOTE
|
||||
}
|
||||
|
||||
model VerificationToken {
|
||||
@ -162,4 +176,137 @@ model ResumesCommentVote {
|
||||
// Add Questions project models here, prefix all models with "Questions",
|
||||
// use camelCase for field names, and try to name them consistently
|
||||
// across all models in this file.
|
||||
|
||||
enum QuestionsQuestionType {
|
||||
CODING
|
||||
SYSTEM_DESIGN
|
||||
BEHAVIORAL
|
||||
}
|
||||
|
||||
model QuestionsQuestion {
|
||||
id String @id @default(cuid())
|
||||
userId String?
|
||||
content String @db.Text
|
||||
questionType QuestionsQuestionType
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
|
||||
encounters QuestionsQuestionEncounter[]
|
||||
votes QuestionsQuestionVote[]
|
||||
comments QuestionsQuestionComment[]
|
||||
answers QuestionsAnswer[]
|
||||
}
|
||||
|
||||
model QuestionsQuestionEncounter {
|
||||
id String @id @default(cuid())
|
||||
questionId String
|
||||
userId String?
|
||||
// TODO: sync with models
|
||||
company String @db.Text
|
||||
location String @db.Text
|
||||
role String @db.Text
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
|
||||
question QuestionsQuestion @relation(fields: [questionId], references: [id], onDelete: Cascade)
|
||||
}
|
||||
|
||||
model QuestionsQuestionVote {
|
||||
id String @id @default(cuid())
|
||||
questionId String
|
||||
userId String?
|
||||
vote Vote
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
|
||||
question QuestionsQuestion @relation(fields: [questionId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([questionId, userId])
|
||||
}
|
||||
|
||||
model QuestionsQuestionComment {
|
||||
id String @id @default(cuid())
|
||||
questionId String
|
||||
userId String?
|
||||
content String @db.Text
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
|
||||
question QuestionsQuestion @relation(fields: [questionId], references: [id], onDelete: Cascade)
|
||||
votes QuestionsQuestionCommentVote[]
|
||||
}
|
||||
|
||||
model QuestionsQuestionCommentVote {
|
||||
id String @id @default(cuid())
|
||||
questionCommentId String
|
||||
userId String?
|
||||
vote Vote
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
|
||||
comment QuestionsQuestionComment @relation(fields: [questionCommentId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([questionCommentId, userId])
|
||||
}
|
||||
|
||||
model QuestionsAnswer {
|
||||
id String @id @default(cuid())
|
||||
questionId String
|
||||
userId String?
|
||||
content String @db.Text
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
|
||||
question QuestionsQuestion @relation(fields: [questionId], references: [id], onDelete: Cascade)
|
||||
votes QuestionsAnswerVote[]
|
||||
comments QuestionsAnswerComment[]
|
||||
}
|
||||
|
||||
model QuestionsAnswerVote {
|
||||
id String @id @default(cuid())
|
||||
answerId String
|
||||
userId String?
|
||||
vote Vote
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
|
||||
answer QuestionsAnswer @relation(fields: [answerId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([answerId, userId])
|
||||
}
|
||||
|
||||
model QuestionsAnswerComment {
|
||||
id String @id @default(cuid())
|
||||
answerId String
|
||||
userId String?
|
||||
content String @db.Text
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
|
||||
answer QuestionsAnswer @relation(fields: [answerId], references: [id], onDelete: Cascade)
|
||||
votes QuestionsAnswerCommentVote[]
|
||||
}
|
||||
|
||||
model QuestionsAnswerCommentVote {
|
||||
id String @id @default(cuid())
|
||||
answerCommentId String
|
||||
userId String?
|
||||
vote Vote
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
|
||||
comment QuestionsAnswerComment @relation(fields: [answerCommentId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([answerCommentId, userId])
|
||||
}
|
||||
|
||||
// End of Questions project models.
|
||||
|
0
apps/portal/src/types/questions-question.d.ts
vendored
Normal file
0
apps/portal/src/types/questions-question.d.ts
vendored
Normal file
Reference in New Issue
Block a user