Add job score calculation
This commit is contained in:
@@ -38,6 +38,7 @@ export class JobsController {
|
||||
todoCount: await this.jobsService.getTodoItemCount(jobName),
|
||||
claimedCount: await this.jobsService.getClaimedItemCount(jobName),
|
||||
doneCount: await this.jobsService.getDoneItemCount(jobName),
|
||||
doneScore: await this.jobsService.getDoneItemScoresTotal(jobName),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -50,6 +51,7 @@ export class JobsController {
|
||||
todoCount: await this.jobsService.getTodoItemCount(jobName),
|
||||
claimedCount: await this.jobsService.getClaimedItemCount(jobName),
|
||||
doneCount: await this.jobsService.getDoneItemCount(jobName),
|
||||
doneScore: await this.jobsService.getDoneItemScoresTotal(jobName),
|
||||
};
|
||||
}
|
||||
|
||||
|
@@ -19,7 +19,11 @@ export const privateMetadataKeys = ['claimSecret'];
|
||||
|
||||
export type PublicJobMetadata = Omit<JobMetadata, typeof privateMetadataKeys[number]>;
|
||||
|
||||
type Leaderboard = { completeCounts: { [claimer: string]: number }, claimCounts: { [claimer: string]: number } }
|
||||
type Leaderboard = {
|
||||
completeCounts: { [claimer: string]: number },
|
||||
claimCounts: { [claimer: string]: number }
|
||||
doneScores: { [claimer: string]: number }
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
export class JobsService {
|
||||
@@ -104,8 +108,9 @@ export class JobsService {
|
||||
}
|
||||
const completeCounts = await this.getCompleteCounts(jobName);
|
||||
const claimCounts = await this.getClaimCounts(jobName);
|
||||
this.cacheManager.set(`leaderboard:${jobName}`, { completeCounts, claimCounts }, 200);
|
||||
return { completeCounts, claimCounts };
|
||||
const doneScores = await this.getDoneItemScores(jobName);
|
||||
this.cacheManager.set(`leaderboard:${jobName}`, { completeCounts, claimCounts, doneScores }, 200);
|
||||
return { completeCounts, claimCounts, doneScores };
|
||||
}
|
||||
|
||||
|
||||
@@ -160,6 +165,25 @@ export class JobsService {
|
||||
return this.redis.llen(this.doneListNameBuilder(jobName));
|
||||
}
|
||||
|
||||
async getDoneItemScoresTotal(jobName: string) {
|
||||
const doneItems = await this.getDoneItems(jobName);
|
||||
const scores = doneItems.map(item => JSON.parse(item).data?.score || 1);
|
||||
return scores.reduce((acc: number, val: number) => acc + val, 0);
|
||||
}
|
||||
|
||||
// Sum the "score" property of each item in the done list and
|
||||
// accumulate based on claimer
|
||||
async getDoneItemScores(jobName: string) {
|
||||
const doneItems = await this.getDoneItems(jobName);
|
||||
const scores = doneItems.map(item => JSON.parse(item).data?.score || 1);
|
||||
const claimers = doneItems.map(item => JSON.parse(item).client);
|
||||
const scoreMap = claimers.reduce((acc: any, val: any, idx: number) => {
|
||||
acc[val] = (acc[val] || 0) + scores[idx];
|
||||
return acc;
|
||||
}, {});
|
||||
return scoreMap;
|
||||
}
|
||||
|
||||
async getJobs() {
|
||||
return this.redis.keys('job:*');
|
||||
}
|
||||
|
Reference in New Issue
Block a user