diff --git a/src/app/_components/fetchData.tsx b/src/app/_components/fetchData.tsx
index 2af1101..80665ea 100644
--- a/src/app/_components/fetchData.tsx
+++ b/src/app/_components/fetchData.tsx
@@ -3,9 +3,10 @@
import { api } from "~/trpc/react";
export function TestButton() {
- const { data } = api.leetcode.hasCompletedProblemRecently.useQuery({
- username: "Oscar_gg",
- problemSlug: "final-array-state-after-k-multiplication-operations-i",
+ const utils = api.useUtils();
+ const { data } = api.leetcode.checkNewCompletions.useQuery({
+ userId: "cmc6w9tlp000025100bzz0zwb",
+ leetcodeUser: "pyoro",
});
const { data: data2 } = api.leetcode.getProblemById.useQuery({
diff --git a/src/app/_components/week/.weekInfo.tsx.swp b/src/app/_components/week/.weekInfo.tsx.swp
deleted file mode 100644
index 023615f..0000000
Binary files a/src/app/_components/week/.weekInfo.tsx.swp and /dev/null differ
diff --git a/src/app/_components/week/weekInfo.tsx b/src/app/_components/week/weekInfo.tsx
index b7d55b2..a6eefce 100644
--- a/src/app/_components/week/weekInfo.tsx
+++ b/src/app/_components/week/weekInfo.tsx
@@ -8,6 +8,15 @@ const WeekInfo = async ({id}: { id: string }) => {
console.log(week);
const session = await auth();
const userId = session?.user?.id;
+ const leetcodeUser = session?.user?.leetcodeUser;
+
+ // Only call backend if needed information exists.
+ if (userId && leetcodeUser) {
+ await api.leetcode.checkNewCompletions({
+ userId: userId,
+ leetcodeUser: leetcodeUser,
+ });
+ }
return (
diff --git a/src/server/api/routers/leetcode.ts b/src/server/api/routers/leetcode.ts
index b45a611..ad2b7c6 100644
--- a/src/server/api/routers/leetcode.ts
+++ b/src/server/api/routers/leetcode.ts
@@ -1,3 +1,4 @@
+import { timeStamp } from "console";
import { z } from "zod";
import { createTRPCRouter, publicProcedure } from "~/server/api/trpc";
@@ -17,16 +18,54 @@ export const leetcodeRouter = createTRPCRouter({
return await getProblemsSolved({ username: input.username });
}),
- hasCompletedProblemRecently: publicProcedure
- .input(z.object({ username: z.string(), problemSlug: z.string() }))
- .query(async ({ input }) => {
- const recentAccepted = await getAcceptedProblems({
- username: input.username,
- });
+ checkNewCompletions: publicProcedure
+ .input(z.object({ userId: z.string(), leetcodeUser: z.string() }))
+ .query(async ({ input, ctx }) => {
+ const recentAccepted = await getAcceptedProblems({ username: input.leetcodeUser });
+ if (!recentAccepted) {
+ throw new Error("Failed to fetch recent accepted problems");
+ }
+
+ const trainingStartDate = new Date(`2025-06-28T00:00:00Z`).getTime();
+
+ // Get all recently accepted problems solved after the beginning of the training period.
+ const data = recentAccepted
+ .filter(problem => new Date(problem.timestamp * 1000).getTime() >= trainingStartDate)
+ .map(problem => ({
+ name: problem.title,
+ timestamp: problem.timestamp,
+ }));
+
+ const db = await ctx.db.problem.findMany({ include: { week: true, solvedBy: true } });
+
+ // Perform db update.
+ const updates = data.map(problem => {
+ // If not a match, ignore.
+ const matched = db.find(p => p.name === problem.name);
+
+ if (!matched) return null;
+
+ // If already solved, ignore.
+ const alreadySolved = matched.solvedBy.some(
+ user => user.leetcodeUser === input.leetcodeUser
+ );
+
+ if (alreadySolved) return null;
+
+ // Update matched, not previously solved problem.
+ return ctx.db.problem.update({
+ where: {id : matched.id},
+ data: {
+ solvedBy: {
+ connect: {id: input.userId}
+ }
+ }
+ })
+ })
- return recentAccepted.some(
- (submission) => submission.titleSlug === input.problemSlug,
- );
+ // Filter and run all updates
+ const filteredPromises = updates.filter(Boolean);
+ await Promise.all(filteredPromises);
}),
getProblemById: publicProcedure
diff --git a/src/server/auth/config.ts b/src/server/auth/config.ts
index f4d4064..93300f7 100644
--- a/src/server/auth/config.ts
+++ b/src/server/auth/config.ts
@@ -17,6 +17,7 @@ declare module "next-auth" {
user: {
id: string;
role: UserRole;
+ leetcodeUser?: string;
// ...other properties
} & DefaultSession["user"];
}