diff --git a/src/api/challenges/challenges.service.ts b/src/api/challenges/challenges.service.ts index a2de29f..71e8d88 100644 --- a/src/api/challenges/challenges.service.ts +++ b/src/api/challenges/challenges.service.ts @@ -2,7 +2,12 @@ import { includes, isEmpty, find, camelCase, groupBy, orderBy } from 'lodash'; import { Injectable } from '@nestjs/common'; import { ENV_CONFIG } from 'src/config'; import { Logger } from 'src/shared/global'; -import { Challenge, ChallengeResource, ResourceRole } from './models'; +import { + Challenge, + ChallengeResource, + ChallengeSubmission, + ResourceRole, +} from './models'; import { BillingAccountsService } from 'src/shared/topcoder/billing-accounts.service'; import { TopcoderM2MService } from 'src/shared/topcoder/topcoder-m2m.service'; import { ChallengeStatuses } from 'src/dto/challenge.dto'; @@ -36,7 +41,6 @@ export class ChallengesService { try { const challenge = await this.m2MService.m2mFetch(requestUrl); - this.logger.log(JSON.stringify(challenge, null, 2)); return challenge; } catch (e) { this.logger.error( @@ -46,6 +50,24 @@ export class ChallengesService { } } + async getChallengeSubmissionsCount(challengeId: string) { + const requestUrl = `${TOPCODER_API_V6_BASE_URL}/submissions?challengeId=${challengeId}&perPage=9999`; + + try { + const submissions = + await this.m2MService.m2mFetch(requestUrl); + const uniqueSubmissions = Object.fromEntries( + submissions.map((s) => [s.memberId, s]), + ); + return Object.keys(uniqueSubmissions).length; + } catch (e) { + this.logger.error( + `Challenge submissions couldn't be fetched for challenge ${challengeId}!`, + e, + ); + } + } + async getChallengeResources(challengeId: string) { try { const resources = await this.m2MService.m2mFetch( @@ -149,6 +171,8 @@ export class ChallengesService { // generate reviewer payments const firstPlacePrize = placementPrizes?.[0]?.value ?? 0; const challengeReviewer = find(reviewers, { isMemberReview: true }); + const numOfSubmissions = + (await this.getChallengeSubmissionsCount(challenge.id)) ?? 1; if (challengeReviewer && challengeResources.reviewer) { challengeResources.reviewer?.forEach((reviewer) => { @@ -160,7 +184,7 @@ export class ChallengesService { (challengeReviewer.baseCoefficient ?? 0) * firstPlacePrize + (challengeReviewer.incrementalCoefficient ?? 0) * firstPlacePrize * - challenge.numOfSubmissions, + numOfSubmissions, ), type: WinningsCategory.REVIEW_BOARD_PAYMENT, }); @@ -246,9 +270,16 @@ export class ChallengesService { } await Promise.all( - payments.map((p) => - this.winningsService.createWinningWithPayments(p, userId), - ), + payments.map(async (p) => { + try { + await this.winningsService.createWinningWithPayments(p, userId); + } catch (e) { + this.logger.log( + `Failed to create winnings payment for user ${p.winnerId}!`, + e, + ); + } + }), ); this.logger.log('Task Completed. locking consumed budget', baValidation); diff --git a/src/api/challenges/models/challenge.ts b/src/api/challenges/models/challenge.ts index 175717b..28d9fa7 100644 --- a/src/api/challenges/models/challenge.ts +++ b/src/api/challenges/models/challenge.ts @@ -142,3 +142,9 @@ export interface ResourceRole { id: string; name: string; } + +export interface ChallengeSubmission { + id: string; + memberId: string; + type: 'CONTEST_SUBMISSION'; +} diff --git a/src/api/winnings/winnings.service.ts b/src/api/winnings/winnings.service.ts index 903fd96..b4b969a 100644 --- a/src/api/winnings/winnings.service.ts +++ b/src/api/winnings/winnings.service.ts @@ -56,7 +56,7 @@ export class WinningsService { } this.logger.debug( - `Member info retrieved successfully for user handle: ${userId}`, + `Member info retrieved successfully for user: ${userId}`, { member }, ); @@ -142,7 +142,7 @@ export class WinningsService { const result = new ResponseDto(); this.logger.debug( - `Creating winning with payments for user ${userId}`, + `Creating winning with payments for user ${body.winnerId}`, body, ); @@ -186,7 +186,7 @@ export class WinningsService { ); const isIdentityVerified = await this.identityVerificationRepo.completedIdentityVerification( - userId, + body.winnerId, ); for (const detail of body.details || []) {