diff --git a/Dockerfile b/Dockerfile index b82836be68..de3ab09f79 100644 --- a/Dockerfile +++ b/Dockerfile @@ -171,4 +171,3 @@ RUN npm run build EXPOSE 3000 CMD ["npm", "start"] - diff --git a/__tests__/shared/components/Header/__snapshots__/index.jsx.snap b/__tests__/shared/components/Header/__snapshots__/index.jsx.snap index 2b1282b6d4..002a344ad4 100644 --- a/__tests__/shared/components/Header/__snapshots__/index.jsx.snap +++ b/__tests__/shared/components/Header/__snapshots__/index.jsx.snap @@ -61,6 +61,10 @@ exports[`Default render 1`] = ` "href": "/challenges", "title": "All Challenges", }, + Object { + "href": "/engagements", + "title": "Engagements", + }, Object { "href": "/community/arena", "title": "Competitive Programming", diff --git a/__tests__/shared/components/ProfilePage/Stats/SubTrackChallengeView/__mocks__/develop.json b/__tests__/shared/components/ProfilePage/Stats/SubTrackChallengeView/__mocks__/develop.json index bde784385f..2248ba05f6 100644 --- a/__tests__/shared/components/ProfilePage/Stats/SubTrackChallengeView/__mocks__/develop.json +++ b/__tests__/shared/components/ProfilePage/Stats/SubTrackChallengeView/__mocks__/develop.json @@ -16,7 +16,7 @@ "submissions": [{ "id": 520456, "submittedAt": "2017-12-02T11:57Z", - "status": "Active", + "status": "ACTIVE", "score": 100.0, "placement": 1, "challengeId": 30060905, @@ -172,7 +172,7 @@ }, { "id": 520452, "submittedAt": "2017-12-02T11:11Z", - "status": "Active", + "status": "ACTIVE", "score": 100.0, "placement": 1, "challengeId": 30060903, @@ -370,7 +370,7 @@ }, { "id": 246093, "submittedAt": "2017-11-25T13:36Z", - "status": "Active", + "status": "ACTIVE", "score": 100.0, "placement": 1, "challengeId": 30060687, @@ -700,7 +700,7 @@ }, { "id": 245457, "submittedAt": "2017-11-13T22:25Z", - "status": "Active", + "status": "ACTIVE", "score": 100.0, "placement": 1, "challengeId": 30060425, diff --git a/__tests__/shared/components/ProfilePage/Stats/SubTrackChallengeView/__snapshots__/index.jsx.snap b/__tests__/shared/components/ProfilePage/Stats/SubTrackChallengeView/__snapshots__/index.jsx.snap index 272205bb7c..efa5ae911a 100644 --- a/__tests__/shared/components/ProfilePage/Stats/SubTrackChallengeView/__snapshots__/index.jsx.snap +++ b/__tests__/shared/components/ProfilePage/Stats/SubTrackChallengeView/__snapshots__/index.jsx.snap @@ -153,7 +153,7 @@ exports[`SubtrackChallengeView matches shallow snapshot 1`] = ` "id": 520456, "placement": 1, "score": 100, - "status": "Active", + "status": "ACTIVE", "submissionImage": null, "submittedAt": "2017-12-02T11:57Z", "type": "Contest Submission", @@ -343,7 +343,7 @@ exports[`SubtrackChallengeView matches shallow snapshot 1`] = ` "id": 520452, "placement": 1, "score": 100, - "status": "Active", + "status": "ACTIVE", "submissionImage": null, "submittedAt": "2017-12-02T11:11Z", "type": "Contest Submission", @@ -723,7 +723,7 @@ exports[`SubtrackChallengeView matches shallow snapshot 1`] = ` "id": 246093, "placement": 1, "score": 100, - "status": "Active", + "status": "ACTIVE", "submissionImage": null, "submittedAt": "2017-11-25T13:36Z", "type": "Contest Submission", @@ -939,7 +939,7 @@ exports[`SubtrackChallengeView matches shallow snapshot 1`] = ` "id": 245457, "placement": 1, "score": 100, - "status": "Active", + "status": "ACTIVE", "submissionImage": null, "submittedAt": "2017-11-13T22:25Z", "type": "Contest Submission", diff --git a/__tests__/shared/components/challenge-listing/__snapshots__/index.jsx.snap b/__tests__/shared/components/challenge-listing/__snapshots__/index.jsx.snap index e1664e107c..c51617d4c5 100644 --- a/__tests__/shared/components/challenge-listing/__snapshots__/index.jsx.snap +++ b/__tests__/shared/components/challenge-listing/__snapshots__/index.jsx.snap @@ -8,6 +8,7 @@ exports[`Matches shallow shapshot 1 shapshot 1 1`] = ` { + const signer = crypto.createSign(algorithm); + signer.update(data); + signer.end(); + return signer.sign(key); + }; +} +if (typeof crypto.verify !== 'function') { + crypto.verify = (algorithm, data, key, signature) => { + const verifier = crypto.createVerify(algorithm); + verifier.update(data); + verifier.end(); + return verifier.verify(key, signature); + }; +} + +/* Provide TextEncoder/TextDecoder in older Node runtimes (e.g. Node 10). */ +const { TextDecoder, TextEncoder } = require('util'); +if (typeof global.TextEncoder === 'undefined') { + global.TextEncoder = TextEncoder; +} +if (typeof global.TextDecoder === 'undefined') { + global.TextDecoder = TextDecoder; +} + /* Runs the ExpressJS startup script. */ require('../src/server'); diff --git a/config/default.js b/config/default.js index 7ea072a6cc..ef3558fdae 100644 --- a/config/default.js +++ b/config/default.js @@ -9,6 +9,7 @@ module.exports = { V4: 'https://api.topcoder-dev.com/v4', V5: 'https://api.topcoder-dev.com/v5', V6: 'https://api.topcoder-dev.com/v6', + ENGAGEMENTS: 'https://api.topcoder-dev.com/v6/engagements/engagements', MM_BROKER: '/api', }, @@ -106,6 +107,7 @@ module.exports = { COMMUNITY_APP: 'https://community-app.topcoder-dev.com', CHALLENGES_URL: 'https://www.topcoder-dev.com/challenges', COPILOTS_URL: 'https://copilots.topcoder-dev.com', + ENGAGEMENTS_APP: 'https://engagements.topcoder-dev.com', TCO_OPEN_URL: 'https://www.topcoder-dev.com/community/member-programs/topcoder-open', ARENA: 'https://arena.topcoder-dev.com', AUTH: 'https://accounts-auth0.topcoder-dev.com', @@ -336,6 +338,10 @@ module.exports = { title: 'All Challenges', href: '/challenges', }, + { + title: 'Engagements', + href: '/engagements', + }, { title: 'Competitive Programming', href: '/community/arena', diff --git a/config/development.js b/config/development.js index 1310698c94..81baff8cb0 100644 --- a/config/development.js +++ b/config/development.js @@ -1,8 +1,12 @@ module.exports = { SEGMENT_IO_API_KEY: 'QBtLgV8vCiuRX1lDikbMjcoe9aCHkF6n', SERVER_API_KEY: '79b2d5eb-c1fd-42c4-9391-6b2c9780d591', + API: { + ENGAGEMENTS: 'https://api.topcoder-dev.com/v6/engagements/engagements', + }, URL: { USER_SETTINGS: '', /* No dev server is available for saved searches */ + ENGAGEMENTS_APP: 'https://engagements.topcoder-dev.com', REVIEW_API_URL: '/reviewTypes', }, PLATFORM_SITE_URL: 'https://platform.topcoder-dev.com', diff --git a/config/production.js b/config/production.js index da1d0d0a8a..40d72858af 100644 --- a/config/production.js +++ b/config/production.js @@ -5,6 +5,7 @@ module.exports = { V4: 'https://api.topcoder.com/v4', V5: 'https://api.topcoder.com/v5', V6: 'https://api.topcoder.com/v6', + ENGAGEMENTS: 'https://api.topcoder.com/v6/engagements/engagements', }, AUTH0: { DOMAIN: 'topcoder.auth0.com', @@ -28,6 +29,7 @@ module.exports = { COMMUNITY_APP: 'https://community-app.topcoder.com', CHALLENGES_URL: 'https://www.topcoder.com/challenges', COPILOTS_URL: 'https://copilots.topcoder.com', + ENGAGEMENTS_APP: 'https://engagements.topcoder.com', TCO_OPEN_URL: 'https://www.topcoder.com/community/member-programs/topcoder-open', AUTH: 'https://accounts-auth0.topcoder.com', @@ -127,6 +129,10 @@ module.exports = { title: 'All Challenges', href: '/challenges?ref=nav', }, + { + title: 'Engagements', + href: '/engagements?ref=nav', + }, { title: 'Competitive Programming', href: '/community/arena?ref=nav', diff --git a/config/qa.js b/config/qa.js index d709837e5d..7ac7b5291b 100644 --- a/config/qa.js +++ b/config/qa.js @@ -1,8 +1,12 @@ module.exports = { SEGMENT_IO_API_KEY: 'QBtLgV8vCiuRX1lDikbMjcoe9aCHkF6n', SERVER_API_KEY: '79b2d5eb-c1fd-42c4-9391-6b2c9780d591', + API: { + ENGAGEMENTS: 'https://api.topcoder-qa.com/v6/engagements/engagements', + }, URL: { USER_SETTINGS: '', /* No qa server is available for saved searches */ + ENGAGEMENTS_APP: 'https://engagements.topcoder-qa.com', }, PLATFORM_SITE_URL: 'https://platform.topcoder-qa.com', PLATFORMUI_SITE_URL: 'https://platform-ui.topcoder-qa.com', diff --git a/config/test.js b/config/test.js index 3197fa2bb6..c65bd35beb 100644 --- a/config/test.js +++ b/config/test.js @@ -1,3 +1,9 @@ module.exports = { SERVER_API_KEY: '79b2d5eb-c1fd-42c4-9391-6b2c9780d591', + API: { + ENGAGEMENTS: 'https://api.topcoder-dev.com/v6/engagements/engagements', + }, + URL: { + ENGAGEMENTS_APP: 'https://engagements.topcoder-dev.com', + }, }; diff --git a/package.json b/package.json index 7022593479..1a55fedcb4 100644 --- a/package.json +++ b/package.json @@ -164,7 +164,7 @@ "supertest": "^3.1.0", "tc-core-library-js": "github:topcoder-platform/tc-core-library-js#master", "tc-ui": "^1.0.12", - "topcoder-react-lib": "github:topcoder-platform/topcoder-react-lib#develop", + "topcoder-react-lib": "github:topcoder-platform/topcoder-react-lib#v6", "topcoder-react-ui-kit": "2.0.1", "topcoder-react-utils": "github:topcoder-platform/topcoder-react-utils#v6", "turndown": "^4.0.2", diff --git a/src/shared/actions/engagements.js b/src/shared/actions/engagements.js new file mode 100644 index 0000000000..16dbc8cd64 --- /dev/null +++ b/src/shared/actions/engagements.js @@ -0,0 +1,47 @@ +import _ from 'lodash'; +import { createActions } from 'redux-actions'; +import { errors } from 'topcoder-react-lib'; +import getEngagements from 'services/engagements'; + +const { fireErrorMessage } = errors; + +const PAGE_SIZE = 10; + +function getEngagementsInit(uuid, page, filters) { + return { uuid, page, filters }; +} + +async function getEngagementsDone(uuid, page, filters, tokenV3) { + try { + const { engagements, meta } = await getEngagements(page, PAGE_SIZE, filters, tokenV3); + + return { + uuid, + engagements, + meta, + page, + }; + } catch (error) { + const { message: errorMessage } = error || {}; + let message = 'Unknown error'; + if (errorMessage) { + message = errorMessage; + } else if (typeof error === 'string') { + message = error; + } + fireErrorMessage('Error Loading Engagements', message); + const rejection = error instanceof Error ? error : new Error(message); + rejection.uuid = uuid; + rejection.originalError = error; + return Promise.reject(rejection); + } +} + +export default createActions({ + ENGAGEMENTS: { + GET_ENGAGEMENTS_INIT: getEngagementsInit, + GET_ENGAGEMENTS_DONE: getEngagementsDone, + DROP_ENGAGEMENTS: _.noop, + SET_FILTER: _.identity, + }, +}); diff --git a/src/shared/components/GUIKit/DropdownSingleSkills/index.jsx b/src/shared/components/GUIKit/DropdownSingleSkills/index.jsx index 2c43181844..8c6a08080d 100644 --- a/src/shared/components/GUIKit/DropdownSingleSkills/index.jsx +++ b/src/shared/components/GUIKit/DropdownSingleSkills/index.jsx @@ -21,6 +21,12 @@ function DropdownSingleSkills({ loadOptions, createText, }) { + let normalizedTerms = null; + if (terms && typeof terms === 'object') { + normalizedTerms = terms; + } else if (terms) { + normalizedTerms = { value: terms, label: terms }; + } const containerRef = useRef(null); useEffect(() => { const selectInput = containerRef.current.getElementsByClassName('Select-input'); @@ -79,17 +85,11 @@ function DropdownSingleSkills({ { - onChange(value ? (value.value || '') : ''); + onChange(value || null); }} - defaultValue={terms ? { - value: terms, - label: terms, - } : null} + defaultValue={normalizedTerms} promptTextCreator={value => `${createText} "${value}"`} placeholder={`${placeholder}${placeholder && required ? ' *' : ''}`} cacheOptions={cacheOptions} @@ -120,7 +120,13 @@ DropdownSingleSkills.defaultProps = { }; DropdownSingleSkills.propTypes = { - terms: PT.string, + terms: PT.oneOfType([ + PT.string, + PT.shape({ + label: PT.string, + value: PT.string, + }), + ]), placeholder: PT.string, label: PT.string, required: PT.bool, diff --git a/src/shared/components/GUIKit/SearchCombo/index.jsx b/src/shared/components/GUIKit/SearchCombo/index.jsx index 3be805bf38..e07288f5ee 100644 --- a/src/shared/components/GUIKit/SearchCombo/index.jsx +++ b/src/shared/components/GUIKit/SearchCombo/index.jsx @@ -22,10 +22,14 @@ function SearchCombo({ } else { getService(auth.tokenV3).getSkills(inputValue).then( (response) => { - const suggestedOptions = (response || []).map(skillItem => ({ - label: skillItem.name, - value: skillItem.name, - })); + const suggestedOptions = (response || []) + .map((skillItem) => { + const label = skillItem && (skillItem.name || skillItem.label || skillItem.title); + if (!label) return null; + const value = skillItem.id || skillItem.skillId || skillItem.value || label; + return { label, value }; + }) + .filter(Boolean); return callback(null, { options: suggestedOptions, }); @@ -40,8 +44,9 @@ function SearchCombo({ terms={skills} placeholder={placeholder} onChange={(newSkill) => { - setSkills(newSkill); - onSearch(newSkill); + const nextSkill = newSkill || ''; + setSkills(nextSkill); + onSearch(nextSkill); }} cacheOptions loadOptions={fetchSkills} @@ -58,7 +63,13 @@ SearchCombo.defaultProps = { }; SearchCombo.propTypes = { - term: PT.string, + term: PT.oneOfType([ + PT.string, + PT.shape({ + label: PT.string, + value: PT.string, + }), + ]), placeholder: PT.string, onSearch: PT.func.isRequired, auth: PT.object, diff --git a/src/shared/components/ProfilePage/Header/index.jsx b/src/shared/components/ProfilePage/Header/index.jsx index 8a932cfd7e..fe177a10bf 100644 --- a/src/shared/components/ProfilePage/Header/index.jsx +++ b/src/shared/components/ProfilePage/Header/index.jsx @@ -3,22 +3,12 @@ */ import React, { useEffect, useState } from 'react'; import PT from 'prop-types'; -import { connect } from 'react-redux'; - -import { actions } from 'topcoder-react-lib'; import { isomorphy } from 'topcoder-react-utils'; -import VerifiedBadge from 'assets/images/profile/verified-badge.svg'; -import InfoIcon from 'assets/images/profile/ico-info.svg'; -import Tooltip from 'components/Tooltip'; - import './styles.scss'; -const verifiedBadgeLookerId = '3322'; - -const ProfileHeader = ({ getLookerDone, lookerInfo, info }) => { +const ProfileHeader = ({ info }) => { const [imageUrl, setimageUrl] = useState(); - const [isMemberVerified, setIsMemberVerified] = useState(false); const { handle } = info; useEffect(() => { @@ -31,30 +21,10 @@ const ProfileHeader = ({ getLookerDone, lookerInfo, info }) => { setimageUrl(url); }, []); - useEffect(() => { - if (!lookerInfo || lookerInfo.error) { - getLookerDone(verifiedBadgeLookerId); - } - }, []); - - useEffect(() => { - if (!lookerInfo || lookerInfo.error) { - return; - } - const { lookerData } = lookerInfo; - const currentUserData = lookerData.find(x => x['user.handle'] === handle); - setIsMemberVerified(currentUserData && currentUserData['member_verification.status'] === 'Verified'); - }, [lookerInfo]); - const loadImageError = () => { setimageUrl(null); }; - const tooltipContent = ( -
This member is compliant with Topcoder policies
and is a trusted member of the Topcoder community.
- ); - - return (
@@ -73,23 +43,6 @@ const ProfileHeader = ({ getLookerDone, lookerInfo, info }) => {
{handle}
- - {isMemberVerified && ( -
- - - verified member - -
- - - -
-
- )}
@@ -102,34 +55,8 @@ ProfileHeader.defaultProps = { info: {}, }; -function mapStateToProps(state) { - const { - looker: { - dataSet, - }, - } = state; - return { - lookerInfo: dataSet[verifiedBadgeLookerId], - }; -} - -function mapDispatchToProps(dispatch) { - return { - getLookerDone: (lookerId) => { - dispatch(actions.looker.getLookerDone(lookerId)); - }, - }; -} - ProfileHeader.propTypes = { info: PT.shape(), - lookerInfo: PT.shape().isRequired, - getLookerDone: PT.func.isRequired, }; -const Container = connect( - mapStateToProps, - mapDispatchToProps, -)(ProfileHeader); - -export default Container; +export default ProfileHeader; diff --git a/src/shared/components/challenge-detail/Header/index.jsx b/src/shared/components/challenge-detail/Header/index.jsx index df568bb997..c9a6b00190 100644 --- a/src/shared/components/challenge-detail/Header/index.jsx +++ b/src/shared/components/challenge-detail/Header/index.jsx @@ -114,12 +114,16 @@ export default function ChallengeHeader(props) { prizeSets, prizeSet => ((prizeSet && prizeSet.type) || '').toLowerCase() === 'checkpoint', ); + const checkpointPrizeType = _.toUpper(_.get(checkpointPrizes, 'prizes[0].type', 'USD')); let numberOfCheckpointsPrizes = 0; let topCheckPointPrize = 0; if (!_.isEmpty(checkpointPrizes)) { numberOfCheckpointsPrizes = checkpointPrizes.prizes.length; topCheckPointPrize = checkpointPrizes.prizes[0].value; } + const topCheckPointPrizeDisplay = checkpointPrizeType === 'POINT' + ? `${topCheckPointPrize}${topCheckPointPrize === 1 ? 'pt' : 'pts'}` + : `$${topCheckPointPrize}`; const phases = {}; if (allPhases) { @@ -394,8 +398,7 @@ export default function ChallengeHeader(props) { - $ - {topCheckPointPrize} + {topCheckPointPrizeDisplay} ‌ EACH diff --git a/src/shared/components/challenge-detail/Submissions/index.jsx b/src/shared/components/challenge-detail/Submissions/index.jsx index 796dd3a0db..9288923517 100644 --- a/src/shared/components/challenge-detail/Submissions/index.jsx +++ b/src/shared/components/challenge-detail/Submissions/index.jsx @@ -313,8 +313,7 @@ class SubmissionsComponent extends React.Component { isMM() { const { challenge } = this.props; - const trackName = getTrackName(challenge); - return (trackName || '').toLowerCase() === 'data science' || checkIsMM(challenge); + return checkIsMM(challenge); } /** diff --git a/src/shared/components/challenge-listing/ChallengeTab/index.jsx b/src/shared/components/challenge-listing/ChallengeTab/index.jsx index 212a8152b7..8d131b6e47 100644 --- a/src/shared/components/challenge-listing/ChallengeTab/index.jsx +++ b/src/shared/components/challenge-listing/ChallengeTab/index.jsx @@ -3,16 +3,24 @@ import _ from 'lodash'; import { BUCKETS, isPastBucket } from 'utils/challenge-listing/buckets'; import cn from 'classnames'; import { useMediaQuery } from 'react-responsive'; +import { Link } from 'topcoder-react-utils'; import ArrowIcon from 'assets/images/ico-arrow-down.svg'; import PT from 'prop-types'; import './style.scss'; const TAB_NAME = { - PAST_CHALLENGES: 'Past', - ACTIVE_CHALLENGES: 'Active', + PAST_CHALLENGES: 'Past Challenges', + ACTIVE_CHALLENGES: 'Active Challenges', }; +const TAB_LINKS = [ + { + label: 'Engagements', + to: '/engagements', + }, +]; + const ChallengeTab = ({ activeBucket, setPreviousBucketOfActiveTab, @@ -21,17 +29,25 @@ const ChallengeTab = ({ previousBucketOfActiveTab, selectBucket, location, + history, setFilterState, filterState, }) => { const past = isPastBucket(activeBucket); const [currentSelected, setCurrentSelected] = useState(past); const [isTabClosed, setIsTabClosed] = useState(true); + const pathname = _.get(location, 'pathname', ''); + const activeExternalTab = useMemo( + () => TAB_LINKS.find(link => pathname.startsWith(link.to)), + [pathname], + ); + const externalTabLabel = activeExternalTab ? activeExternalTab.label : null; const currentTabName = useMemo( () => ( - currentSelected ? TAB_NAME.PAST_CHALLENGES : TAB_NAME.ACTIVE_CHALLENGES + externalTabLabel + || (currentSelected ? TAB_NAME.PAST_CHALLENGES : TAB_NAME.ACTIVE_CHALLENGES) ), - [location, currentSelected, filterState], + [currentSelected, externalTabLabel], ); useEffect(() => { @@ -39,6 +55,12 @@ const ChallengeTab = ({ }, [activeBucket]); const onActiveClick = () => { + if (externalTabLabel) { + if (history && history.push) { + history.push(`/challenges?bucket=${BUCKETS.OPEN_FOR_REGISTRATION}`); + } + return; + } if (currentTabName === TAB_NAME.ACTIVE_CHALLENGES) { return; } @@ -63,6 +85,12 @@ const ChallengeTab = ({ }; const onPastChallengesClick = () => { + if (externalTabLabel) { + if (history && history.push) { + history.push(`/challenges?bucket=${BUCKETS.ALL_PAST}`); + } + return; + } if (currentTabName === TAB_NAME.PAST_CHALLENGES) { return; } @@ -118,6 +146,16 @@ const ChallengeTab = ({ > {TAB_NAME.PAST_CHALLENGES} + {TAB_LINKS.map(link => ( +
  • + + {link.label} + +
  • + ))} ); @@ -154,6 +192,15 @@ const ChallengeTab = ({ >

    {TAB_NAME.PAST_CHALLENGES}

    + {TAB_LINKS.map(link => ( + +

    {link.label}

    + + ))} ) } @@ -177,6 +224,7 @@ ChallengeTab.defaultProps = { setPreviousBucketOfPastChallengesTab: () => {}, previousBucketOfActiveTab: null, previousBucketOfPastChallengesTab: null, + history: null, }; ChallengeTab.propTypes = { @@ -184,6 +232,9 @@ ChallengeTab.propTypes = { search: PT.string, pathname: PT.string, }).isRequired, + history: PT.shape({ + push: PT.func, + }), activeBucket: PT.string, setPreviousBucketOfActiveTab: PT.func, setPreviousBucketOfPastChallengesTab: PT.func, diff --git a/src/shared/components/challenge-listing/ChallengeTab/style.scss b/src/shared/components/challenge-listing/ChallengeTab/style.scss index 78db42ab26..aa311699af 100644 --- a/src/shared/components/challenge-listing/ChallengeTab/style.scss +++ b/src/shared/components/challenge-listing/ChallengeTab/style.scss @@ -1,5 +1,10 @@ @import "~styles/mixins"; +.item-link { + color: inherit; + text-decoration: none; +} + .mobile-tab-expanded { margin: 0 16px; background-color: $listing-light-blue; @@ -29,6 +34,11 @@ font-weight: 700; } } + + .item-link { + display: block; + width: 100%; + } } .challenge-tab { @@ -58,6 +68,14 @@ } } + .item-link { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + width: 100%; + } + .active { color: $color-blue-140; border-bottom-color: $color-blue-140; diff --git a/src/shared/components/engagement-listing/EngagementCard/index.jsx b/src/shared/components/engagement-listing/EngagementCard/index.jsx new file mode 100644 index 0000000000..2378a419e6 --- /dev/null +++ b/src/shared/components/engagement-listing/EngagementCard/index.jsx @@ -0,0 +1,547 @@ +import React from 'react'; +import PT from 'prop-types'; +import moment from 'moment-timezone'; +import { config } from 'topcoder-react-utils'; +import IconBlackDuration from 'assets/images/icon-black-calendar.svg'; +import IconBlackLocation from 'assets/images/icon-black-location.svg'; +import IconBlackPayment from 'assets/images/icon-black-payment.svg'; +import iconBlackSkills from 'assets/images/icon-skills.png'; +import IconTimezone from 'assets/images/icon-timezone.svg'; + +import './style.scss'; + +const ROLE_LABELS = { + DESIGNER: 'Designer', + SOFTWARE_DEVELOPER: 'Software Developer', + DATA_SCIENTIST: 'Data Scientist', + DATA_ENGINEER: 'Data Engineer', +}; + +const WORKLOAD_LABELS = { + FULL_TIME: 'Full Time', + FRACTIONAL: 'Fractional', +}; + +const ANTICIPATED_START_LABELS = { + IMMEDIATE: 'Immediate', + FEW_DAYS: 'Few Days', + FEW_WEEKS: 'Few Weeks', +}; + +const STATUS_LABELS = { + OPEN: 'Open', + PENDING_ASSIGNMENT: 'Pending Assignment', + ACTIVE: 'Active', + CANCELLED: 'Cancelled', + CLOSED: 'Closed', +}; + +const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; +const UNKNOWN_SKILL_LABEL = 'Unknown skill'; +const DEFAULT_LOCALE = 'en-US'; +const SIMPLE_TZ_PATTERN = /^[A-Za-z]{2,6}$/; +const OFFSET_TZ_PATTERN = /^(?:UTC|GMT)?\s*([+-])\s*(\d{1,2})(?::?(\d{2}))?$/i; +const BARE_OFFSET_PATTERN = /^([+-])(\d{2})(?::?(\d{2}))$/; +const TIMEZONE_ABBREVIATION_LONG_NAMES = { + ACDT: 'Australian Central Daylight Time', + ACST: 'Australian Central Standard Time', + AEDT: 'Australian Eastern Daylight Time', + AEST: 'Australian Eastern Standard Time', + AKDT: 'Alaska Daylight Time', + AKST: 'Alaska Standard Time', + AWST: 'Australian Western Standard Time', + BST: 'British Summer Time', + CDT: 'Central Daylight Time', + CEST: 'Central European Summer Time', + CET: 'Central European Standard Time', + CST: 'Central Standard Time', + EDT: 'Eastern Daylight Time', + EEST: 'Eastern European Summer Time', + EET: 'Eastern European Standard Time', + EST: 'Eastern Standard Time', + GMT: 'Greenwich Mean Time', + HST: 'Hawaii-Aleutian Standard Time', + IST: 'India Standard Time', + JST: 'Japan Standard Time', + KST: 'Korea Standard Time', + MDT: 'Mountain Daylight Time', + MST: 'Mountain Standard Time', + NZDT: 'New Zealand Daylight Time', + NZST: 'New Zealand Standard Time', + PDT: 'Pacific Daylight Time', + PST: 'Pacific Standard Time', + SAST: 'South Africa Standard Time', + UTC: 'Coordinated Universal Time', + WEST: 'Western European Summer Time', + WET: 'Western European Standard Time', +}; +const REGION_NAME_OVERRIDES = { + UK: 'United Kingdom', +}; +const regionDisplayNames = typeof Intl !== 'undefined' && typeof Intl.DisplayNames === 'function' + ? new Intl.DisplayNames([DEFAULT_LOCALE], { type: 'region' }) + : null; +let timezoneAbbreviationMap; + +function asArray(value) { + if (!value) return []; + return Array.isArray(value) ? value : [value]; +} + +function isUuid(value) { + return typeof value === 'string' && UUID_PATTERN.test(value); +} + +function toTitleCase(value) { + return value + .toLowerCase() + .split(' ') + .map(part => (part ? `${part[0].toUpperCase()}${part.slice(1)}` : '')) + .join(' '); +} + +function normalizeLabel(value, normalizedMap) { + if (typeof value === 'object' && value !== null) { + const label = value.name || value.title; + if (label) return String(label); + } + + if (!value) return 'Not Specified'; + + const raw = String(value).trim(); + if (!raw) return 'Not Specified'; + + const normalized = raw.toUpperCase().replace(/[\s-]+/g, '_'); + if (normalizedMap && normalizedMap[normalized]) { + return normalizedMap[normalized]; + } + + const hasSeparators = /[_-]+/.test(raw); + const isAllCaps = raw === raw.toUpperCase(); + const spaced = raw.replace(/[_-]+/g, ' ').trim(); + + if (hasSeparators || isAllCaps) { + return spaced ? toTitleCase(spaced) : raw; + } + + return spaced || raw; +} + +function normalizeSkillLabel(skill) { + if (!skill) return null; + + if (typeof skill === 'object' && skill !== null) { + const label = skill.name || skill.title; + if (label) return String(label); + const skillId = skill.id || skill.value; + if (isUuid(skillId)) return UNKNOWN_SKILL_LABEL; + return skillId ? String(skillId) : null; + } + + if (isUuid(skill)) return UNKNOWN_SKILL_LABEL; + return String(skill); +} + +function normalizeLocationValue(value) { + if (!value) return null; + if (typeof value === 'object' && value !== null) { + const label = value.name || value.title; + if (label) return String(label); + } + return String(value); +} + +function normalizeRegionValue(value) { + const normalized = normalizeLocationValue(value); + if (!normalized) return null; + const trimmed = normalized.trim(); + if (!trimmed) return null; + const lowered = trimmed.toLowerCase(); + if (lowered === 'any') return 'Any'; + if (lowered === 'remote') return 'Remote'; + if (/^[A-Za-z]{2}$/.test(trimmed)) { + const regionCode = trimmed.toUpperCase(); + if (REGION_NAME_OVERRIDES[regionCode]) { + return REGION_NAME_OVERRIDES[regionCode]; + } + if (regionDisplayNames) { + const displayName = regionDisplayNames.of(regionCode); + if (displayName) return displayName; + } + return regionCode; + } + return trimmed; +} + +function getIntlTimeZoneName(timeZone, style) { + if (typeof Intl === 'undefined' || typeof Intl.DateTimeFormat !== 'function') { + return null; + } + + try { + const formatter = new Intl.DateTimeFormat(DEFAULT_LOCALE, { + timeZone, + timeZoneName: style, + }); + + if (typeof formatter.formatToParts !== 'function') { + return null; + } + + const parts = formatter.formatToParts(new Date()); + const namePart = parts.find(part => part.type === 'timeZoneName'); + return namePart && namePart.value ? namePart.value : null; + } catch (error) { + return null; + } +} + +function getMomentTimeZoneName(timeZone) { + if (!moment || !moment.tz || !moment.tz.zone) { + return null; + } + + if (!moment.tz.zone(timeZone)) { + return null; + } + + try { + return moment.tz(new Date(), timeZone).format('z'); + } catch (error) { + return null; + } +} + +function getTimeZoneAbbreviationMap() { + if (timezoneAbbreviationMap) return timezoneAbbreviationMap; + timezoneAbbreviationMap = new Map(); + if (!moment || !moment.tz || typeof moment.tz.names !== 'function') { + return timezoneAbbreviationMap; + } + + moment.tz.names().forEach((zoneName) => { + try { + const abbr = moment.tz(new Date(), zoneName).format('z'); + if (!abbr) return; + const normalized = abbr.toUpperCase(); + if (!timezoneAbbreviationMap.has(normalized)) { + timezoneAbbreviationMap.set(normalized, zoneName); + } + } catch (error) { + // ignore invalid timezone data + } + }); + + return timezoneAbbreviationMap; +} + +function resolveTimeZoneAbbreviationName(abbreviation) { + const normalized = abbreviation.toUpperCase(); + if (TIMEZONE_ABBREVIATION_LONG_NAMES[normalized]) { + return TIMEZONE_ABBREVIATION_LONG_NAMES[normalized]; + } + + const map = getTimeZoneAbbreviationMap(); + const zoneName = map.get(normalized); + if (!zoneName) return null; + + return ( + getIntlTimeZoneName(zoneName, 'long') + || getIntlTimeZoneName(zoneName, 'longGeneric') + ); +} + +function formatUtcOffset(sign, hours, minutes) { + const hourValue = Number(hours); + const minuteValue = Number(minutes || 0); + + if (Number.isNaN(hourValue) || Number.isNaN(minuteValue)) { + return null; + } + + const normalizedHours = String(Math.abs(hourValue)).padStart(2, '0'); + const normalizedMinutes = String(Math.abs(minuteValue)).padStart(2, '0'); + const suffix = normalizedMinutes !== '00' ? `:${normalizedMinutes}` : ''; + + return `UTC${sign}${normalizedHours}${suffix}`; +} + +function normalizeUtcOffset(value) { + if (!value) return null; + const normalized = String(value).trim(); + if (!normalized) return null; + + if (/^(utc|gmt)$/i.test(normalized)) { + return 'UTC'; + } + + const offsetMatch = normalized.match(OFFSET_TZ_PATTERN); + if (offsetMatch) { + return formatUtcOffset(offsetMatch[1], offsetMatch[2], offsetMatch[3]); + } + + const bareMatch = normalized.match(BARE_OFFSET_PATTERN); + if (bareMatch) { + return formatUtcOffset(bareMatch[1], bareMatch[2], bareMatch[3]); + } + + return null; +} + +function normalizeTimezoneValue(value) { + const normalizedValue = normalizeLocationValue(value); + if (!normalizedValue) return null; + + const trimmed = normalizedValue.trim(); + if (!trimmed) return null; + + if (trimmed.toLowerCase() === 'any') { + return 'Any'; + } + + const longName = getIntlTimeZoneName(trimmed, 'long') || getIntlTimeZoneName(trimmed, 'longGeneric'); + if (longName) { + return longName; + } + + const offset = normalizeUtcOffset(trimmed); + if (offset) { + return offset; + } + + if (SIMPLE_TZ_PATTERN.test(trimmed)) { + return resolveTimeZoneAbbreviationName(trimmed) || trimmed.toUpperCase(); + } + + const fallbackShortName = getMomentTimeZoneName(trimmed) || getIntlTimeZoneName(trimmed, 'short'); + if (fallbackShortName) { + return fallbackShortName; + } + + return trimmed; +} + +function uniqNormalizedStrings(values) { + const seen = new Set(); + return values.reduce((acc, value) => { + const normalized = value.trim(); + if (!normalized) return acc; + const key = normalized.toLowerCase(); + if (seen.has(key)) return acc; + seen.add(key); + acc.push(normalized); + return acc; + }, []); +} + +function formatDuration(value, unitLabel) { + if (value === null || value === undefined || value === '') return null; + const numericValue = Number(value); + if (Number.isNaN(numericValue) || numericValue <= 0) return null; + return `${numericValue} ${unitLabel}${numericValue === 1 ? '' : 's'}`; +} + +function getDuration(startDate, endDate, durationWeeks, durationMonths) { + const weekDuration = formatDuration(durationWeeks, 'Week'); + if (weekDuration) return weekDuration; + const monthDuration = formatDuration(durationMonths, 'Month'); + if (monthDuration) return monthDuration; + if (!startDate || !endDate) return 'TBD'; + const start = moment(startDate); + const end = moment(endDate); + if (!start.isValid() || !end.isValid()) return 'TBD'; + + const diffDays = end.diff(start, 'days'); + if (diffDays < 0) return 'TBD'; + const weeks = Math.max(1, Math.ceil(diffDays / 7)); + return `${weeks} Week${weeks === 1 ? '' : 's'}`; +} + +function getRoleDisplay(role) { + return normalizeLabel(role, ROLE_LABELS); +} + +function getWorkloadDisplay(workload) { + return normalizeLabel(workload, WORKLOAD_LABELS); +} + +function getAnticipatedStartDisplay(value) { + return normalizeLabel(value, ANTICIPATED_START_LABELS); +} + +function getCompensationDisplay(compensationRange) { + if (typeof compensationRange === 'object' && compensationRange !== null) { + const label = compensationRange.name || compensationRange.title; + return label ? String(label) : 'Not Specified'; + } + return compensationRange ? String(compensationRange) : 'Not Specified'; +} + +function getStatusDisplay(status) { + if (typeof status === 'object' && status !== null) { + const label = status.name || status.title; + if (label) return String(label); + } + + if (!status) return 'Not Specified'; + + const normalized = String(status).trim().toUpperCase().replace(/[\s-]+/g, '_'); + if (!normalized) return 'Not Specified'; + + return STATUS_LABELS[normalized] || 'Not Specified'; +} + +function EngagementCard({ engagement }) { + const { + title, + name, + startDate, + start, + endDate, + end, + durationStartDate, + durationEndDate, + durationWeeks, + durationMonths, + role, + workload, + compensationRange, + skills: engagementSkills, + requiredSkills, + skillsets, + location, + locations: engagementLocations, + timezone, + timezones, + timeZones, + countries, + status, + anticipatedStart, + nanoId, + id, + engagementId, + } = engagement; + + const displayTitle = title || name || 'Engagement'; + const normalizedStartDate = startDate || start || durationStartDate; + const normalizedEndDate = endDate || end || durationEndDate; + const durationText = getDuration( + normalizedStartDate, + normalizedEndDate, + durationWeeks, + durationMonths, + ); + const anticipatedStartText = getAnticipatedStartDisplay(anticipatedStart); + + const skillsSource = [engagementSkills, requiredSkills, skillsets] + .find(value => Array.isArray(value) && value.length) + || engagementSkills + || requiredSkills + || skillsets; + const skills = Array.from(new Set( + asArray(skillsSource) + .map(normalizeSkillLabel) + .filter(Boolean), + )); + const skillsText = skills.length + ? skills.slice(0, 2).join(', ') + : 'Not Specified'; + const limitedSkillsText = skills.length > 2 + ? `${skillsText},...` + : skillsText; + + const baseLocations = [ + ...asArray(location), + ...asArray(engagementLocations), + ] + .map(normalizeRegionValue) + .filter(Boolean); + const timezoneValues = [ + ...asArray(timezone), + ...asArray(timezones), + ...asArray(timeZones), + ] + .map(normalizeTimezoneValue) + .filter(Boolean); + const countryValues = asArray(countries) + .map(normalizeRegionValue) + .filter(Boolean); + const isAnyValue = value => value.trim().toLowerCase() === 'any'; + const hasAnyLocation = [...baseLocations, ...countryValues].some(isAnyValue); + const hasAnyTimezone = timezoneValues.some(isAnyValue); + const filteredBaseLocations = baseLocations.filter(value => !isAnyValue(value)); + const filteredCountries = countryValues.filter(value => !isAnyValue(value)); + const locations = uniqNormalizedStrings([ + ...(hasAnyLocation ? ['Remote'] : []), + ...filteredBaseLocations, + ...filteredCountries, + ]); + const locationText = locations.length ? locations.join(', ') : 'Remote'; + const filteredTimezones = uniqNormalizedStrings( + timezoneValues.filter(value => !isAnyValue(value)), + ); + let timezoneText = 'Not Specified'; + if (filteredTimezones.length) { + timezoneText = filteredTimezones.join(', '); + } else if (hasAnyTimezone) { + timezoneText = 'Any'; + } + + const resolvedEngagementId = nanoId || id || engagementId; + const engagementLink = resolvedEngagementId + ? `${config.URL.ENGAGEMENTS_APP}/${resolvedEngagementId}` + : config.URL.ENGAGEMENTS_APP; + const statusText = getStatusDisplay(status); + + return ( +
    +
    + + {displayTitle} + + {statusText} +
    +
    +
    + role-icon {getRoleDisplay(role)} +
    +
    + skills-icon {limitedSkillsText} +
    +
    + {timezoneText} +
    +
    + {locationText} +
    +
    + {getWorkloadDisplay(workload)} +
    +
    + {getCompensationDisplay(compensationRange)} +
    +
    + {durationText} +
    +
    + {`Anticipated start: ${anticipatedStartText}`} +
    +
    + + VIEW DETAILS + +
    +
    +
    + ); +} + +EngagementCard.defaultProps = { + engagement: {}, +}; + +EngagementCard.propTypes = { + engagement: PT.shape(), +}; + +export default EngagementCard; diff --git a/src/shared/components/engagement-listing/EngagementCard/style.scss b/src/shared/components/engagement-listing/EngagementCard/style.scss new file mode 100644 index 0000000000..d7c740e41b --- /dev/null +++ b/src/shared/components/engagement-listing/EngagementCard/style.scss @@ -0,0 +1,135 @@ +@import "~styles/mixins"; +@import "~components/GUIKit/Assets/Styles/default"; +@import "~components/Contentful/default"; +@import "~components/buttons/themed/tc"; + +.container { + border: 1px solid #e9e9e9; + border-radius: 10px; + display: flex; + flex-direction: column; + color: #2a2a2a; + padding: 25px 35px 25px 44px; + margin-bottom: 15px; + + @include gui-kit-headers; + @include gui-kit-content; + @include roboto-regular; + + .gig-name, + .gig-name:visited, + .gig-name:active, + .gig-name:hover { + color: #1e94a3; + display: inline-block; + font-family: Barlow, sans-serif; + font-size: 20px; + font-weight: 600; + line-height: 24px; + margin-bottom: 12px; + margin-top: 0; + min-width: 0; + text-decoration: none; + text-transform: uppercase; + + @include xs-to-sm { + margin-bottom: 20px; + } + } +} + +.header { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 12px; + margin-bottom: 12px; + + @include xs-to-sm { + margin-bottom: 20px; + } +} + +.status-badge { + display: inline-flex; + align-items: center; + padding: 3px 10px; + border-radius: 999px; + border: 1px solid #e1e1e1; + background-color: #f7f7f7; + color: #2a2a2a; + font-size: 12px; + font-weight: 500; + line-height: 18px; + white-space: nowrap; +} + +.job-infos { + display: grid; + grid-template-columns: 1.2fr 1fr 1.2fr 1.2fr 1fr 1.3fr 0.9fr 1fr 141px; + column-gap: 20px; + align-items: center; + + @include xs-to-sm { + display: flex; + flex-direction: column; + align-items: flex-start; + } +} + +.icon-val { + display: flex; + align-items: center; + min-width: 0; + + @include xs-to-sm { + margin-bottom: 20px; + width: 100%; + } + + svg, + img { + margin-right: 7px; + width: 20px; + height: 20px; + flex-shrink: 0; + min-width: 20px; + min-height: 20px; + } +} + +.row-btn { + display: flex; + justify-content: flex-end; + align-items: center; + width: 141px; + + @include xs-to-sm { + justify-content: flex-start; + width: auto; + margin-bottom: 10px; + } +} + +.primary-green-md { + outline: none; + display: inline-flex; + align-items: center; + justify-content: center; + + @include primary-green; + @include md; + + &:hover { + @include primary-green; + } + + &:disabled, + &:hover:disabled { + background-color: #e9e9e9 !important; + border: none !important; + text-decoration: none !important; + color: #fafafb !important; + box-shadow: none !important; + } +} diff --git a/src/shared/components/engagement-listing/index.jsx b/src/shared/components/engagement-listing/index.jsx new file mode 100644 index 0000000000..b040fff9c2 --- /dev/null +++ b/src/shared/components/engagement-listing/index.jsx @@ -0,0 +1,235 @@ +import React, { + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import PT from 'prop-types'; +import LoadingIndicator from 'components/LoadingIndicator'; +import SearchCombo from 'components/GUIKit/SearchCombo'; +import Dropdown from 'components/GUIKit/Dropdown'; +import ChallengeTab from 'components/challenge-listing/ChallengeTab'; + +import EngagementCard from './EngagementCard'; + +import './style.scss'; + +const SORT_OPTIONS = [ + { label: 'Latest Added Descending', value: 'createdAt' }, + { label: 'Latest Updated Descending', value: 'updatedAt' }, +]; + +const CREATED_DATE_FIELDS = ['createdAt', 'created_at', 'createdOn', 'created']; +const UPDATED_DATE_FIELDS = ['updatedAt', 'updated_at', 'updatedOn', 'updated']; +const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; + +function getTimestamp(engagement, fields) { + if (!engagement) return 0; + for (let i = 0; i < fields.length; i += 1) { + const value = engagement[fields[i]]; + if (value) { + const timestamp = Date.parse(value); + if (!Number.isNaN(timestamp)) return timestamp; + } + } + return 0; +} + +export default function EngagementListing({ + engagements, + loading, + loadMore, + filter, + setFilter, + allEngagementsLoaded, + auth, + history, + location, +}) { + const [search, setSearch] = useState(filter.search || ''); + const [sortBy, setSortBy] = useState(filter.sortBy || 'createdAt'); + const hasEngagements = engagements && engagements.length > 0; + const [filtersReady, setFiltersReady] = useState( + hasEngagements || allEngagementsLoaded, + ); + const hasStartedLoadingRef = useRef(false); + + useEffect(() => { + setSearch(filter.search || ''); + setSortBy(filter.sortBy || 'createdAt'); + }, [filter]); + + useEffect(() => { + if (loading) { + hasStartedLoadingRef.current = true; + return; + } + + if ( + !filtersReady + && (hasEngagements || allEngagementsLoaded || hasStartedLoadingRef.current) + ) { + setFiltersReady(true); + } + }, [allEngagementsLoaded, filtersReady, hasEngagements, loading]); + + const handleSearch = (nextSearch) => { + const nextOption = nextSearch && typeof nextSearch === 'object' + ? nextSearch + : { label: nextSearch, value: nextSearch }; + const label = nextOption + ? String(nextOption.label || nextOption.value || '').trim() + : ''; + const value = nextOption && nextOption.value + ? String(nextOption.value).trim() + : ''; + const hasSkillId = Boolean(value) && UUID_PATTERN.test(value); + const normalizedSearch = label; + + setSearch(normalizedSearch); + setFilter({ + ...filter, + search: normalizedSearch, + skills: hasSkillId ? [value] : [], + }); + }; + + const handleSortChange = (nextOptions) => { + const selected = (nextOptions || []).find(option => option.selected); + const nextSortBy = selected && selected.label === SORT_OPTIONS[1].label + ? SORT_OPTIONS[1].value + : SORT_OPTIONS[0].value; + + setSortBy(nextSortBy); + setFilter({ + ...filter, + sortBy: nextSortBy, + }); + }; + + const sortOptions = SORT_OPTIONS.map(option => ({ + label: option.label, + selected: option.value === sortBy, + })); + + const sortedEngagements = useMemo(() => { + if (!Array.isArray(engagements) || engagements.length <= 1) return engagements || []; + + const primaryFields = sortBy === 'updatedAt' ? UPDATED_DATE_FIELDS : CREATED_DATE_FIELDS; + const fallbackFields = sortBy === 'updatedAt' ? CREATED_DATE_FIELDS : []; + + return engagements + .map((engagement, index) => { + const primaryTimestamp = getTimestamp(engagement, primaryFields); + const fallbackTimestamp = primaryTimestamp ? 0 : getTimestamp(engagement, fallbackFields); + return { + engagement, + index, + timestamp: primaryTimestamp || fallbackTimestamp, + }; + }) + .sort((a, b) => { + if (a.timestamp === b.timestamp) return a.index - b.index; + return b.timestamp - a.timestamp; + }) + .map(item => item.engagement); + }, [engagements, sortBy]); + + return ( +
    + +
    + {filtersReady ? ( + + + + + ) : null} +
    + + {loading && !hasEngagements ? ( +
    + +
    + ) : null} + + {!loading && !hasEngagements ? ( +
    + No engagements match your filters yet. +
    + ) : null} + + {hasEngagements ? ( +
    + {sortedEngagements.map((engagement, index) => ( + + ))} +
    + ) : null} + + {hasEngagements && !allEngagementsLoaded ? ( +
    + +
    + ) : null} +
    + ); +} + +EngagementListing.defaultProps = { + engagements: [], + loading: false, + loadMore: () => {}, + allEngagementsLoaded: false, + auth: {}, + history: null, + location: {}, +}; + +EngagementListing.propTypes = { + engagements: PT.arrayOf(PT.shape()), + loading: PT.bool, + loadMore: PT.func, + filter: PT.shape({ + status: PT.string, + skills: PT.arrayOf(PT.string), + location: PT.string, + search: PT.string, + sortBy: PT.string, + }).isRequired, + setFilter: PT.func.isRequired, + allEngagementsLoaded: PT.bool, + auth: PT.shape({ + tokenV3: PT.string, + }), + history: PT.shape({ + push: PT.func, + }), + location: PT.shape({ + pathname: PT.string, + search: PT.string, + }), +}; diff --git a/src/shared/components/engagement-listing/style.scss b/src/shared/components/engagement-listing/style.scss new file mode 100644 index 0000000000..0328889c8e --- /dev/null +++ b/src/shared/components/engagement-listing/style.scss @@ -0,0 +1,81 @@ +@import '~styles/mixins'; + +.engagementListing { + @include roboto-regular; + + width: 100%; + max-width: $screen-lg; + margin: 0 auto; + padding: 24px 0; + + @media (max-width: 1280px) { + padding: 24px 15px; + } +} + +.filters { + display: flex; + align-items: center; + min-height: 52px; + gap: 30px; + margin-bottom: 20px; + + @include xs-to-sm { + flex-direction: column; + gap: 15px; + } + + > div { + flex: 1; + + &:first-child { + flex: 3; + } + } +} + +.filters.loading { + pointer-events: none; +} + +.cards { + display: flex; + flex-direction: column; +} + +.loading-state { + display: flex; + justify-content: center; + padding: 40px 0; +} + +.empty-state { + text-align: center; + padding: 40px 16px; + background: $tc-white; + border: 1px solid $tc-gray-10; + border-radius: $corner-radius; + color: $tc-gray-60; +} + +.load-more { + text-align: center; + margin-top: 24px; +} + +.load-more-button { + @include roboto-medium; + + border-radius: $corner-radius; + border: 1px solid $tc-dark-blue-70; + padding: 10px 18px; + font-size: 14px; + background: transparent; + color: $tc-dark-blue-110; + cursor: pointer; + + &:disabled { + opacity: 0.6; + cursor: not-allowed; + } +} diff --git a/src/shared/containers/engagement-listing/index.jsx b/src/shared/containers/engagement-listing/index.jsx new file mode 100644 index 0000000000..e2bc2bc306 --- /dev/null +++ b/src/shared/containers/engagement-listing/index.jsx @@ -0,0 +1,184 @@ +import _ from 'lodash'; +import actions from 'actions/engagements'; +import headerActions from 'actions/topcoder_header'; +import React from 'react'; +import PT from 'prop-types'; +import shortId from 'shortid'; +import { connect } from 'react-redux'; +import EngagementListing from 'components/engagement-listing'; +import MetaTags from 'components/MetaTags'; + +import ogImage from '../../../assets/images/social.png'; + +class EngagementListingContainer extends React.Component { + componentDidMount() { + const { + auth, + filter, + getEngagements, + markHeaderMenu, + } = this.props; + + markHeaderMenu(); + getEngagements(0, filter, auth.tokenV3); + } + + componentDidUpdate(prevProps) { + const { + auth, + dropEngagements, + filter, + getEngagements, + } = this.props; + + const filterChanged = !_.isEqual(prevProps.filter, filter); + const tokenChanged = prevProps.auth.tokenV3 !== auth.tokenV3; + + if (filterChanged || tokenChanged) { + dropEngagements(); + getEngagements(0, filter, auth.tokenV3); + } + } + + componentWillUnmount() { + const { dropEngagements } = this.props; + dropEngagements(); + } + + loadMore = () => { + const { + allEngagementsLoaded, + auth, + filter, + getEngagements, + lastRequestedPage, + loadingEngagementsUUID, + } = this.props; + + if (loadingEngagementsUUID || allEngagementsLoaded) return; + + const nextPage = lastRequestedPage + 1; + getEngagements(nextPage, filter, auth.tokenV3); + }; + + render() { + const { + engagements, + filter, + auth, + history, + location, + loadingEngagementsUUID, + setFilter, + allEngagementsLoaded, + } = this.props; + + return ( + + + + + ); + } +} + +EngagementListingContainer.defaultProps = { + engagements: [], + loadingEngagementsUUID: '', + lastRequestedPage: -1, + allEngagementsLoaded: false, + meta: { + totalCount: 0, + }, +}; + +EngagementListingContainer.propTypes = { + auth: PT.shape({ + tokenV3: PT.string, + }).isRequired, + engagements: PT.arrayOf(PT.shape()), + loadingEngagementsUUID: PT.string, + lastRequestedPage: PT.number, + allEngagementsLoaded: PT.bool, + meta: PT.shape({ + totalCount: PT.number, + }), + filter: PT.shape({ + status: PT.string, + skills: PT.arrayOf(PT.string), + location: PT.string, + search: PT.string, + sortBy: PT.string, + }).isRequired, + getEngagements: PT.func.isRequired, + dropEngagements: PT.func.isRequired, + setFilter: PT.func.isRequired, + markHeaderMenu: PT.func.isRequired, + history: PT.shape({ + push: PT.func, + }).isRequired, + location: PT.shape({ + pathname: PT.string, + search: PT.string, + }).isRequired, +}; + +const mapStateToProps = (state) => { + const engagementsState = state.engagements || {}; + + return { + engagements: engagementsState.engagements || [], + loadingEngagementsUUID: engagementsState.loadingEngagementsUUID || '', + lastRequestedPage: Number.isFinite(engagementsState.lastRequestedPage) + ? engagementsState.lastRequestedPage + : -1, + allEngagementsLoaded: engagementsState.allEngagementsLoaded || false, + filter: engagementsState.filter || { + status: 'open', + skills: [], + location: '', + search: '', + sortBy: 'createdAt', + }, + meta: engagementsState.meta || { + totalCount: 0, + }, + auth: state.auth, + }; +}; + +const mapDispatchToProps = (dispatch) => { + const a = actions.engagements; + const ah = headerActions.topcoderHeader; + + return { + getEngagements: (page, filters, tokenV3) => { + const uuid = shortId(); + dispatch(a.getEngagementsInit(uuid, page, filters)); + dispatch(a.getEngagementsDone(uuid, page, filters, tokenV3)); + }, + dropEngagements: () => dispatch(a.dropEngagements()), + setFilter: filter => dispatch(a.setFilter(filter)), + markHeaderMenu: () => dispatch(ah.setCurrentNav('Compete', 'Engagements')), + }; +}; + +export default connect( + mapStateToProps, + mapDispatchToProps, +)(EngagementListingContainer); diff --git a/src/shared/reducers/engagements.js b/src/shared/reducers/engagements.js new file mode 100644 index 0000000000..ee443ad19d --- /dev/null +++ b/src/shared/reducers/engagements.js @@ -0,0 +1,99 @@ +import { handleActions } from 'redux-actions'; +import actions from 'actions/engagements'; + +const initialState = { + engagements: [], + loadingEngagementsUUID: '', + lastRequestedPage: -1, + allEngagementsLoaded: false, + filter: { + status: 'open', + skills: [], + location: '', + search: '', + sortBy: 'createdAt', + }, + meta: { + totalCount: 0, + }, +}; + +function onGetEngagementsInit(state, { payload }) { + return { + ...state, + loadingEngagementsUUID: payload.uuid, + lastRequestedPage: payload.page, + allEngagementsLoaded: payload.page === 0 ? false : state.allEngagementsLoaded, + }; +} + +function onGetEngagementsDone(state, { error, payload }) { + if (!payload || payload.uuid !== state.loadingEngagementsUUID) return state; + + if (error) { + return { + ...state, + loadingEngagementsUUID: '', + }; + } + + const page = typeof payload.page === 'number' ? payload.page : state.lastRequestedPage; + const engagements = payload.engagements || []; + const nextEngagements = page > 0 + ? state.engagements.concat(engagements) + : engagements; + const nextMeta = { + ...state.meta, + ...(payload.meta || {}), + }; + const totalCount = typeof nextMeta.totalCount === 'number' ? nextMeta.totalCount : null; + const allEngagementsLoaded = totalCount !== null + ? nextEngagements.length >= totalCount + : engagements.length === 0; + + return { + ...state, + engagements: nextEngagements, + loadingEngagementsUUID: '', + allEngagementsLoaded, + meta: nextMeta, + }; +} + +function onDropEngagements(state) { + return { + ...state, + engagements: [], + loadingEngagementsUUID: '', + lastRequestedPage: -1, + allEngagementsLoaded: false, + meta: { + totalCount: 0, + }, + }; +} + +function onSetFilter(state, { payload }) { + return { + ...state, + filter: { + ...state.filter, + ...payload, + }, + }; +} + +function create(initial) { + return handleActions({ + [actions.engagements.getEngagementsInit]: onGetEngagementsInit, + [actions.engagements.getEngagementsDone]: onGetEngagementsDone, + [actions.engagements.dropEngagements]: onDropEngagements, + [actions.engagements.setFilter]: onSetFilter, + }, initial || initialState); +} + +export function factory() { + return Promise.resolve(create()); +} + +export default create(); diff --git a/src/shared/reducers/index.js b/src/shared/reducers/index.js index 34f4da0a55..a35f091315 100644 --- a/src/shared/reducers/index.js +++ b/src/shared/reducers/index.js @@ -45,6 +45,7 @@ import thrive from './contentful/thrive'; import dashboard from './dashboard'; import blog from './blog'; import identity from './identity'; +import engagements from './engagements'; /** * Given HTTP request, generates options for SSR by topcoder-react-lib's reducer @@ -182,6 +183,7 @@ export function factory(req) { blog, timelineWall, identity, + engagements, })); } diff --git a/src/shared/routes/Topcoder/EngagementListing.jsx b/src/shared/routes/Topcoder/EngagementListing.jsx new file mode 100644 index 0000000000..6fa30c7498 --- /dev/null +++ b/src/shared/routes/Topcoder/EngagementListing.jsx @@ -0,0 +1,32 @@ +import LoadingIndicator from 'components/LoadingIndicator'; +import path from 'path'; +import React from 'react'; +import { StaticRouter } from 'react-router-dom'; +import { AppChunk, webpack } from 'topcoder-react-utils'; + +export default function EngagementListingRoute() { + return ( + import(/* webpackChunkName: "engagement-listing/chunk" */ 'containers/engagement-listing') + .then(({ default: EngagementListing }) => ( + + )) + } + renderPlaceholder={() => } + renderServer={(renderProps) => { + const p = webpack.resolveWeak('containers/engagement-listing'); + const EngagementListing = webpack.requireWeak(path.resolve(__dirname, p)); + return ( + + + + ); + }} + /> + ); +} diff --git a/src/shared/routes/Topcoder/Routes.jsx b/src/shared/routes/Topcoder/Routes.jsx index 7e040cd60d..18301002b6 100644 --- a/src/shared/routes/Topcoder/Routes.jsx +++ b/src/shared/routes/Topcoder/Routes.jsx @@ -27,6 +27,7 @@ import EDUHome from '../EDUHome'; import EDUTracks from '../EDUTracks'; import EDUSearch from '../EDUSearch'; import ChallengeListing from './ChallengeListing'; +import EngagementListing from './EngagementListing'; import Dashboard from './Dashboard'; import Notifications from './Notifications'; import HallOfFame from '../HallOfFame'; @@ -60,6 +61,7 @@ export default function Topcoder() { path="/challenges/:challengeId([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}|\d{5,8})" /> + entry.trim()) + .filter(Boolean); + if (countries.length) { + url.searchParams.append('countries', countries.join(',')); + } + } + + if (filters.skills && filters.skills.length) { + const skills = Array.isArray(filters.skills) + ? filters.skills + : [filters.skills]; + const normalizedSkills = skills + .map(skill => String(skill).trim()) + .filter(Boolean); + if (normalizedSkills.length) { + url.searchParams.append('requiredSkills', normalizedSkills.join(',')); + } + } + + if (filters.sortBy === 'createdAt' || filters.sortBy === 'updatedAt') { + url.searchParams.append('sortBy', filters.sortBy); + url.searchParams.append('sortOrder', 'desc'); + } + + return url; +} + +function getAuthHeaders(tokenV3) { + if (!tokenV3) return undefined; + return { + Authorization: `Bearer ${tokenV3}`, + }; +} + +function extractEngagements(data) { + if (Array.isArray(data)) return data; + if (data && Array.isArray(data.data)) return data.data; + if (data && data.result && Array.isArray(data.result.content)) return data.result.content; + if (data && data.result && Array.isArray(data.result.data)) return data.result.data; + if (data && Array.isArray(data.items)) return data.items; + return []; +} + +function extractSkills(data) { + if (Array.isArray(data)) return data; + if (data && Array.isArray(data.data)) return data.data; + if (data && data.result && Array.isArray(data.result.content)) return data.result.content; + if (data && data.result && Array.isArray(data.result.data)) return data.result.data; + if (data && Array.isArray(data.items)) return data.items; + return []; +} + +function extractMeta(data, engagementsCount) { + if (!data || Array.isArray(data)) return { totalCount: engagementsCount }; + if (data.meta) return data.meta; + if (data.result && data.result.metadata) return data.result.metadata; + if (typeof data.totalCount === 'number') return { totalCount: data.totalCount }; + if (typeof data.total === 'number') return { totalCount: data.total }; + if (typeof data.count === 'number') return { totalCount: data.count }; + return { totalCount: engagementsCount }; +} + +async function fetchSkillsByIds(skillIds, tokenV3) { + const ids = Array.isArray(skillIds) ? skillIds : [skillIds]; + const uniqueIds = Array.from(new Set(ids.filter(Boolean))); + if (!uniqueIds.length) return []; + + const params = new URLSearchParams(); + uniqueIds.forEach(skillId => params.append('skillId', skillId)); + params.set('disablePagination', 'true'); + + const headers = getAuthHeaders(tokenV3); + const res = await fetch(`${skillsApiUrl}?${params.toString()}`, { + method: 'GET', + headers, + }); + + if (!res.ok) { + throw new Error(res.statusText); + } + + const data = await res.json(); + return extractSkills(data); +} + +function resolveSkillLabel(skill, skillNameById) { + if (!skill) return null; + + if (typeof skill === 'object') { + const label = skill.name || skill.title; + if (label) return label; + + const skillId = skill.id || skill.value; + if (isUuid(skillId)) { + return skillNameById.get(skillId) || UNKNOWN_SKILL_LABEL; + } + return skillId ? String(skillId) : null; + } + + if (isUuid(skill)) { + return skillNameById.get(skill) || UNKNOWN_SKILL_LABEL; + } + + return String(skill); +} + +function normalizeEngagementSkills(engagement, skillNameById) { + if (!engagement || typeof engagement !== 'object') return engagement; + + return { + ...engagement, + skills: asArray(engagement.skills) + .map(skill => resolveSkillLabel(skill, skillNameById)) + .filter(Boolean), + requiredSkills: asArray(engagement.requiredSkills) + .map(skill => resolveSkillLabel(skill, skillNameById)) + .filter(Boolean), + skillsets: asArray(engagement.skillsets) + .map(skill => resolveSkillLabel(skill, skillNameById)) + .filter(Boolean), + }; +} + +async function hydrateEngagementSkills(engagements, tokenV3) { + if (!Array.isArray(engagements) || !engagements.length) { + return engagements; + } + + const skillIds = new Set(); + engagements.forEach((engagement) => { + const skillValues = [ + ...asArray(engagement.skills), + ...asArray(engagement.requiredSkills), + ...asArray(engagement.skillsets), + ]; + skillValues.forEach((skill) => { + if (typeof skill === 'object' && skill !== null) { + const skillId = skill.id || skill.value; + if (isUuid(skillId)) { + skillIds.add(skillId); + } + } else if (isUuid(skill)) { + skillIds.add(skill); + } + }); + }); + + let skillNameById = new Map(); + if (skillIds.size) { + try { + const skills = await fetchSkillsByIds(Array.from(skillIds), tokenV3); + skillNameById = new Map( + skills + .map(skill => [skill.id, skill.name || skill.title || skill.label]) + .filter(([id, label]) => Boolean(id) && Boolean(label)), + ); + } catch (error) { + skillNameById = new Map(); + } + } + + return engagements.map(engagement => normalizeEngagementSkills(engagement, skillNameById)); +} + +/** + * Fetches engagements. + * + * @param {number} page - Page number (0-based). + * @param {number} pageSize - Number of items per page. + * @param {Object} filters - Filters for engagements. + * @param {string} tokenV3 - Optional auth token. + * @returns {Promise<{engagements: Object[], meta: Object}>} The fetched data. + */ +export default async function getEngagements(page, pageSize, filters = {}, tokenV3) { + const url = buildEngagementsUrl(page, pageSize, filters); + const headers = getAuthHeaders(tokenV3); + + try { + const res = await fetch(url.toString(), { + method: 'GET', + headers, + }); + + if (!res.ok) { + throw new Error(res.statusText); + } + + const data = await res.json(); + const engagements = extractEngagements(data); + const meta = extractMeta(data, engagements.length); + const hydratedEngagements = await hydrateEngagementSkills(engagements, tokenV3); + + return { engagements: hydratedEngagements, meta }; + } catch (error) { + return Promise.reject(error); + } +} + +/** + * Fetches a single engagement by ID. + * + * @param {string} engagementId - The engagement ID. + * @param {string} tokenV3 - Optional auth token. + * @returns {Promise} The engagement details. + */ +export async function getEngagementDetails(engagementId, tokenV3) { + const url = new URL(`${engagementsApiUrl}/${encodeURIComponent(engagementId)}`); + const headers = getAuthHeaders(tokenV3); + + try { + const res = await fetch(url.toString(), { + method: 'GET', + headers, + }); + + if (!res.ok) { + throw new Error(res.statusText); + } + + const data = await res.json(); + const [hydrated] = await hydrateEngagementSkills([data], tokenV3); + return hydrated || data; + } catch (error) { + return Promise.reject(error); + } +} diff --git a/src/shared/utils/url.js b/src/shared/utils/url.js index 495de94486..117cb77947 100644 --- a/src/shared/utils/url.js +++ b/src/shared/utils/url.js @@ -228,6 +228,14 @@ export const getSubPageConfiguration = (location, loginUserHandle) => { fullFooter = false; } + if (url.includes('/engagements')) { + toolName = 'Opportunities'; + toolRoot = '/challenges'; + loginRedirect = '/engagements'; + type = 'tool'; + fullFooter = false; + } + if (url.includes('/members')) { const handle = url.substring(url.lastIndexOf('/') + 1); toolName = loginUserHandle && handle && loginUserHandle.toLowerCase() === handle.toLocaleLowerCase() ? 'My Profile' : 'Profiles'; diff --git a/src/test/jmeter/Community-25UV.jmx b/src/test/jmeter/Community-25UV.jmx index 184149b02d..b867126807 100644 --- a/src/test/jmeter/Community-25UV.jmx +++ b/src/test/jmeter/Community-25UV.jmx @@ -409,7 +409,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=${pgn}&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=${pgn}&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -451,7 +451,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=5&sortBy=name&sortOrder=asc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=5&sortBy=name&sortOrder=asc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -481,7 +481,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=5&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=5&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -511,7 +511,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -571,7 +571,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -601,7 +601,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -631,7 +631,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -661,7 +661,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -691,7 +691,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -721,7 +721,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -751,7 +751,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -781,7 +781,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -811,7 +811,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -841,7 +841,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -871,7 +871,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -901,7 +901,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -931,7 +931,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -961,7 +961,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -991,7 +991,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -1021,7 +1021,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -1051,7 +1051,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -1081,7 +1081,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -1111,7 +1111,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -1141,7 +1141,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -1171,7 +1171,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -1201,7 +1201,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -1231,7 +1231,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -1261,7 +1261,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -1291,7 +1291,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -1321,7 +1321,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -1351,7 +1351,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -1381,7 +1381,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -1411,7 +1411,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -1441,7 +1441,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -1471,7 +1471,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -1501,7 +1501,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -1531,7 +1531,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -1561,7 +1561,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -1591,7 +1591,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -1621,7 +1621,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -1651,7 +1651,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -1681,7 +1681,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -1711,7 +1711,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&tracks[]=Dev&types[]=CH&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&tracks[]=Dev&types[]=CH&types[]=TSK GET true false @@ -1741,7 +1741,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?startDateEnd=2020-01-31T18%3A29%3A59.999Z&endDateStart=2019-12-31T18%3A30%3A00.000Z&status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?startDateEnd=2020-01-31T18%3A29%3A59.999Z&endDateStart=2019-12-31T18%3A30%3A00.000Z&status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -1939,7 +1939,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=${tags}&tab=details&status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=${tags}&tab=details&status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -1981,7 +1981,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -2011,7 +2011,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -2041,7 +2041,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -2331,7 +2331,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=${pgn}&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=${pgn}&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -2373,7 +2373,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=5&sortBy=name&sortOrder=asc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=5&sortBy=name&sortOrder=asc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -2403,7 +2403,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=5&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=5&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -2433,7 +2433,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -2493,7 +2493,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -2523,7 +2523,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -2553,7 +2553,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -2583,7 +2583,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -2613,7 +2613,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -2643,7 +2643,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -2673,7 +2673,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -2703,7 +2703,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -2733,7 +2733,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -2763,7 +2763,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -2793,7 +2793,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -2823,7 +2823,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -2853,7 +2853,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -2883,7 +2883,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -2913,7 +2913,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -2943,7 +2943,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -2973,7 +2973,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -3003,7 +3003,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -3033,7 +3033,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -3063,7 +3063,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -3093,7 +3093,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -3123,7 +3123,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -3153,7 +3153,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -3183,7 +3183,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -3213,7 +3213,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -3243,7 +3243,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -3273,7 +3273,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -3303,7 +3303,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -3333,7 +3333,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -3363,7 +3363,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -3393,7 +3393,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -3423,7 +3423,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -3453,7 +3453,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -3483,7 +3483,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -3513,7 +3513,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -3543,7 +3543,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -3573,7 +3573,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -3603,7 +3603,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -3633,7 +3633,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&tracks[]=Dev&types[]=CH&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&tracks[]=Dev&types[]=CH&types[]=TSK GET true false @@ -3663,7 +3663,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?startDateEnd=2020-01-31T18%3A29%3A59.999Z&endDateStart=2019-12-31T18%3A30%3A00.000Z&status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?startDateEnd=2020-01-31T18%3A29%3A59.999Z&endDateStart=2019-12-31T18%3A30%3A00.000Z&status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -3861,7 +3861,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=${tags}&tab=details&status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=${tags}&tab=details&status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -3903,7 +3903,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -3933,7 +3933,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -3963,7 +3963,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -4183,7 +4183,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=${pgn}&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=${pgn}&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -4225,7 +4225,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=5&sortBy=name&sortOrder=asc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=5&sortBy=name&sortOrder=asc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -4255,7 +4255,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=5&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=5&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -4285,7 +4285,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -4345,7 +4345,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -4375,7 +4375,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -4405,7 +4405,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -4435,7 +4435,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -4465,7 +4465,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -4495,7 +4495,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -4525,7 +4525,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -4555,7 +4555,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -4585,7 +4585,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -4615,7 +4615,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -4645,7 +4645,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -4675,7 +4675,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -4705,7 +4705,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -4735,7 +4735,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -4765,7 +4765,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -4795,7 +4795,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -4825,7 +4825,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -4855,7 +4855,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -4885,7 +4885,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -4915,7 +4915,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -4945,7 +4945,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -4975,7 +4975,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -5005,7 +5005,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -5035,7 +5035,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -5065,7 +5065,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -5095,7 +5095,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -5125,7 +5125,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -5155,7 +5155,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -5185,7 +5185,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -5215,7 +5215,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -5245,7 +5245,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -5275,7 +5275,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -5305,7 +5305,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -5335,7 +5335,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -5365,7 +5365,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -5395,7 +5395,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -5425,7 +5425,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -5455,7 +5455,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -5485,7 +5485,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&tracks[]=Dev&types[]=CH&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&tracks[]=Dev&types[]=CH&types[]=TSK GET true false @@ -5515,7 +5515,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?startDateEnd=2020-01-31T18%3A29%3A59.999Z&endDateStart=2019-12-31T18%3A30%3A00.000Z&status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?startDateEnd=2020-01-31T18%3A29%3A59.999Z&endDateStart=2019-12-31T18%3A30%3A00.000Z&status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -5713,7 +5713,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=${tags}&tab=details&status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=${tags}&tab=details&status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -5755,7 +5755,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -5785,7 +5785,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -5815,7 +5815,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -5979,7 +5979,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=${pgn}&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=${pgn}&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -6021,7 +6021,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=5&sortBy=name&sortOrder=asc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=5&sortBy=name&sortOrder=asc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -6051,7 +6051,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=5&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=5&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -6081,7 +6081,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -6141,7 +6141,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -6171,7 +6171,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -6201,7 +6201,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -6231,7 +6231,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -6261,7 +6261,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -6291,7 +6291,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -6321,7 +6321,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -6351,7 +6351,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -6381,7 +6381,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -6411,7 +6411,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -6441,7 +6441,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -6471,7 +6471,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -6501,7 +6501,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -6531,7 +6531,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -6561,7 +6561,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -6591,7 +6591,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -6621,7 +6621,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -6651,7 +6651,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -6681,7 +6681,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -6711,7 +6711,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -6741,7 +6741,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -6771,7 +6771,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -6801,7 +6801,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -6831,7 +6831,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -6861,7 +6861,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -6891,7 +6891,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -6921,7 +6921,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -6951,7 +6951,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -6981,7 +6981,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -7011,7 +7011,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -7041,7 +7041,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -7071,7 +7071,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -7101,7 +7101,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -7131,7 +7131,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -7161,7 +7161,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -7191,7 +7191,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -7221,7 +7221,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -7251,7 +7251,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -7281,7 +7281,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&tracks[]=Dev&types[]=CH&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&tracks[]=Dev&types[]=CH&types[]=TSK GET true false @@ -7311,7 +7311,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?startDateEnd=2020-01-31T18%3A29%3A59.999Z&endDateStart=2019-12-31T18%3A30%3A00.000Z&status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?startDateEnd=2020-01-31T18%3A29%3A59.999Z&endDateStart=2019-12-31T18%3A30%3A00.000Z&status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -7509,7 +7509,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=${tags}&tab=details&status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=${tags}&tab=details&status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -7551,7 +7551,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -7581,7 +7581,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -7611,7 +7611,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -7768,7 +7768,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=${pgn}&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=${pgn}&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -7810,7 +7810,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=5&sortBy=name&sortOrder=asc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=5&sortBy=name&sortOrder=asc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -7840,7 +7840,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=5&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=5&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -7870,7 +7870,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -7930,7 +7930,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -7960,7 +7960,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&tracks[]=Des&tracks[]=Dev&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -7990,7 +7990,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -8020,7 +8020,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -8050,7 +8050,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=CH GET true false @@ -8080,7 +8080,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -8110,7 +8110,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -8140,7 +8140,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=F2F GET true false @@ -8170,7 +8170,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -8200,7 +8200,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -8230,7 +8230,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Des&types[]=TSK GET true false @@ -8260,7 +8260,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -8290,7 +8290,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -8320,7 +8320,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=CH GET true false @@ -8350,7 +8350,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -8380,7 +8380,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -8410,7 +8410,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=F2F GET true false @@ -8440,7 +8440,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -8470,7 +8470,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -8500,7 +8500,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&types[]=TSK GET true false @@ -8530,7 +8530,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -8560,7 +8560,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -8590,7 +8590,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=CH GET true false @@ -8620,7 +8620,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -8650,7 +8650,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -8680,7 +8680,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=F2F GET true false @@ -8710,7 +8710,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -8740,7 +8740,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -8770,7 +8770,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=DS&types[]=TSK GET true false @@ -8800,7 +8800,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -8830,7 +8830,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -8860,7 +8860,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=CH GET true false @@ -8890,7 +8890,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -8920,7 +8920,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -8950,7 +8950,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=F2F GET true false @@ -8980,7 +8980,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -9010,7 +9010,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -9040,7 +9040,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK + /v5/challenges/?status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&types[]=TSK GET true false @@ -9070,7 +9070,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&tracks[]=Dev&types[]=CH&types[]=TSK + /v5/challenges/?status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=QA&tracks[]=Dev&types[]=CH&types[]=TSK GET true false @@ -9100,7 +9100,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?startDateEnd=2020-01-31T18%3A29%3A59.999Z&endDateStart=2019-12-31T18%3A30%3A00.000Z&status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?startDateEnd=2020-01-31T18%3A29%3A59.999Z&endDateStart=2019-12-31T18%3A30%3A00.000Z&status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -9298,7 +9298,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=${tags}&tab=details&status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=${tags}&tab=details&status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -9340,7 +9340,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Active&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=ACTIVE&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -9370,7 +9370,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Active&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=ACTIVE&currentPhaseName=Registration&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false @@ -9400,7 +9400,7 @@ start up time/ramp-up time = Shutdown time/ramp-down time of the previous record https - /v5/challenges/?search=topcoder&status=Completed&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK + /v5/challenges/?search=topcoder&status=COMPLETED&perPage=10&page=1&sortBy=startDate&sortOrder=desc&tracks[]=Dev&tracks[]=Des&tracks[]=DS&tracks[]=QA&types[]=CH&types[]=F2F&types[]=TSK GET true false