Skip to content

Commit 5c9f228

Browse files
Merge pull request #28 from topcoder-platform/integration-v5-challenge-api
Integration v5 challenge api
2 parents d4566be + 4c6c140 commit 5c9f228

File tree

10 files changed

+99
-29
lines changed

10 files changed

+99
-29
lines changed

config/default.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,4 +401,9 @@ module.exports = {
401401
TC_EDU_ARTICLES_PATH: '/articles',
402402
TC_EDU_SEARCH_PATH: '/search',
403403
TC_EDU_SEARCH_BAR_MAX_RESULTS_EACH_GROUP: 3,
404+
405+
ENV: {
406+
HOST: process.env.HOST,
407+
PORT: process.env.PORT,
408+
},
404409
};

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@
135135
"tc-accounts": "git+https://github.com/appirio-tech/accounts-app.git#dev",
136136
"tc-core-library-js": "github:appirio-tech/tc-core-library-js#v2.6.3",
137137
"tc-ui": "^1.0.12",
138-
"topcoder-react-lib": "1000.19.13",
138+
"topcoder-react-lib": "1000.19.14",
139139
"topcoder-react-ui-kit": "^1.0.11",
140140
"topcoder-react-utils": "0.7.8",
141141
"turndown": "^4.0.2",

src/server/index.js

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Application from 'shared';
99
import config from 'config';
1010
import express from 'express';
1111
import fetch from 'isomorphic-fetch';
12-
import { logger } from 'topcoder-react-lib';
12+
import { logger, services } from 'topcoder-react-lib';
1313
import fs from 'fs';
1414
import moment from 'moment';
1515
import path from 'path';
@@ -145,6 +145,69 @@ async function onExpressJsSetup(server) {
145145
tcCommunitiesDemoApi,
146146
);
147147

