Skip to content

Commit a2f2f34

Browse files
author
ruiichen
committed
finished first section
1 parent f142ce9 commit a2f2f34

File tree

4 files changed

+37
-21
lines changed

4 files changed

+37
-21
lines changed

backend/typescript/graphql/resolvers/reviewDashboardResolvers.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@ const reviewDashboardResolvers = {
2121
},
2222
},
2323
Mutation: {
24-
delegateReviewers: async (): Promise<ReviewedApplicantRecordDTO[]> => {
24+
delegateReviewers: async (
25+
_parent: undefined,
26+
args: { positions: string[] },
27+
): Promise<ReviewedApplicantRecordDTO[]> => {
2528
try {
26-
return await reviewDashboardService.delegateReviewers();
29+
return await reviewDashboardService.delegateReviewers(args.positions);
2730
} catch (error) {
2831
throw new Error(getErrorMessage(error));
2932
}

backend/typescript/graphql/types/reviewDashboardType.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const reviewDashboardType = gql`
2424
reviewers: [ReviewerDTO!]!
2525
totalScore: Int
2626
}
27-
27+
2828
type ReviewedApplicantRecordDTO {
2929
applicantRecordId: String!
3030
reviewerId: Int!
@@ -42,7 +42,7 @@ const reviewDashboardType = gql`
4242
}
4343
4444
extend type Mutation {
45-
delegateReviewers: [ReviewedApplicantRecordDTO!]!
45+
delegateReviewers(positions: [String!]!): [ReviewedApplicantRecordDTO!]!
4646
}
4747
`;
4848

backend/typescript/services/implementations/reviewDashboardService.ts

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,19 @@ import {
77
DesignPositionTitles,
88
ProductPositionTitles,
99
CommunityPositionTitles,
10+
CreateReviewedApplicantRecordDTO,
1011
} from "../../types";
1112
import IReviewDashboardService from "../interfaces/IReviewDashboardService";
1213
import { getErrorMessage } from "../../utilities/errorUtils";
1314
import logger from "../../utilities/logger";
1415
import ApplicantRecord from "../../models/applicantRecord.model";
1516
import User from "../../models/user.model";
17+
import ReviewedApplicantRecordService from "./reviewedApplicantRecordService";
1618

1719
const Logger = logger(__filename);
1820

21+
const reviewedApplicantRecordService = new ReviewedApplicantRecordService();
22+
1923
function toDTO(model: ApplicantRecord): ReviewDashboardRowDTO {
2024
return {
2125
firstName: model.applicant!.firstName,
@@ -83,11 +87,13 @@ class ReviewDashboardService implements IReviewDashboardService {
8387
}
8488
}
8589

86-
async delegateReviewers(): Promise<ReviewedApplicantRecordDTO[]> {
90+
async delegateReviewers(
91+
positions: string[],
92+
): Promise<ReviewedApplicantRecordDTO[]> {
8793
// NOTE: We do not have to concern ourselves with locality. That is, each user can be
8894
// assigned to the same partner every time.
8995

90-
const delegations = new Map<string, [string, string | undefined]>();
96+
const delegations = Array<CreateReviewedApplicantRecordDTO>();
9197
// maps (applicant_record_id) => pair of user_ids assigned to it
9298

9399
// STEP 1:
@@ -105,14 +111,14 @@ class ReviewDashboardService implements IReviewDashboardService {
105111
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
106112
const pos = user.position!;
107113
const arr = map.get(pos) ?? [];
108-
arr.push(user.id.toString());
114+
arr.push(user.id);
109115
map.set(pos, arr);
110116
return map;
111-
}, new Map<string, string[]>());
117+
}, new Map<string, number[]>());
112118

113119
// Build FSM
114120
// maps (position title) => (current index of list, list of users with position_title)
115-
const FSM = new Map<string, [number, (string | undefined)[]]>(
121+
const FSM = new Map<string, [number, (number | undefined)[]]>(
116122
[
117123
...EngineeringPositionTitles,
118124
...DesignPositionTitles,
@@ -166,23 +172,29 @@ class ReviewDashboardService implements IReviewDashboardService {
166172
newCount++;
167173
newCount %= FSM.get(record.position)![1].length;
168174
FSM.set(record.position, [newCount, userIds]);
169-
delegations.set(record.id, [assignedReviewer1!, assignedReviewer2]);
170-
/* eslint-enable @typescript-eslint/no-non-null-assertion */
171-
if (record.position === "Developer") {
172-
console.log(
173-
`Assigned reviewers for applicant ${record.id} (${record.position}):`,
174-
assignedReviewer1,
175-
"and",
176-
assignedReviewer2,
177-
);
175+
176+
if (assignedReviewer1 !== undefined) {
177+
delegations.push({
178+
applicantRecordId: record.id,
179+
reviewerId: assignedReviewer1,
180+
});
181+
}
182+
183+
if (assignedReviewer2 !== undefined) {
184+
delegations.push({
185+
applicantRecordId: record.id,
186+
reviewerId: assignedReviewer2,
187+
});
178188
}
179189
});
180190

181191
// STEP 3:
182192
// Batch the delegations into ReviewedApplicantRecords
183193
// NOTE: do not add the sentinel value we inserted earlier.
184-
185-
return [];
194+
console.log(delegations);
195+
return reviewedApplicantRecordService.bulkCreateReviewedApplicantRecord(
196+
delegations,
197+
);
186198
}
187199
}
188200

backend/typescript/services/interfaces/IReviewDashboardService.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ interface IReviewDashboardService {
1414
/**
1515
* Assigns each user to an applicant record to review, and
1616
* returns the newly created ReviewedApplicantRecords
17+
* @Param positions the list of positions the algorithm should run on
1718
*/
18-
delegateReviewers(): Promise<ReviewedApplicantRecordDTO[]>;
19+
delegateReviewers(positions: string[]): Promise<ReviewedApplicantRecordDTO[]>;
1920
}
2021

2122
export default IReviewDashboardService;

0 commit comments

Comments
 (0)