diff --git a/apps/portal/prisma/schema.prisma b/apps/portal/prisma/schema.prisma
index 95c4381f..668b5ba6 100644
--- a/apps/portal/prisma/schema.prisma
+++ b/apps/portal/prisma/schema.prisma
@@ -146,6 +146,8 @@ model ResumesCommentVote {
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
comment ResumesComment @relation(fields: [commentId], references: [id], onDelete: Cascade)
+
+ @@unique([commentId, userId])
}
// Start of Offers project models.
diff --git a/apps/portal/src/components/resumes/comments/CommentsForm.tsx b/apps/portal/src/components/resumes/comments/CommentsForm.tsx
index 97cbb34f..c21314f2 100644
--- a/apps/portal/src/components/resumes/comments/CommentsForm.tsx
+++ b/apps/portal/src/components/resumes/comments/CommentsForm.tsx
@@ -20,9 +20,8 @@ type IFormInput = {
type InputKeys = keyof IFormInput;
-// TODO: Retrieve resumeId and remove default
export default function CommentsForm({
- resumeId = '',
+ resumeId,
setShowCommentsForm,
}: CommentsFormProps) {
const [showDialog, setShowDialog] = useState(false);
diff --git a/apps/portal/src/components/resumes/comments/CommentsList.tsx b/apps/portal/src/components/resumes/comments/CommentsList.tsx
index 397c9551..c9521380 100644
--- a/apps/portal/src/components/resumes/comments/CommentsList.tsx
+++ b/apps/portal/src/components/resumes/comments/CommentsList.tsx
@@ -1,17 +1,28 @@
import { useState } from 'react';
import { Button, Tabs } from '@tih/ui';
+import { trpc } from '~/utils/trpc';
+
import { COMMENTS_SECTIONS } from './constants';
type CommentsListProps = Readonly<{
+ resumeId: string;
setShowCommentsForm: (show: boolean) => void;
}>;
export default function CommentsList({
+ resumeId,
setShowCommentsForm,
}: CommentsListProps) {
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 (
<>
+
) : (
-
+
);
}
diff --git a/apps/portal/src/server/router/index.ts b/apps/portal/src/server/router/index.ts
index 2c85edad..9c2b451b 100644
--- a/apps/portal/src/server/router/index.ts
+++ b/apps/portal/src/server/router/index.ts
@@ -3,6 +3,7 @@ import superjson from 'superjson';
import { createRouter } from './context';
import { protectedExampleRouter } from './protected-example-router';
import { resumesResumeUserRouter } from './resumes-resume-user-router';
+import { resumeReviewsRouter } from './resumes-reviews-router';
import { resumesReviewsUserRouter } from './resumes-reviews-user-router';
import { todosRouter } from './todos';
import { todosUserRouter } from './todos-user-router';
@@ -16,6 +17,7 @@ export const appRouter = createRouter()
.merge('todos.', todosRouter)
.merge('todos.user.', todosUserRouter)
.merge('resumes.resume.user.', resumesResumeUserRouter)
+ .merge('resumes.reviews.', resumeReviewsRouter)
.merge('resumes.reviews.user.', resumesReviewsUserRouter);
// Export type definition of API
diff --git a/apps/portal/src/server/router/resumes-reviews-router.ts b/apps/portal/src/server/router/resumes-reviews-router.ts
new file mode 100644
index 00000000..87aaafcf
--- /dev/null
+++ b/apps/portal/src/server/router/resumes-reviews-router.ts
@@ -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,
+ },
+ });
+ },
+});