Skip to content

Commit d4b23d9

Browse files
committed
♻️ Extract crud (#2653)
1 parent 4b51aa8 commit d4b23d9

File tree

3 files changed

+50
-32
lines changed

3 files changed

+50
-32
lines changed

src/lib/services/answers.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,29 @@ export async function getAnswers(user_id: string) {
2020
return answersMap;
2121
}
2222

23+
/**
24+
* Fetches task answers for a specific user and a list of selected task IDs.
25+
*
26+
* @param selectedTaskIds - An array of task IDs to filter the answers.
27+
* @param userId - The ID of the user whose answers are to be fetched.
28+
*
29+
* @returns A promise that resolves to an array of TaskAnswer objects.
30+
* @note conditions: task_id IN (...) AND user_id = userId
31+
*/
32+
export async function getAnswersWithSelectedTaskIds(selectedTaskIds: string[], userId: string) {
33+
return await prisma.taskAnswer.findMany({
34+
where: {
35+
task_id: { in: selectedTaskIds },
36+
user_id: userId,
37+
},
38+
select: {
39+
task_id: true,
40+
user_id: true,
41+
status_id: true,
42+
},
43+
});
44+
}
45+
2346
export async function getAnswersOrderedByUpdatedDesc(user_id: string): Promise<TaskAnswer[]> {
2447
const answers_from_db = await prisma.taskAnswer.findMany({
2548
where: {

src/lib/services/task_results.ts

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {
55
getSubmissionStatusMapWithId,
66
getSubmissionStatusMapWithName,
77
} from '$lib/services/submission_status';
8-
import { getTasks, getTask } from '$lib/services/tasks';
8+
import { getTasks, getTasksWithSelectedTaskIds, getTask } from '$lib/services/tasks';
99
import { getUser } from '$lib/services/users';
1010
import * as answer_crud from '$lib/services/answers';
1111

@@ -199,36 +199,9 @@ export async function getTaskResultsByTaskId(
199199
return new Map();
200200
}
201201

202-
// Step 2: Bulk fetch all tasks (1 query)
203-
// Using Prisma's `where: { task_id: { in: taskIds } }` for efficient filtering
204-
const tasks = await db.task.findMany({
205-
where: {
206-
task_id: { in: taskIds }, // SQL: WHERE task_id IN ('id1', 'id2', ...)
207-
},
208-
select: {
209-
contest_id: true,
210-
task_table_index: true,
211-
task_id: true,
212-
title: true,
213-
grade: true,
214-
},
215-
});
216-
217-
// Step 3: Bulk fetch all answers (1 query)
218-
// Using compound conditions: task_id IN (...) AND user_id = userId
219-
const answers = userId
220-
? await db.taskAnswer.findMany({
221-
where: {
222-
task_id: { in: taskIds }, // SQL: WHERE task_id IN (...)
223-
user_id: userId, // SQL: AND user_id = 'userId'
224-
},
225-
select: {
226-
task_id: true,
227-
user_id: true,
228-
status_id: true,
229-
},
230-
})
231-
: [];
202+
// Step 2 & 3: Bulk fetch all tasks and answers (2 query)
203+
const tasks = await getTasksWithSelectedTaskIds(taskIds);
204+
const answers = userId ? await answer_crud.getAnswersWithSelectedTaskIds(taskIds, userId) : [];
232205

233206
// Step 4: Create Maps for O(1) lookup
234207
const tasksMap = new Map(tasks.map((task: Task) => [task.task_id, task]));

src/lib/services/tasks.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { default as db } from '$lib/server/database';
22
import { classifyContest } from '$lib/utils/contest';
33
import type { TaskGrade } from '$lib/types/task';
4-
import type { Task } from '$lib/types/task';
4+
import type { Task, Tasks } from '$lib/types/task';
55

66
// See:
77
// https://www.prisma.io/docs/concepts/components/prisma-client/filtering-and-sorting
@@ -11,6 +11,28 @@ export async function getTasks(): Promise<Task[]> {
1111
return tasks;
1212
}
1313

14+
/**
15+
* Fetches tasks with the specified task IDs.
16+
* @param taskIds - An array of task IDs to filter the tasks.
17+
*
18+
* @returns A promise that resolves to an array of Task objects.
19+
* @note conditions: { task_id: { in: taskIds } }` for efficient filtering
20+
*/
21+
export async function getTasksWithSelectedTaskIds(selectedTaskIds: string[]): Promise<Tasks> {
22+
return await db.task.findMany({
23+
where: {
24+
task_id: { in: selectedTaskIds }, // SQL: WHERE task_id IN ('id1', 'id2', ...)
25+
},
26+
select: {
27+
contest_id: true,
28+
task_table_index: true,
29+
task_id: true,
30+
title: true,
31+
grade: true,
32+
},
33+
});
34+
}
35+
1436
export async function getTasksByTaskId(): Promise<Map<string, Task>> {
1537
const tasks = await db.task.findMany();
1638
const tasksMap = new Map();

0 commit comments

Comments
 (0)