From 516de44894380183bf78441508f28e709edcf7a7 Mon Sep 17 00:00:00 2001 From: hpkoh Date: Wed, 19 Oct 2022 17:41:21 +0800 Subject: [PATCH] [questions][feat] add entry c,d --- apps/portal/prisma/schema.prisma | 16 +- .../src/server/router/questions-list-crud.ts | 202 +++++------------- 2 files changed, 58 insertions(+), 160 deletions(-) diff --git a/apps/portal/prisma/schema.prisma b/apps/portal/prisma/schema.prisma index 23942ba7..4a89b7e4 100644 --- a/apps/portal/prisma/schema.prisma +++ b/apps/portal/prisma/schema.prisma @@ -370,12 +370,12 @@ model QuestionsQuestion { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - user User? @relation(fields: [userId], references: [id], onDelete: SetNull) - encounters QuestionsQuestionEncounter[] - votes QuestionsQuestionVote[] - comments QuestionsQuestionComment[] - answers QuestionsAnswer[] - QuestionsListQuestion QuestionsListQuestion[] + user User? @relation(fields: [userId], references: [id], onDelete: SetNull) + encounters QuestionsQuestionEncounter[] + votes QuestionsQuestionVote[] + comments QuestionsQuestionComment[] + answers QuestionsAnswer[] + listQuestionEntries QuestionsListQuestion[] } model QuestionsQuestionEncounter { @@ -497,8 +497,8 @@ model QuestionsList { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - QuestionsListQuestion QuestionsListQuestion[] + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + questionEntries QuestionsListQuestion[] @@unique([userId, name]) } diff --git a/apps/portal/src/server/router/questions-list-crud.ts b/apps/portal/src/server/router/questions-list-crud.ts index c822407f..353192ac 100644 --- a/apps/portal/src/server/router/questions-list-crud.ts +++ b/apps/portal/src/server/router/questions-list-crud.ts @@ -1,21 +1,20 @@ import { z } from 'zod'; -import { Vote } from '@prisma/client'; import { TRPCError } from '@trpc/server'; import { createProtectedRouter } from './context'; -import type { Answer } from '~/types/questions'; - export const questionListRouter = createProtectedRouter() .query('getListsByUser', { - input: z.object({ - }), - async resolve({ ctx, input }) { + async resolve({ ctx }) { const userId = ctx.session?.user?.id; - const listsData = await ctx.prisma.questionsList.findMany({ + return await ctx.prisma.questionsList.findMany({ include: { - questions: true, + listQuestionEntries: { + include: { + question: true, + }, + } }, orderBy: { createdAt: 'asc', @@ -24,110 +23,44 @@ export const questionListRouter = createProtectedRouter() id: userId, }, }); - return listsData.map((data) => { - const votes: number = data.votes.reduce( - (previousValue: number, currentValue) => { - let result: number = previousValue; - - switch (currentValue.vote) { - case Vote.UPVOTE: - result += 1; - break; - case Vote.DOWNVOTE: - result -= 1; - break; - } - return result; - }, - 0, - ); - - const answer: Answer = { - content: data.content, - createdAt: data.createdAt, - id: data.id, - numComments: data._count.comments, - numVotes: votes, - user: data.user?.name ?? '', - userImage: data.user?.image ?? '', - }; - return answer; - }); - }, + } }) - .query('getAnswerById', { + .query('getListById', { input: z.object({ - answerId: z.string(), + listId: z.string(), }), - async resolve({ ctx, input }) { - const answerData = await ctx.prisma.questionsAnswer.findUnique({ + async resolve({ ctx }) { + const userId = ctx.session?.user?.id; + + return await ctx.prisma.questionsList.findMany({ include: { - _count: { - select: { - comments: true, - }, - }, - user: { - select: { - image: true, - name: true, + listQuestionEntries: { + include: { + question: true, }, - }, - votes: true, + } + }, + orderBy: { + createdAt: 'asc', }, where: { - id: input.answerId, + id: userId, }, }); - if (!answerData) { - throw new TRPCError({ - code: 'NOT_FOUND', - message: 'Answer not found', - }); - } - const votes: number = answerData.votes.reduce( - (previousValue: number, currentValue) => { - let result: number = previousValue; - - switch (currentValue.vote) { - case Vote.UPVOTE: - result += 1; - break; - case Vote.DOWNVOTE: - result -= 1; - break; - } - return result; - }, - 0, - ); - - const answer: Answer = { - content: answerData.content, - createdAt: answerData.createdAt, - id: answerData.id, - numComments: answerData._count.comments, - numVotes: votes, - user: answerData.user?.name ?? '', - userImage: answerData.user?.image ?? '', - }; - return answer; - }, + } }) .mutation('create', { input: z.object({ - content: z.string(), - questionId: z.string(), + name: z.string(), }), async resolve({ ctx, input }) { const userId = ctx.session?.user?.id; - const { content, questionId } = input; + const { name } = input; - return await ctx.prisma.questionsAnswer.create({ + return await ctx.prisma.questionsList.create({ data: { - content, - questionId, + name, userId, }, }); @@ -135,29 +68,29 @@ export const questionListRouter = createProtectedRouter() }) .mutation('update', { input: z.object({ - content: z.string().optional(), id: z.string(), + name: z.string().optional(), }), async resolve({ ctx, input }) { const userId = ctx.session?.user?.id; - const { content, id } = input; + const { name, id } = input; - const answerToUpdate = await ctx.prisma.questionsAnswer.findUnique({ + const listToUpdate = await ctx.prisma.questionsList.findUnique({ where: { id: input.id, }, }); - if (answerToUpdate?.id !== userId) { + if (listToUpdate?.id !== userId) { throw new TRPCError({ code: 'UNAUTHORIZED', message: 'User have no authorization to record.', }); } - return await ctx.prisma.questionsAnswer.update({ + return await ctx.prisma.questionsList.update({ data: { - content, + name, }, where: { id, @@ -172,88 +105,53 @@ export const questionListRouter = createProtectedRouter() async resolve({ ctx, input }) { const userId = ctx.session?.user?.id; - const answerToDelete = await ctx.prisma.questionsAnswer.findUnique({ + const listToDelete = await ctx.prisma.questionsList.findUnique({ where: { id: input.id, }, }); - if (answerToDelete?.id !== userId) { + if (listToDelete?.id !== userId) { throw new TRPCError({ code: 'UNAUTHORIZED', message: 'User have no authorization to record.', }); } - return await ctx.prisma.questionsAnswer.delete({ + return await ctx.prisma.questionsList.delete({ where: { id: input.id, }, }); }, }) - .query('getVote', { - input: z.object({ - answerId: z.string(), - }), - async resolve({ ctx, input }) { - const userId = ctx.session?.user?.id; - const { answerId } = input; - - return await ctx.prisma.questionsAnswerVote.findUnique({ - where: { - answerId_userId: { answerId, userId }, - }, - }); - }, - }) .mutation('createQuestionEntry', { input: z.object({ - answerId: z.string(), - vote: z.nativeEnum(Vote), - }), - async resolve({ ctx, input }) { - const userId = ctx.session?.user?.id; - - const { answerId, vote } = input; - - return await ctx.prisma.questionsAnswerVote.create({ - data: { - answerId, - userId, - vote, - }, - }); - }, - }) - .mutation('updateQuestionEntry', { - input: z.object({ - id: z.string(), - vote: z.nativeEnum(Vote), + listId: z.string(), + questionId: z.string(), }), async resolve({ ctx, input }) { const userId = ctx.session?.user?.id; - const { id, vote } = input; - const voteToUpdate = await ctx.prisma.questionsAnswerVote.findUnique({ + const listToAugment = await ctx.prisma.questionsList.findUnique({ where: { - id: input.id, + id: input.listId, }, }); - if (voteToUpdate?.userId !== userId) { + if (listToAugment?.id !== userId) { throw new TRPCError({ code: 'UNAUTHORIZED', message: 'User have no authorization to record.', }); } - return await ctx.prisma.questionsAnswerVote.update({ + const { questionId, listId } = input; + + return await ctx.prisma.questionsListQuestionEntry.create({ data: { - vote, - }, - where: { - id, + listId, + questionId, }, }); }, @@ -265,20 +163,20 @@ export const questionListRouter = createProtectedRouter() async resolve({ ctx, input }) { const userId = ctx.session?.user?.id; - const voteToDelete = await ctx.prisma.questionsAnswerVote.findUnique({ + const listToAugment = await ctx.prisma.questionsList.findUnique({ where: { - id: input.id, + id: input.listId, }, }); - if (voteToDelete?.userId !== userId) { + if (listToAugment?.id !== userId) { throw new TRPCError({ code: 'UNAUTHORIZED', message: 'User have no authorization to record.', }); } - return await ctx.prisma.questionsAnswerVote.delete({ + return await ctx.prisma.questionsListQuestionEntry.delete({ where: { id: input.id, },