@@ -15,6 +15,81 @@ const termsService = require('./termsService')
1515const copilotPaymentService = require ( './copilotPaymentService' )
1616const timelineService = require ( './timelineService' )
1717const metadataService = require ( './metadataService' )
18+ const paymentService = require ( './paymentService' )
19+
20+ /**
21+ * Sync the information from the v5 phases into legacy
22+ * @param {Number } legacyId the legacy challenge ID
23+ * @param {Array } v4Phases the v4 phases
24+ * @param {Array } v5Phases the v5 phases
25+ */
26+ async function syncChallengePhases ( legacyId , v5Phases ) {
27+ const phaseTypes = await timelineService . getPhaseTypes ( )
28+ const phasesFromIFx = await timelineService . getChallengePhases ( legacyId )
29+ for ( const phase of phasesFromIFx ) {
30+ const phaseName = _ . get ( _ . find ( phaseTypes , pt => pt . phase_type_id === phase . phase_type_id ) , 'name' )
31+ const v5Equivalent = _ . find ( v5Phases , p => p . name === phaseName )
32+ if ( v5Equivalent ) {
33+ // Compare duration and status
34+ if ( v5Equivalent . duration * 1000 !== phase . duration ||
35+ ( v5Equivalent . isOpen && _ . toInteger ( phase . phase_status_id ) === constants . PhaseStatusTypes . Closed ) ||
36+ ( ! v5Equivalent . isOpen && _ . toInteger ( phase . phase_status_id ) === constants . PhaseStatusTypes . Open ) ) {
37+ // update phase
38+ await timelineService . updatePhase (
39+ phase . project_phase_id ,
40+ legacyId ,
41+ v5Equivalent . scheduledStartDate ,
42+ v5Equivalent . scheduledEndDate ,
43+ v5Equivalent . duration * 1000 ,
44+ v5Equivalent . isOpen ? constants . PhaseStatusTypes . Open : constants . PhaseStatusTypes . Closed )
45+ }
46+ }
47+ }
48+ // TODO: What about iterative reviews? There can be many for the same challenge.
49+ // TODO: handle timeline template updates
50+ }
51+
52+ /**
53+ * Update the payments from v5 prize sets into legacy
54+ * @param {Number } legacyId the legacy challenge ID
55+ * @param {Array } v5PrizeSets the v5 prize sets
56+ * @param {String } createdBy the created by
57+ */
58+ async function updateMemberPayments ( legacyId , v5PrizeSets , createdBy ) {
59+ const prizesFromIfx = await paymentService . getChallengePrizes ( legacyId , constants . prizeTypesIds . Contest )
60+ const [ checkpointPrizesFromIfx ] = await paymentService . getChallengePrizes ( legacyId , constants . prizeTypesIds . Checkpoint )
61+ const v5Prizes = _ . map ( _ . get ( _ . find ( v5PrizeSets , p => p . type === constants . prizeSetTypes . ChallengePrizes ) , 'prizes' , [ ] ) , prize => prize . value )
62+ const v5CheckPointPrizes = _ . map ( _ . get ( _ . find ( v5PrizeSets , p => p . type === constants . prizeSetTypes . CheckPoint ) , 'prizes' , [ ] ) , prize => prize . value )
63+ // compare prizes
64+ if ( v5Prizes && v5Prizes . length > 0 ) {
65+ v5Prizes . sort ( ( a , b ) => b - a )
66+ for ( let i = 0 ; i < v5Prizes . length ; i += 1 ) {
67+ const ifxPrize = _ . find ( prizesFromIfx , p => p . place === i + 1 )
68+ if ( ifxPrize ) {
69+ if ( _ . toInteger ( ifxPrize . prize_amount ) !== v5Prizes [ i ] ) {
70+ await paymentService . updatePrize ( ifxPrize . prize_id , legacyId , v5Prizes [ i ] , 1 )
71+ }
72+ } else {
73+ await paymentService . createPrize ( legacyId , i + 1 , v5Prizes [ i ] , constants . prizeTypesIds . Contest , 1 , createdBy )
74+ }
75+ }
76+ if ( prizesFromIfx . length > v5Prizes . length ) {
77+ const prizesToDelete = _ . filter ( prizesFromIfx , p => p . place > v5Prizes . length )
78+ for ( const prizeToDelete of prizesToDelete ) {
79+ await paymentService . deletePrize ( legacyId , prizeToDelete . prize_id )
80+ }
81+ }
82+ }
83+ // compare checkpoint prizes
84+ if ( v5CheckPointPrizes && v5CheckPointPrizes . length > 0 ) {
85+ // we assume that all checkpoint prizes will be the same
86+ if ( v5CheckPointPrizes . length !== checkpointPrizesFromIfx . number_of_submissions || v5CheckPointPrizes [ 0 ] !== _ . toInteger ( checkpointPrizesFromIfx . prize_amount ) ) {
87+ await paymentService . updatePrize ( checkpointPrizesFromIfx . prize_id , legacyId , v5CheckPointPrizes [ 0 ] , v5CheckPointPrizes . length )
88+ }
89+ } else if ( checkpointPrizesFromIfx ) {
90+ await paymentService . deletePrize ( legacyId , checkpointPrizesFromIfx . prize_id )
91+ }
92+ }
1893
1994/**
2095 * Get group information by V5 UUID
@@ -544,9 +619,6 @@ async function processUpdate (message) {
544619 logger . warn ( 'Failed to update the challenge via the V4 API' )
545620 logger . error ( e )
546621 }
547- await associateChallengeGroups ( saveDraftContestDTO . groupsToBeAdded , saveDraftContestDTO . groupsToBeDeleted , legacyId )
548- await associateChallengeTerms ( message . payload . terms , legacyId , _ . get ( message , 'payload.createdBy' ) , _ . get ( message , 'payload.updatedBy' ) || _ . get ( message , 'payload.createdBy' ) )
549- await setCopilotPayment ( message . payload . id , legacyId , _ . get ( message , 'payload.prizeSets' ) , _ . get ( message , 'payload.createdBy' ) , _ . get ( message , 'payload.updatedBy' ) || _ . get ( message , 'payload.createdBy' ) , m2mToken )
550622
551623 // Update metadata in IFX
552624 if ( message . payload . metadata && message . payload . metadata . length > 0 ) {
@@ -595,6 +667,14 @@ async function processUpdate (message) {
595667 }
596668 }
597669 }
670+
671+ // Direct IFX modifications
672+ await syncChallengePhases ( message . payload . legacyId , message . payload . phases )
673+ await updateMemberPayments ( message . payload . legacyId , message . payload . prizeSets , _ . get ( message , 'payload.updatedBy' ) || _ . get ( message , 'payload.createdBy' ) )
674+ await associateChallengeGroups ( saveDraftContestDTO . groupsToBeAdded , saveDraftContestDTO . groupsToBeDeleted , legacyId )
675+ await associateChallengeTerms ( message . payload . terms , legacyId , _ . get ( message , 'payload.createdBy' ) , _ . get ( message , 'payload.updatedBy' ) || _ . get ( message , 'payload.createdBy' ) )
676+ await setCopilotPayment ( message . payload . id , legacyId , _ . get ( message , 'payload.prizeSets' ) , _ . get ( message , 'payload.createdBy' ) , _ . get ( message , 'payload.updatedBy' ) || _ . get ( message , 'payload.createdBy' ) , m2mToken )
677+
598678 try {
599679 await helper . forceV4ESFeeder ( legacyId )
600680 } catch ( e ) {
0 commit comments