Skip to content
This repository was archived by the owner on Jan 23, 2025. It is now read-only.

Commit 7214181

Browse files
Merge branch 'develop' into refactor-proc
2 parents ee7956c + eef5e98 commit 7214181

File tree

5 files changed

+171
-15
lines changed

5 files changed

+171
-15
lines changed

config/default.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,5 +72,9 @@ module.exports = {
7272
LEGACY_TERMS_NDA_ID: process.env.LEGACY_TERMS_NDA_ID || 21343,
7373
LEGACY_SUBMITTER_ROLE_ID: process.env.LEGACY_SUBMITTER_ROLE_ID || 1,
7474

75-
COPILOT_PAYMENT_TYPE: process.env.COPILOT_PAYMENT_TYPE || 'copilot'
75+
COPILOT_PAYMENT_TYPE: process.env.COPILOT_PAYMENT_TYPE || 'copilot',
76+
77+
// V5 Term UUID
78+
SYNC_V5_TERM_UUID: process.env.SYNC_V5_TERM_UUID || '317cd8f9-d66c-4f2a-8774-63c612d99cd4',
79+
SYNC_V5_WRITE_ENABLED: process.env.SYNC_V5_WRITE_ENABLED === 'true' || false
7680
}

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
"lint:fix": "standard --fix",
1010
"mock-api": "NODE_ENV=test node test/mock/mock",
1111
"test": "nyc --reporter=html --reporter=text mocha test/unit/test.js --timeout 20000 --exit",
12-
"e2e": "nyc --reporter=html --reporter=text mocha test/e2e/test.js --timeout 20000 --exit"
12+
"e2e": "nyc --reporter=html --reporter=text mocha test/e2e/test.js --timeout 20000 --exit",
13+
"sync-terms": "node src/scripts/sync-terms.js"
1314
},
1415
"repository": "https://github.com/topcoder-platform/legacy-challenge-processor",
1516
"author": "TCSCODER",

src/scripts/sync-terms.js

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
require('../bootstrap')
2+
const util = require('util')
3+
const config = require('config')
4+
const request = require('superagent')
5+
const _ = require('lodash')
6+
const logger = require('../common/logger')
7+
const helper = require('../common/helper')
8+
9+
const QUERY_GET_ENTRIES = 'SELECT user_id FROM user_terms_of_use_xref WHERE terms_of_use_id = %d'
10+
const QUERY_INSERT_ENTRY = 'INSERT INTO user_terms_of_use_xref (user_id, terms_of_use_id, create_date, modify_date) VALUES (?, ?, CURRENT, CURRENT)'
11+
12+
/**
13+
* Prepare Informix statement
14+
* @param {Object} connection the Informix connection
15+
* @param {String} sql the sql
16+
* @return {Object} Informix statement
17+
*/
18+
async function prepare (connection, sql) {
19+
// logger.debug(`Preparing SQL ${sql}`)
20+
const stmt = await connection.prepareAsync(sql)
21+
return Promise.promisifyAll(stmt)
22+
}
23+
24+
/**
25+
* Gets the entries from ifx
26+
* @param {Number} termsOfUseId the legacy terms of use ID
27+
*/
28+
async function getTermsFromIfx (termsOfUseId) {
29+
const connection = await helper.getInformixConnection()
30+
let result = null
31+
try {
32+
result = await connection.queryAsync(util.format(QUERY_GET_ENTRIES, termsOfUseId))
33+
} catch (e) {
34+
logger.error(`Error in 'getTermsFromIfx' ${e}`)
35+
throw e
36+
} finally {
37+
await connection.closeAsync()
38+
}
39+
return _.map(result, r => _.toInteger(r.user_id))
40+
}
41+
42+
/**
43+
* Creates a new entry in IFX
44+
* @param {Number} termsOfUseId the legacy terms of use ID
45+
* @param {Number} memberId the member ID
46+
*/
47+
async function createEntry (termsOfUseId, memberId) {
48+
const connection = await helper.getInformixConnection()
49+
let result = null
50+
try {
51+
// await connection.beginTransactionAsync()
52+
const query = await prepare(connection, QUERY_INSERT_ENTRY)
53+
if (config.SYNC_V5_WRITE_ENABLED) {
54+
result = await query.executeAsync([memberId, termsOfUseId])
55+
} else {
56+
logger.debug(`INSERT INTO user_terms_of_use_xref (user_id, terms_of_use_id, create_date, modify_date) VALUES (${memberId}, ${termsOfUseId}, CURRENT, CURRENT)`)
57+
}
58+
// await connection.commitTransactionAsync()
59+
} catch (e) {
60+
logger.error(`Error in 'createEntry' ${e}, rolling back transaction`)
61+
await connection.rollbackTransactionAsync()
62+
throw e
63+
} finally {
64+
logger.info(`Entry for term ${termsOfUseId} and member ${memberId} has been created`)
65+
await connection.closeAsync()
66+
}
67+
return result
68+
}
69+
70+
/**
71+
* Gets all paginated results from `/terms/:id/users`
72+
* @param {String} m2mToken the m2m token
73+
*/
74+
async function getAllTermUsers (m2mToken) {
75+
let allData = []
76+
// get search is paginated, we need to get all pages' data
77+
let page = 1
78+
while (true) {
79+
const result = await request
80+
.get(`${config.V5_TERMS_API_URL}/${config.SYNC_V5_TERM_UUID}/users`)
81+
.query({ page, perPage: 100 })
82+
.set('Authorization', `Bearer ${m2mToken}`)
83+
.set('Content-Type', 'application/json')
84+
.set('Accept', 'application/json')
85+
86+
const users = _.get(result, 'body.result', [])
87+
if (users.length === 0) {
88+
break
89+
}
90+
allData = allData.concat(users)
91+
page += 1
92+
if (result.headers['x-total-pages'] && page > Number(result.headers['x-total-pages'])) {
93+
break
94+
}
95+
}
96+
return allData
97+
}
98+
99+
/**
100+
* Application entry point
101+
*/
102+
async function main () {
103+
try {
104+
const m2mToken = await helper.getM2MToken()
105+
logger.info(`Fetching details for term ${config.SYNC_V5_TERM_UUID}`)
106+
const res = await helper.getRequest(`${config.V5_TERMS_API_URL}/${config.SYNC_V5_TERM_UUID}`, m2mToken)
107+
const legacyTermId = _.get(res, 'body.legacyId')
108+
if (!legacyTermId) {
109+
throw new Error(`Term ${config.SYNC_V5_TERM_UUID} does not have a legacyId`)
110+
}
111+
logger.info(`Fetching users that have agreed to ${config.SYNC_V5_TERM_UUID}`)
112+
const v5Entries = await getAllTermUsers(m2mToken)
113+
logger.debug(`Found ${v5Entries.length} users`)
114+
115+
logger.info(`Fetching users from legacy for ID: ${legacyTermId}`)
116+
const legacyIntries = await getTermsFromIfx(legacyTermId)
117+
logger.debug(`Found ${legacyIntries.length} users`)
118+
for (const memberId of v5Entries) {
119+
if (legacyIntries.indexOf(memberId) === -1) {
120+
await createEntry(legacyTermId, memberId)
121+
}
122+
}
123+
logger.info('Completed!')
124+
} catch (e) {
125+
logger.logFullError(e)
126+
}
127+
}
128+
129+
main()

