From 915805bee14fd00bf475b277dde2350818ea5223 Mon Sep 17 00:00:00 2001 From: Keane Chan Date: Fri, 21 Oct 2022 15:20:57 +0800 Subject: [PATCH] [resumes][feat] add findUserTopUpvotedCommentCount query --- .../resumes/badges/ResumeUserBadges.tsx | 7 +- .../router/resumes/resumes-resume-router.ts | 85 +++++++++++++++---- 2 files changed, 74 insertions(+), 18 deletions(-) diff --git a/apps/portal/src/components/resumes/badges/ResumeUserBadges.tsx b/apps/portal/src/components/resumes/badges/ResumeUserBadges.tsx index 3e6325c7..1622dd9e 100644 --- a/apps/portal/src/components/resumes/badges/ResumeUserBadges.tsx +++ b/apps/portal/src/components/resumes/badges/ResumeUserBadges.tsx @@ -17,12 +17,15 @@ export default function ResumeUserBadges({ userId }: Props) { 'resumes.resume.findUserMaxResumeUpvoteCount', { userId }, ]); + const userTopUpvotedCommentCountQuery = trpc.useQuery([ + 'resumes.resume.findUserTopUpvotedCommentCount', + { userId }, + ]); - // TODO: Add other badges in const payload: BadgePayload = { maxResumeUpvoteCount: userMaxResumeUpvoteCountQuery.data ?? 0, reviewedResumesCount: userReviewedResumeCountQuery.data ?? 0, - topUpvotedCommentCount: 20, + topUpvotedCommentCount: userTopUpvotedCommentCountQuery.data ?? 0, }; return ( diff --git a/apps/portal/src/server/router/resumes/resumes-resume-router.ts b/apps/portal/src/server/router/resumes/resumes-resume-router.ts index 9e46e0e6..bda6464f 100644 --- a/apps/portal/src/server/router/resumes/resumes-resume-router.ts +++ b/apps/portal/src/server/router/resumes/resumes-resume-router.ts @@ -1,4 +1,5 @@ import { z } from 'zod'; +import { Vote } from '@prisma/client'; import { createRouter } from '../context'; @@ -149,11 +150,16 @@ export const resumesRouter = createRouter() async resolve({ ctx, input }) { return await ctx.prisma.resumesResume.count({ where: { + // User has commented on this resume comments: { some: { userId: input.userId, }, }, + // Not user's own resume + userId: { + not: input.userId, + }, }, }); }, @@ -164,18 +170,18 @@ export const resumesRouter = createRouter() }), async resolve({ ctx, input }) { const highestUpvotedResume = await ctx.prisma.resumesResume.findFirst({ - include: { + orderBy: { + stars: { + _count: 'desc', + }, + }, + select: { _count: { select: { stars: true, }, }, }, - orderBy: { - stars: { - _count: 'desc', - }, - }, where: { userId: input.userId, }, @@ -183,14 +189,61 @@ export const resumesRouter = createRouter() return highestUpvotedResume?._count?.stars ?? 0; }, + }) + .query('findUserTopUpvotedCommentCount', { + input: z.object({ + userId: z.string(), + }), + async resolve({ ctx, input }) { + const resumes = await ctx.prisma.resumesResume.findMany({ + select: { + comments: { + select: { + userId: true, + votes: { + select: { + value: true, + }, + }, + }, + }, + }, + }); + + let topUpvotedCommentCount = 0; + + for (const resume of resumes) { + let highestVoteCount = 1; + + // Get Map of {userId, voteCount} for each comment + const commentUpvotePairs = []; + for (const comment of resume.comments) { + const { userId, votes } = comment; + let voteCount = 0; + for (const vote of votes) { + if (vote.value === Vote.UPVOTE) { + voteCount++; + } else { + voteCount--; + } + } + if (voteCount >= highestVoteCount) { + highestVoteCount = voteCount; + commentUpvotePairs.push({ userId, voteCount }); + } + } + + // Filter to get the userIds with the highest vote counts + const userIds = commentUpvotePairs + .filter((pair) => pair.voteCount === highestVoteCount) + .map((pair) => pair.userId); + + // Increment if input userId is the highest voted comment + if (userIds.includes(input.userId)) { + topUpvotedCommentCount++; + } + } + + return topUpvotedCommentCount; + }, }); -// .query('findUserTopUpvotedCommentCount', { -// input: z.object({ -// userId: z.string(), -// }), -// async resolve({ ctx, input }) { -// const highestUpvotedResume = await ctx.prisma.resumesComment.groupBy({ -// by: ['resumeId'], -// }) -// }, -// });