148+
// Get roleId by name
149+
server.use(
150+
'/community-app-assets/api/challenges/roleId',
151+
async (req, res, next) => {
152+
let tokenM2M = '';
153+
try {
154+
tokenM2M = await services.api.getTcM2mToken();
155+
} catch (err) {
156+
logger.error('proxyApi-roleId-getTcM2mToken : ', err);
157+
}
158+
159+
const params = {
160+
name: req.query.name,
161+
isActive: true,
162+
};
163+
const url = `${config.API.V5}/resource-roles?${qs.stringify(params)}`;
164+
try {
165+
let data = await fetch(url, {
166+
headers: { Authorization: `Bearer ${tokenM2M}` },
167+
});
168+
data = await data.text();
169+
res.send(data);
170+
} catch (err) {
171+
next(err);
172+
}
173+
},
174+
);
175+
176+
// Get registrants from challenge
177+
server.use(
178+
'/community-app-assets/api/challenges/:challengeId/registrants',
179+
async (req, res, next) => {
180+
let tokenM2M = '';
181+
let roleId = '';
182+
try {
183+
tokenM2M = await services.api.getTcM2mToken();
184+
} catch (err) {
185+
logger.error('proxyApi-registrants-getTcM2mToken : ', err);
186+
}
187+
188+
try {
189+
roleId = await services.challenge.getService().getRoleId('Submitter');
190+
} catch (err) {
191+
logger.error('proxyApi-registrants-getRoleId : ', err);
192+
}
193+
194+
const params = {
195+
challengeId: req.params.challengeId,
196+
roleId,
197+
};
198+
const url = `${config.API.V5}/resources?${qs.stringify(params)}`;
199+
try {
200+
let data = await fetch(url, {
201+
headers: { Authorization: `Bearer ${tokenM2M}` },
202+
});
203+
data = await data.text();
204+
res.send(data);
205+
} catch (err) {
206+
next(err);
207+
}
208+
},
209+
);
210+
148211
server.use(
149212
'/community-app-assets/api/edit-contentful-entry/:id',
150213
(req, res) => res.redirect(`${CMS_BASE_URL}/entries/${req.params.id}`),

src/shared/components/challenge-detail/Specification/index.jsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,9 @@ export default function ChallengeDetailsView(props) {
214214
description
215215
&& (
216216
<article>
217+
<h2 styleName="h2">
218+
Challenge Summary
219+
</h2>
217220
{
218221
editMode ? (
219222
<Editor
@@ -229,6 +232,15 @@ export default function ChallengeDetailsView(props) {
229232
/>
230233
)
231234
}
235+
<p styleName="p" />
236+
<p styleName="p note">
237+
Please read the challenge specification carefully and
238+
watch the forums for any questions or feedback
239+
concerning this challenge. It is important that you
240+
monitor any updates provided by the client or Studio
241+
Admins in the forums. Please post any questions you
242+
might have for the client in the forums.
243+
</p>
232244
</article>
233245
)
234246
}

src/shared/components/challenge-detail/Winners/Winner/index.jsx

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ function getId(submissions, placement) {
1515
export default function Winner({
1616
isDesign,
1717
last,
18-
pointPrizes,
1918
prizes,
2019
submissions,
2120
viewable,
@@ -32,12 +31,9 @@ export default function Winner({
3231
encodeURIComponent(avatarUrl)}?size=65`;
3332
}
3433

35-
const pair = [];
36-
const prizeIndex = winner.placement - 1;
37-
if (prizes[prizeIndex]) pair.push(prizes[prizeIndex].toLocaleString());
38-
if (pointPrizes[prizeIndex]) pair.push(`${pointPrizes[prizeIndex]}pts`);
39-
40-
const prize = pair.join(' + ') || 'N/A';
34+
let prize = 'N/A';
35+
const prizeIndex = parseInt(winner.placement, 10) - 1;
36+
if (prizes[prizeIndex]) prize = prizes[prizeIndex].value;
4137

4238
return (
4339
<div styleName={`winner ${placeStyle}`}>
@@ -125,14 +121,12 @@ export default function Winner({
125121
}
126122

127123
Winner.defaultProps = {
128-
pointPrizes: [],
129124
prizes: [],
130125
};
131126

132127
Winner.propTypes = {
133128
isDesign: PT.bool.isRequired,
134129
last: PT.bool.isRequired,
135-
pointPrizes: PT.arrayOf(PT.number),
136130
prizes: PT.arrayOf(PT.number),
137131
submissions: PT.arrayOf(PT.object).isRequired,
138132
viewable: PT.bool.isRequired,

src/shared/components/challenge-detail/Winners/index.jsx

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import './style.scss';
1010

1111
export default function Winners({
1212
winners,
13-
pointPrizes,
1413
prizes,
1514
submissions,
1615
viewable,
@@ -24,7 +23,6 @@ export default function Winners({
2423
isDesign={isDesign}
2524
key={`${w.handle}-${w.placement}`}
2625
last={index === winners.length - 1}
27-
pointPrizes={pointPrizes}
2826
prizes={prizes}
2927
submissions={submissions}
3028
viewable={viewable}
@@ -38,7 +36,6 @@ export default function Winners({
3836

3937
Winners.defaultProps = {
4038
winners: [],
41-
pointPrizes: [],
4239
prizes: [],
4340
submissions: [],
4441
viewable: false,
@@ -47,7 +44,6 @@ Winners.defaultProps = {
4744

4845
Winners.propTypes = {
4946
winners: PT.arrayOf(PT.shape()),
50-
pointPrizes: PT.arrayOf(PT.number),
5147
prizes: PT.arrayOf(PT.number),
5248
submissions: PT.arrayOf(PT.shape()),
5349
viewable: PT.bool,

src/shared/containers/SubmissionManagement/index.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class SubmissionManagementPageContainer extends React.Component {
6565
showModal,
6666
toBeDeletedId,
6767
} = this.props;
68-
const isRegistered = registrants.find(r => _.toString(r.handle) === _.toString(handle));
68+
const isRegistered = registrants.find(r => _.toString(r.memberHandle) === _.toString(handle));
6969
if (!isRegistered) return <AccessDenied redirectLink={`${challengesUrl}/${challenge.id}`} cause={ACCESS_DENIED_REASON.HAVE_NOT_SUBMITTED_TO_THE_CHALLENGE} />;
7070

7171
const isEmpty = _.isEmpty(challenge);

src/shared/containers/SubmissionPage.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class SubmissionsPageContainer extends React.Component {
5353

5454
render() {
5555
const { registrants, handle, challengeId } = this.props;
56-
const isRegistered = registrants.find(r => _.toString(r.handle) === _.toString(handle));
56+
const isRegistered = registrants.find(r => _.toString(r.memberHandle) === _.toString(handle));
5757
if (!isRegistered) {
5858
return (
5959
<React.Fragment>

src/shared/containers/challenge-detail/index.jsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,8 @@ function getOgImage(challenge, challengeTypes) {
112112
}
113113
}
114114

115-
function isRegistered(details, registrants, handle) {
116-
if (details && details.roles && details.roles.includes('Submitter')) {
117-
return true;
118-
}
119-
if (_.find(registrants, r => _.toString(r.handle) === _.toString(handle))) {
115+
function isRegistered(registrants, handle) {
116+
if (_.find(registrants, r => _.toString(r.memberHandle) === _.toString(handle))) {
120117
return true;
121118
}
122119
return false;
@@ -398,7 +395,6 @@ class ChallengeDetailPageContainer extends React.Component {
398395
const isLegacyMM = isMM(challenge) && Boolean(challenge.roundId);
399396

400397
const hasRegistered = isRegistered(
401-
challenge.userDetails,
402398
challenge.registrants,
403399
(auth.user || {}).handle,
404400
);
@@ -427,6 +423,12 @@ class ChallengeDetailPageContainer extends React.Component {
427423
|| (_.get(phases, 'submission.phaseStatus') !== 'Open'
428424
&& _.get(phases, 'checkpointSubmission.phaseStatus') !== 'Open');
429425

426+
const { prizeSets } = challenge;
427+
let challengePrizes = [];
428+
if (prizeSets && prizeSets[0] && prizeSets[0].type === 'placement') {
429+
challengePrizes = prizeSets[0].prizes;
430+
}
431+
430432
return (
431433
<div styleName="outer-container">
432434
<div styleName="challenge-detail-container" role="main">
@@ -585,8 +587,7 @@ class ChallengeDetailPageContainer extends React.Component {
585587
&& (
586588
<Winners
587589
winners={winners}
588-
pointPrizes={challenge.pointPrizes}
589-
prizes={challenge.prizes}
590+
prizes={challengePrizes}
590591
viewable={submissionsViewable ? submissionsViewable.value === 'true' : false}
591592
submissions={challenge.submissions}
592593
isDesign={track.toLowerCase() === 'design'}

src/shared/utils/challenge-detail/helper.jsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,14 +202,13 @@ export function getDisplayRecommendedChallenges(
202202
const displayRecommendedChallenges = recommendedChallenges[recommendedTag]
203203
? recommendedChallenges[recommendedTag].challenges : [];
204204
const filterParams = getBuckets(null)[BUCKETS.OPEN_FOR_REGISTRATION].filter;
205-
const userHandle = _.get(auth.user, 'handle');
205+
const userId = _.get(auth.user, 'userId');
206206
const filter = Filter.getFilterFunction(filterParams);
207207

208208
let results = _.filter(displayRecommendedChallenges, (c) => {
209209
let isValid = filter(c);
210-
if (isValid && userHandle) {
211-
// TODO: Find equivalent of !c.users[userHandle]
212-
isValid = c.id !== challenge.id;
210+
if (isValid && userId) {
211+
isValid = !c.users[userId] && c.id !== challenge.id;
213212
}
214213
return isValid;
215214
});

0 commit comments

Comments
 (0)