[resumes][feat] Add router to query for comments

pull/313/head
Terence Ho 3 years ago
parent 0f9ad2894a
commit 0931379806

@ -146,6 +146,8 @@ model ResumesCommentVote {
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade)
comment ResumesComment @relation(fields: [commentId], references: [id], onDelete: Cascade) comment ResumesComment @relation(fields: [commentId], references: [id], onDelete: Cascade)
@@unique([commentId, userId])
} }
// Start of Offers project models. // Start of Offers project models.

@ -20,9 +20,8 @@ type IFormInput = {
type InputKeys = keyof IFormInput; type InputKeys = keyof IFormInput;
// TODO: Retrieve resumeId and remove default
export default function CommentsForm({ export default function CommentsForm({
resumeId = '', resumeId,
setShowCommentsForm, setShowCommentsForm,
}: CommentsFormProps) { }: CommentsFormProps) {
const [showDialog, setShowDialog] = useState(false); const [showDialog, setShowDialog] = useState(false);

@ -1,17 +1,28 @@
import { useState } from 'react'; import { useState } from 'react';
import { Button, Tabs } from '@tih/ui'; import { Button, Tabs } from '@tih/ui';
import { trpc } from '~/utils/trpc';
import { COMMENTS_SECTIONS } from './constants'; import { COMMENTS_SECTIONS } from './constants';
type CommentsListProps = Readonly<{ type CommentsListProps = Readonly<{
resumeId: string;
setShowCommentsForm: (show: boolean) => void; setShowCommentsForm: (show: boolean) => void;
}>; }>;
export default function CommentsList({ export default function CommentsList({
resumeId,
setShowCommentsForm, setShowCommentsForm,
}: CommentsListProps) { }: CommentsListProps) {
const [tab, setTab] = useState(COMMENTS_SECTIONS[0].value); const [tab, setTab] = useState(COMMENTS_SECTIONS[0].value);
// TODO: Render comments
const commentsQuery = trpc.useQuery(['resumes.reviews.list', { resumeId }]);
/* eslint-disable no-console */
console.log(commentsQuery);
/* eslint-enable no-console */
return ( return (
<> <>
<Button <Button

@ -3,12 +3,25 @@ import { useState } from 'react';
import CommentsForm from './CommentsForm'; import CommentsForm from './CommentsForm';
import CommentsList from './CommentsList'; import CommentsList from './CommentsList';
export default function CommentsSection() { type ICommentsSectionProps = {
resumeId: string;
};
// TODO: Retrieve resumeId for CommentsSection
export default function CommentsSection({
resumeId = '',
}: ICommentsSectionProps) {
const [showCommentsForm, setShowCommentsForm] = useState(false); const [showCommentsForm, setShowCommentsForm] = useState(false);
return showCommentsForm ? ( return showCommentsForm ? (
<CommentsForm setShowCommentsForm={setShowCommentsForm} /> <CommentsForm
resumeId={resumeId}
setShowCommentsForm={setShowCommentsForm}
/>
) : ( ) : (
<CommentsList setShowCommentsForm={setShowCommentsForm} /> <CommentsList
resumeId={resumeId}
setShowCommentsForm={setShowCommentsForm}
/>
); );
} }

@ -3,6 +3,7 @@ import superjson from 'superjson';
import { createRouter } from './context'; import { createRouter } from './context';
import { protectedExampleRouter } from './protected-example-router'; import { protectedExampleRouter } from './protected-example-router';
import { resumesResumeUserRouter } from './resumes-resume-user-router'; import { resumesResumeUserRouter } from './resumes-resume-user-router';
import { resumeReviewsRouter } from './resumes-reviews-router';
import { resumesReviewsUserRouter } from './resumes-reviews-user-router'; import { resumesReviewsUserRouter } from './resumes-reviews-user-router';
import { todosRouter } from './todos'; import { todosRouter } from './todos';
import { todosUserRouter } from './todos-user-router'; import { todosUserRouter } from './todos-user-router';
@ -16,6 +17,7 @@ export const appRouter = createRouter()
.merge('todos.', todosRouter) .merge('todos.', todosRouter)
.merge('todos.user.', todosUserRouter) .merge('todos.user.', todosUserRouter)
.merge('resumes.resume.user.', resumesResumeUserRouter) .merge('resumes.resume.user.', resumesResumeUserRouter)
.merge('resumes.reviews.', resumeReviewsRouter)
.merge('resumes.reviews.user.', resumesReviewsUserRouter); .merge('resumes.reviews.user.', resumesReviewsUserRouter);
// Export type definition of API // Export type definition of API

@ -0,0 +1,44 @@
import { z } from 'zod';
import { createRouter } from './context';
// TODO: Test this -> Not sure if it works
export const resumeReviewsRouter = createRouter().query('list', {
input: z.object({
resumeId: z.string(),
}),
async resolve({ ctx, input }) {
const userId = ctx.session?.user?.id;
const { resumeId } = input;
// For this resume, we retrieve every comment's information, along with:
// The user's name and image to render
// Number of votes, and whether the user (if-any) has voted
return await ctx.prisma.resumesComment.findMany({
include: {
_count: {
select: {
votes: true,
},
},
user: {
select: {
image: true,
name: true,
},
},
votes: {
where: {
userId,
},
},
},
orderBy: {
createdAt: 'desc',
},
where: {
resumeId,
},
});
},
});
Loading…
Cancel
Save