From 6787ed117b0f59af7e40bafb7741d61e56259aac Mon Sep 17 00:00:00 2001 From: Jeff Sieu Date: Mon, 10 Oct 2022 03:45:21 +0800 Subject: [PATCH] [questions][feat] post, view question answers --- .../answer/[answerId]/[answerSlug]/index.tsx | 22 ++- .../[questionId]/[questionSlug]/index.tsx | 33 ++++- .../server/router/questions-answer-router.ts | 140 ++++++++++++------ .../questions-question-comment-router.ts | 8 +- .../router/questions-question-router.ts | 16 +- apps/portal/src/types/questions.d.ts | 1 + 6 files changed, 148 insertions(+), 72 deletions(-) diff --git a/apps/portal/src/pages/questions/[questionId]/[questionSlug]/answer/[answerId]/[answerSlug]/index.tsx b/apps/portal/src/pages/questions/[questionId]/[questionSlug]/answer/[answerId]/[answerSlug]/index.tsx index bcbd7f93..61a5f62b 100644 --- a/apps/portal/src/pages/questions/[questionId]/[questionSlug]/answer/[answerId]/[answerSlug]/index.tsx +++ b/apps/portal/src/pages/questions/[questionId]/[questionSlug]/answer/[answerId]/[answerSlug]/index.tsx @@ -12,6 +12,7 @@ import { SAMPLE_QUESTION, } from '~/utils/questions/constants'; import { useFormRegister } from '~/utils/questions/useFormRegister'; +import { trpc } from '~/utils/trpc'; export type AnswerCommentData = { commentContent: string; @@ -29,6 +30,14 @@ export default function QuestionPage() { const question = SAMPLE_QUESTION; const comment = SAMPLE_ANSWER_COMMENT; + + const { answerId } = router.query; + + const { data: answer } = trpc.useQuery([ + 'questions.answers.getAnswerById', + { answerId: answerId as string }, + ]); + const handleBackNavigation = () => { router.back(); }; @@ -38,6 +47,11 @@ export default function QuestionPage() { console.log(data); }; + if (!answer) { + // TODO: Make this look nicer + return
Answer not found
; + } + return (
@@ -51,7 +65,13 @@ export default function QuestionPage() {
- +
{ + utils.invalidateQueries('questions.answers.getAnswers'); + }, + }); + const handleBackNavigation = () => { router.back(); }; @@ -71,6 +83,10 @@ export default function QuestionPage() { const handleSubmitAnswer = (data: AnswerQuestionData) => { // eslint-disable-next-line no-console console.log(data); + addAnswer({ + content: data.answerContent, + questionId: questionId as string, + }); }; const handleSubmitComment = (data: QuestionCommentData) => { @@ -214,13 +230,18 @@ export default function QuestionPage() { />
- - {Array.from({ length: question.numAnswers }).map((_, index) => ( + {(answers ?? []).map((answer) => ( ))}
diff --git a/apps/portal/src/server/router/questions-answer-router.ts b/apps/portal/src/server/router/questions-answer-router.ts index 61a5b6c5..21095bf7 100644 --- a/apps/portal/src/server/router/questions-answer-router.ts +++ b/apps/portal/src/server/router/questions-answer-router.ts @@ -14,17 +14,17 @@ export const questionsAnswerRouter = createProtectedRouter() async resolve({ ctx, input }) { const answersData = await ctx.prisma.questionsAnswer.findMany({ include: { - _count: { - select: { - comments: true, + _count: { + select: { + comments: true, + }, }, - }, - user: { - select: { - name: true, + user: { + select: { + name: true, + }, }, - }, - votes: true, + votes: true, }, orderBy: { createdAt: 'desc', @@ -32,43 +32,93 @@ export const questionsAnswerRouter = createProtectedRouter() where: { ...input, }, - }); - return answersData.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 - ); + }); + return answersData.map((data) => { + const votes: number = data.votes.reduce( + (previousValue: number, currentValue) => { + let result: number = previousValue; - let userName = ""; + switch (currentValue.vote) { + case Vote.UPVOTE: + result += 1; + break; + case Vote.DOWNVOTE: + result -= 1; + break; + } + return result; + }, + 0, + ); - if (data.user) { - userName = data.user.name!; + const answer: Answer = { + content: data.content, + createdAt: data.createdAt, + id: data.id, + numComments: data._count.comments, + numVotes: votes, + user: data.user?.name ?? '', + }; + return answer; + }); + }, + }) + .query('getAnswerById', { + input: z.object({ + answerId: z.string(), + }), + async resolve({ ctx, input }) { + const answerData = await ctx.prisma.questionsAnswer.findUnique({ + include: { + _count: { + select: { + comments: true, + }, + }, + user: { + select: { + name: true, + }, + }, + votes: true, + }, + where: { + id: input.answerId, + }, + }); + 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: data.content, - createdAt: data.createdAt, - id: data.id, - numComments: data._count.comments, + content: answerData.content, + createdAt: answerData.createdAt, + id: answerData.id, + numComments: answerData._count.comments, numVotes: votes, - user: userName, + user: answerData.user?.name ?? '', }; return answer; - }); - } + }, }) .mutation('create', { input: z.object({ @@ -93,7 +143,7 @@ export const questionsAnswerRouter = createProtectedRouter() }), async resolve({ ctx, input }) { const userId = ctx.session?.user?.id; - const {content, id} = input + const { content, id } = input; const answerToUpdate = await ctx.prisma.questionsAnswer.findUnique({ where: { @@ -128,7 +178,8 @@ export const questionsAnswerRouter = createProtectedRouter() const answerToDelete = await ctx.prisma.questionsAnswer.findUnique({ where: { id: input.id, - },}); + }, + }); if (answerToDelete?.id !== userId) { throw new TRPCError({ @@ -150,11 +201,11 @@ export const questionsAnswerRouter = createProtectedRouter() }), async resolve({ ctx, input }) { const userId = ctx.session?.user?.id; - const {answerId} = input + const { answerId } = input; return await ctx.prisma.questionsAnswerVote.findUnique({ where: { - answerId_userId : { answerId, userId }, + answerId_userId: { answerId, userId }, }, }); }, @@ -182,7 +233,7 @@ export const questionsAnswerRouter = createProtectedRouter() }), async resolve({ ctx, input }) { const userId = ctx.session?.user?.id; - const {id, vote} = input + const { id, vote } = input; const voteToUpdate = await ctx.prisma.questionsAnswerVote.findUnique({ where: { @@ -217,7 +268,8 @@ export const questionsAnswerRouter = createProtectedRouter() const voteToDelete = await ctx.prisma.questionsAnswerVote.findUnique({ where: { id: input.id, - },}); + }, + }); if (voteToDelete?.id !== userId) { throw new TRPCError({ @@ -232,4 +284,4 @@ export const questionsAnswerRouter = createProtectedRouter() }, }); }, - }); \ No newline at end of file + }); diff --git a/apps/portal/src/server/router/questions-question-comment-router.ts b/apps/portal/src/server/router/questions-question-comment-router.ts index f41f161d..82345f06 100644 --- a/apps/portal/src/server/router/questions-question-comment-router.ts +++ b/apps/portal/src/server/router/questions-question-comment-router.ts @@ -47,18 +47,12 @@ export const questionsQuestionCommentRouter = createProtectedRouter() 0, ); - let userName = ''; - - if (data.user) { - userName = data.user.name!; - } - const questionComment: QuestionComment = { content: data.content, createdAt: data.createdAt, id: data.id, numVotes: votes, - user: userName, + user: data.user?.name ?? '', }; return questionComment; }); diff --git a/apps/portal/src/server/router/questions-question-router.ts b/apps/portal/src/server/router/questions-question-router.ts index c4659b47..55bf5981 100644 --- a/apps/portal/src/server/router/questions-question-router.ts +++ b/apps/portal/src/server/router/questions-question-router.ts @@ -78,12 +78,6 @@ export const questionsQuestionRouter = createProtectedRouter() 0, ); - let userName = ''; - - if (data.user) { - userName = data.user.name!; - } - const question: Question = { company: data.encounters[0].company, content: data.content, @@ -95,7 +89,7 @@ export const questionsQuestionRouter = createProtectedRouter() role: data.encounters[0].role ?? 'Unknown role', seenAt: data.encounters[0].seenAt, updatedAt: data.updatedAt, - user: userName, + user: data.user?.name ?? '', }; return question; }); @@ -156,12 +150,6 @@ export const questionsQuestionRouter = createProtectedRouter() 0, ); - let userName = ''; - - if (questionData.user) { - userName = questionData.user.name!; - } - const question: Question = { company: questionData.encounters[0].company, content: questionData.content, @@ -173,7 +161,7 @@ export const questionsQuestionRouter = createProtectedRouter() role: questionData.encounters[0].role ?? 'Unknown role', seenAt: questionData.encounters[0].seenAt, updatedAt: questionData.updatedAt, - user: userName, + user: questionData.user?.name ?? '', }; return question; }, diff --git a/apps/portal/src/types/questions.d.ts b/apps/portal/src/types/questions.d.ts index 1d189a11..75d02666 100644 --- a/apps/portal/src/types/questions.d.ts +++ b/apps/portal/src/types/questions.d.ts @@ -25,6 +25,7 @@ export type Answer = { id: string; numComments: number; numVotes: number; + user: string; }; export type QuestionComment = {