src/services/ProcessorService.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -141,22 +141,16 @@ async function associateChallengeGroups (toBeAdded = [], toBeDeleted = [], legac
141141
* @param {Array<Object{termsId, roleId}>} toBeDeleted the array of terms to be deleted
142142
* @param {String|Number} legacyChallengeId the legacy challenge ID
143143
*/
144-
async function associateChallengeTerms (v5Terms, legacyChallengeId) {
144+
async function associateChallengeTerms (v5Terms, legacyChallengeId, createdBy, updatedBy) {
145145
const nda = _.find(v5Terms, e => e.id === config.V5_TERMS_NDA_ID)
146146
const legacyTermsArray = await termsService.getTermsForChallenge(legacyChallengeId)
147147
const legacyNDA = _.find(legacyTermsArray, e => _.toNumber(e.id) === _.toNumber(config.LEGACY_TERMS_NDA_ID))
148148

149-
// logger.debug(`V5 Terms ${JSON.stringify(v5Terms)}`)
150-
// logger.debug(`V5 NDA Found ${nda} ${JSON.stringify(nda)}`)
151-
152-
// logger.debug(`Legacy Terms ${JSON.stringify(legacyTermsArray)}`)
153-
// logger.debug(`Legacy NDA Found ${JSON.stringify(legacyNDA)}`)
154-
155149
if (nda && nda.id && !legacyNDA) {
156150
logger.debug('Associate Challenge Terms - v5 NDA exist, not in legacy. Adding to Legacy.')
157151
const m2mToken = await helper.getM2MToken()
158152
const v5Term = await getV5Terms(nda.id, m2mToken)
159-
return termsService.addTermsToChallenge(legacyChallengeId, v5Term.legacyId, config.LEGACY_SUBMITTER_ROLE_ID)
153+
return termsService.addTermsToChallenge(legacyChallengeId, v5Term.legacyId, config.LEGACY_SUBMITTER_ROLE_ID, createdBy, updatedBy)
160154
}
161155

162156
if (!nda && legacyNDA && legacyNDA.id) {
@@ -566,6 +560,9 @@ async function processUpdate (message) {
566560
// Only make the PUT request to the API if the challenge was available on the V4 API otherwise this will throw an error
567561
await helper.putRequest(`${config.V4_CHALLENGE_API_URL}/${message.payload.legacyId}`, { param: _.omit(saveDraftContestDTO, ['groupsToBeAdded', 'groupsToBeDeleted']) }, m2mToken)
568562
}
563+
await associateChallengeGroups(saveDraftContestDTO.groupsToBeAdded, saveDraftContestDTO.groupsToBeDeleted, message.payload.legacyId)
564+
await associateChallengeTerms(message.payload.terms, message.payload.legacyId, _.get(message, 'payload.createdBy'), _.get(message, 'payload.updatedBy'))
565+
await setCopilotPayment(message.payload.legacyId, _.get(message, 'payload.prizeSets'), _.get(message, 'payload.createdBy'), _.get(message, 'payload.updatedBy'))
569566

570567
// Handle activating challenges and closing out tasks
571568
if (message.payload.status) {

src/services/termsService.js

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
const logger = require('../common/logger')
22
const _ = require('lodash')
33
const util = require('util')
4+
const config = require('config')
45
const helper = require('../common/helper')
56

7+
68
const QUERY_GET_CHALLENGE_TERMS = 'SELECT resource_role_id, terms_of_use_id FROM project_role_terms_of_use_xref WHERE project_id = %d'
79
const QUERY_INSERT_CHALLENGE_TERMS = `INSERT INTO project_role_terms_of_use_xref
810
(project_id, resource_role_id, terms_of_use_id, create_date, modify_date, sort_order, group_ind)
911
VALUES (?, ?, ?, CURRENT, CURRENT, 1, 0)`
12+
13+
const QUERY_INSERT_PROJECT_INFO_CHALLENGE_TERMS = `INSERT INTO project_info
14+
(project_id, project_info_type_id, value, create_user, create_date, modify_user, modify_date)
15+
VALUES (?, 34, ?, ?, CURRENT, ?, CURRENT)`
1016
const QUERY_DELETE_CHALLENGE_TERMS = 'DELETE FROM project_role_terms_of_use_xref WHERE project_id = ? AND resource_role_id = ? AND terms_of_use_id = ?'
17+
const QUERY_DELETE_PROJECT_INFO_CHALLENGE_TERMS = 'DELETE FROM project_info WHERE project_id = ? AND project_info_type_id = 34'
1118

1219
/**
1320
* Prepare Informix statement
@@ -36,14 +43,28 @@ async function getTermsForChallenge (challengeLegacyId) {
3643
return _.map(result, r => ({ id: r.terms_of_use_id, roleId: r.resource_role_id }))
3744
}
3845

39-
async function addTermsToChallenge (challengeLegacyId, legacyTermsId, legacyResourceRoleId) {
46+
async function addTermsToChallenge (challengeLegacyId, legacyTermsId, legacyResourceRoleId, createdBy, updatedBy) {
4047
const connection = await helper.getInformixConnection()
4148
let result = null
4249
try {
43-
// await connection.beginTransactionAsync()
50+
logger.debug(`Creating Terms ${legacyTermsId} for Challenge ${challengeLegacyId}`)
51+
await connection.beginTransactionAsync()
52+
// create association
4453
const query = await prepare(connection, QUERY_INSERT_CHALLENGE_TERMS)
4554
result = await query.executeAsync([challengeLegacyId, legacyResourceRoleId, legacyTermsId])
46-
// await connection.commitTransactionAsync()
55+
56+
logger.debug(`Creating Terms - deleting project info record for ${challengeLegacyId}`)
57+
// make sure there are no project info records
58+
const piqueryDelete = await prepare(connection, QUERY_DELETE_PROJECT_INFO_CHALLENGE_TERMS)
59+
await piqueryDelete.executeAsync([challengeLegacyId])
60+
61+
logger.debug(`Creating Terms - adding project info record for ${challengeLegacyId} ${legacyTermsId} === ${config.LEGACY_TERMS_NDA_ID}`)
62+
// add the project info record for the `Confidentiality Type`
63+
const termsProjectInfoValue = (legacyTermsId.toString() === config.LEGACY_TERMS_NDA_ID.toString()) ? 'standard_cca' : 'public'
64+
const piquery = await prepare(connection, QUERY_INSERT_PROJECT_INFO_CHALLENGE_TERMS)
65+
await piquery.executeAsync([challengeLegacyId, termsProjectInfoValue, createdBy, updatedBy])
66+
67+
await connection.commitTransactionAsync()
4768
} catch (e) {
4869
logger.error(`Error in 'addTermsToChallenge' ${e}, rolling back transaction`)
4970
await connection.rollbackTransactionAsync()
@@ -59,10 +80,14 @@ async function removeTermsFromChallenge (challengeLegacyId, legacyTermsId, legac
5980
const connection = await helper.getInformixConnection()
6081
let result = null
6182
try {
62-
// await connection.beginTransactionAsync()
83+
await connection.beginTransactionAsync()
6384
const query = await prepare(connection, QUERY_DELETE_CHALLENGE_TERMS)
6485
result = await query.executeAsync([challengeLegacyId, legacyResourceRoleId, legacyTermsId])
65-
// await connection.commitTransactionAsync()
86+
87+
const piquery = await prepare(connection, QUERY_DELETE_PROJECT_INFO_CHALLENGE_TERMS)
88+
await piquery.executeAsync([challengeLegacyId])
89+
90+
await connection.commitTransactionAsync()
6691
} catch (e) {
6792
logger.error(`Error in 'removeTermsFromChallenge' ${e}, rolling back transaction`)
6893
await connection.rollbackTransactionAsync()

0 commit comments

Comments
 (0)