Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 126 additions & 0 deletions app/(api)/_actions/judges/updateJudgeWithTeams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
'use server';

import Team from '@typeDefs/team';
import Submission from '@typeDefs/submission';
import HttpError from '@utils/response/HttpError';

import { UpdateUser } from '@datalib/users/updateUser';
import { CreateSubmission } from '@datalib/submissions/createSubmission';
import { GetManySubmissions } from '@datalib/submissions/getSubmissions';
import { UpdateSubmission } from '@datalib/submissions/updateSubmission';
import { DeleteSubmission } from '@datalib/submissions/deleteSubmission';

export async function updateJudgeWithTeams(
judge_id: string,
body: any,
teams: Team[]
) {
try {
// update native fields in judge object
const updateRes = await UpdateUser(judge_id, body);
if (!updateRes.ok) {
throw new Error(updateRes.error ?? '');
}

// fetch all submissions the judge is responsible for
const judgeSubmissions = await GetManySubmissions({
judge_id: {
'*convertId': {
id: judge_id,
},
},
});
if (!judgeSubmissions.ok) {
throw new Error(judgeSubmissions?.error ?? '');
}

// create team_id[] for current state and future state for judge teams
const currentJudgeTeams: string[] = judgeSubmissions.body.map(
(submission: Submission) => submission.team_id.toString()
);

const newJudgeTeams = teams.map((team: Team) => team._id ?? '');

// maps team_id to queuePosition
const teamOrderMap = Object.fromEntries(
teams.map((team: Team, index: number) => [team._id, index])
);

// create lists of teams to perform: update, delete, create on
const updateList = newJudgeTeams.filter((id: string) =>
currentJudgeTeams.includes(id)
);

const deleteList = currentJudgeTeams.filter(
(id: string) => !newJudgeTeams.includes(id)
);

const createList = newJudgeTeams.filter(
(id: string) => !currentJudgeTeams.includes(id)
);

const updateSubmissionsResList = await Promise.all(
updateList.map((team_id) =>
UpdateSubmission(judge_id, team_id, {
$set: {
queuePosition: teamOrderMap[team_id],
},
})
)
);

if (!updateSubmissionsResList.every((res: any) => res.ok)) {
throw new Error(
'Some updates failed: \n' + JSON.stringify(updateSubmissionsResList)
);
}

const createSubmissionsResList = await Promise.all(
createList.map((team_id) =>
CreateSubmission({
judge_id: {
'*convertId': {
id: judge_id,
},
},
team_id: {
'*convertId': {
id: team_id,
},
},
queuePosition: teamOrderMap[team_id],
})
)
);

if (!createSubmissionsResList.every((res: any) => res.ok)) {
throw new Error(
'Some creates failed: \n' + JSON.stringify(createSubmissionsResList)
);
}

const deleteSubmissionResList = await Promise.all(
deleteList.map((team_id) => DeleteSubmission(judge_id, team_id))
);

if (!deleteSubmissionResList.every((res: any) => res.ok)) {
throw new Error(
'Some deletes failed: \n' + JSON.stringify(deleteSubmissionResList)
);
}

return {
ok: true,
body: {
updateRes,
updateSubmissionsResList,
createSubmissionsResList,
deleteSubmissionResList,
},
error: null,
};
} catch (e) {
const error = e as HttpError;
return { ok: false, body: null, error: error.message };
}
}
15 changes: 2 additions & 13 deletions app/(api)/_actions/submissions/createSubmission.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,6 @@

import { CreateSubmission } from '@datalib/submissions/createSubmission';

export async function createSubmission(judge_id: string, team_id: string) {
await CreateSubmission({
judge_id: {
'*convertId': {
id: judge_id,
},
},
team_id: {
'*convertId': {
id: team_id,
},
},
});
export async function createSubmission(body: object) {
return CreateSubmission(body);
}
11 changes: 9 additions & 2 deletions app/(api)/_actions/submissions/deleteSubmission.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
'use server';

import { DeleteManySubmissions } from '@datalib/submissions/deleteSubmission';
import {
DeleteManySubmissions,
DeleteSubmission,
} from '@datalib/submissions/deleteSubmission';
import parseAndReplace from '@utils/request/parseAndReplace';

export async function deleteSubmission(judge_id: string, team_id: string) {
return DeleteSubmission(judge_id, team_id);
}

export default async function deleteManySubmissions(query: object = {}) {
const newQuery = await parseAndReplace(query);
await DeleteManySubmissions(newQuery);
return DeleteManySubmissions(newQuery);
}
3 changes: 1 addition & 2 deletions app/(api)/_actions/submissions/updateSubmission.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
'use server';
import { UpdateSubmission } from '@datalib/submissions/updateSubmission';
import Submission from '@typeDefs/submission';

export default async function updateSubmission(
judge_id: string,
team_id: string,
body: Submission
body: any
) {
const { _id: _, judge_id: __, team_id: ___, ...rest } = body;

Expand Down
10 changes: 10 additions & 0 deletions app/(api)/_actions/teams/createTeam.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
'use server';

import { CreateManyTeams } from '@datalib/teams/createTeams';
import { revalidatePath } from 'next/cache';

export async function createTeam(body: object) {
const createdTeam = await CreateManyTeams([body]);
revalidatePath('/');
return createdTeam;
}
24 changes: 6 additions & 18 deletions app/(api)/_actions/teams/updateTeam.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,10 @@
'use server';

import { UpdateSubmission } from '@datalib/submissions/updateSubmission';
import { UpdateTeam } from '@datalib/teams/updateTeam';
import { revalidatePath } from 'next/cache';

export async function updateTeam(
judgeId: string,
teamId: string,
updateData: any
) {
try {
const result = await UpdateSubmission(judgeId, teamId, updateData);
return result;
} catch (error) {
console.error('Error updating team:', error);
return {
ok: false,
body: null,
error:
error instanceof Error ? error.message : 'An unknown error occurred',
};
}
export async function updateTeam(id: string, body: object) {
const updateRes = await UpdateTeam(id, body);
revalidatePath('/');
return updateRes;
}
Loading