@@ -15,6 +15,81 @@ const termsService = require('./termsService')
15
15
const copilotPaymentService = require ( './copilotPaymentService' )
16
16
const timelineService = require ( './timelineService' )
17
17
const 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
+ }
18
93
19
94
/**
20
95
* Get group information by V5 UUID
@@ -544,9 +619,6 @@ async function processUpdate (message) {
544
619
logger . warn ( 'Failed to update the challenge via the V4 API' )
545
620
logger . error ( e )
546
621
}
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 )
550
622
551
623
// Update metadata in IFX
552
624
if ( message . payload . metadata && message . payload . metadata . length > 0 ) {
@@ -595,6 +667,14 @@ async function processUpdate (message) {
595
667
}
596
668
}
597
669
}
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
+
598
678
try {
599
679
await helper . forceV4ESFeeder ( legacyId )
600
680
} catch ( e ) {
0 commit comments