Skip to content

Payment tool updates #125

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: payment-tool-develop-sync
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions __tests__/__snapshots__/index.js.snap
Original file line number Diff line number Diff line change
@@ -294,6 +294,10 @@ Object {
"default": undefined,
"getService": [Function],
},
"resource": Object {
"default": undefined,
"getService": [Function],
},
"reviewOpportunities": Object {
"default": undefined,
"getReviewOpportunitiesService": [Function],
13 changes: 7 additions & 6 deletions __tests__/actions/auth.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
const MOCK_GROUPS_REQ_URL = 'https://api.topcoder-dev.com/v3/groups?memberId=12345&membershipType=user';
const MOCK_GROUPS_REQ_URL = 'https://api.topcoder-dev.com/v5/groups?memberId=12345&membershipType=user';
const MOCK_PROFILE_REQ_URL = 'https://api.topcoder-dev.com/v3/members/username12345';

jest.mock('isomorphic-fetch', () => jest.fn(url => Promise.resolve({
json: () => {
let content;
switch (url) {
case MOCK_GROUPS_REQ_URL: content = ['Group1', 'Group2']; break;
case MOCK_PROFILE_REQ_URL: content = { userId: 12345 }; break;
case MOCK_GROUPS_REQ_URL: content = ['Group1', 'Group2'];
return content;
case MOCK_PROFILE_REQ_URL: content = { userId: 12345 };
return {
result: { content, status: 200 },
};
default: throw new Error('Unexpected URL!');
}
return {
result: { content, status: 200 },
};
},
})));

2 changes: 2 additions & 0 deletions config/test.js
Original file line number Diff line number Diff line change
@@ -2,6 +2,8 @@ module.exports = {
API: {
V2: 'https://api.topcoder-dev.com/v2',
V3: 'https://api.topcoder-dev.com/v3',
V4: 'https://api.topcoder-dev.com/v4',
V5: 'https://api.topcoder-dev.com/v5',
},
dummyConfigKey: 'Dummy config value',
};
1,445 changes: 0 additions & 1,445 deletions dist/dev/index.js

This file was deleted.

15,280 changes: 7,579 additions & 7,701 deletions package-lock.json

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions src/actions/auth.js
Original file line number Diff line number Diff line change
@@ -17,11 +17,12 @@ function loadProfileDone(userTokenV3) {
if (!userTokenV3) return Promise.resolve(null);
const user = decodeToken(userTokenV3);
const api = getApi('V3', userTokenV3);
const apiV5 = getApi('V5', userTokenV3);
return Promise.all([
api.get(`/members/${user.handle}`)
.then(res => res.json()).then(res => (res.result.status === 200 ? res.result.content : {})),
api.get(`/groups?memberId=${user.userId}&membershipType=user`)
.then(res => res.json()).then(res => (res.result.status === 200 ? res.result.content : [])),
apiV5.get(`/groups?memberId=${user.userId}&membershipType=user`)
.then(res => res.json()).then(res => (res && res.length ? res : [])),
]).then(([profile, groups]) => ({ ...profile, groups }));
}

14 changes: 7 additions & 7 deletions src/actions/direct.js
Original file line number Diff line number Diff line change
@@ -79,15 +79,15 @@ function getUserProjectsInit(tokenV3) {
* @static
* @desc Creates an action that loads projects related to a user.
* @param {String} tokenV3 Topcoder auth token v3.
* @param {Boolean} hasActiveBillingAccount Optional. Defaults to false.
* Whether only projects with active billing accounts should be included
* into the results.
* @return {Action}
*/
async function getUserProjectsDone(tokenV3, hasActiveBillingAccount) {
const params = {};
if (hasActiveBillingAccount) params.hasActiveBillingAccount = true;
const projects = await getService(tokenV3).getUserProjects(params);
async function getUserProjectsDone(tokenV3) {
// Fetches Member's only Active projects
const projects = await getService(tokenV3).getUserProjects({
memberOnly: true,
sort: 'lastActivityAt desc',
status: 'active',
});
return { tokenV3, projects };
}

9 changes: 5 additions & 4 deletions src/actions/member-tasks.js
Original file line number Diff line number Diff line change
@@ -59,11 +59,12 @@ function getInit(uuid, pageNum) {
*/
function getDone(uuid, projectId, pageNum, tokenV3) {
return getService(tokenV3).getChallenges({
isTask: 1,
isTask: true,
projectId,
}, {
limit: PAGE_SIZE,
offset: pageNum * PAGE_SIZE,
sortBy: 'updated',
sortOrder: 'desc',
perPage: PAGE_SIZE,
page: pageNum + 1,
}).then(({ challenges, totalCount }) => ({
projectId,
tasks: challenges,
2 changes: 1 addition & 1 deletion src/reducers/direct.js
Original file line number Diff line number Diff line change
@@ -54,7 +54,7 @@ function onGetProjectDetailsDone(state, { error, payload }) {
logger.error('Failed to load project details', payload);
throw payload;
}
if (payload.project.projectId !== state.loadingProjectDetailsForId) {
if (payload.id !== state.loadingProjectDetailsForId) {
return state;
}
return {
271 changes: 131 additions & 140 deletions src/services/challenges.js

Large diffs are not rendered by default.

24 changes: 9 additions & 15 deletions src/services/direct.js
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@ class Direct {
*/
constructor(tokenV3) {
this.private = {
api: getApi('V3', tokenV3),
api: getApi('V5', tokenV3),
tokenV3,
};
}
@@ -32,11 +32,9 @@ class Direct {
* @return {Promise} Resolves to the project details object.
*/
async getProjectDetails(projectId) {
let res = await this.private.api.get(`/direct/projects/${projectId}`);
const res = await this.private.api.get(`/projects/${projectId}`);
if (!res.ok) throw new Error(res.statusText);
res = (await res.json()).result;
if (res.status !== 200) throw new Error(res.content);
return res.content;
return res.json();
}

/**
@@ -46,12 +44,10 @@ class Direct {
* @return {Promise} Resolves to the user permissions data.
*/
async getProjectPermissions(projectId) {
const URL = `/direct/projects/${projectId}/permissions`;
let res = await this.private.api.get(URL);
const URL = `/projects/${projectId}/permissions`;
const res = await this.private.api.get(URL);
if (!res.ok) throw new Error(res.statusText);
res = (await res.json()).result;
if (res.status !== 200) throw new Error(res.content);
return res.content;
return res.json();
}

/**
@@ -60,13 +56,11 @@ class Direct {
* @return {Promise} Resolves to an array of project objects.
*/
async getUserProjects(query) {
let url = '/direct/projects/user';
let url = '/projects';
if (query) url += `?${qs.stringify(query)}`;
let res = await this.private.api.get(url);
const res = await this.private.api.get(url);
if (!res.ok) throw new Error(res.statusText);
res = (await res.json()).result;
if (res.status !== 200) throw new Error(res.content);
return res.content;
return res.json();
}
}

2 changes: 2 additions & 0 deletions src/services/index.js
Original file line number Diff line number Diff line change
@@ -15,6 +15,7 @@ import * as user from './user';
import * as lookup from './lookup';
import * as userTraits from './user-traits';
import * as submissions from './submissions';
import * as resource from './resources';

export const services = {
api,
@@ -26,6 +27,7 @@ export const services = {
groups,
members,
user,
resource,
userSetting,
reviewOpportunities,
lookup,
79 changes: 79 additions & 0 deletions src/services/resources.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/**
* @module "services.resources"
* @desc The Resources service takes care about communication with Direct APIs:
*/

import qs from 'qs';

import { getApi } from './api';

/**
* Resources service class.
*/
class ResourcesService {
/**
* Creates a new {@link module:services.resources~ResourcesService} instance.
* @param {String} tokenV3 Optional. Topcoder auth token v3. Though optional,
* most probably most, if not all, of the service functionality won't work
* for non-authenticated visitors.
*/
constructor(tokenV3) {
this.private = {
api: getApi('V5', tokenV3),
tokenV3,
};
}

/**
* Gets Resource roles.
* @return {Promise} Resolves to the Resource roles.
*/
async getResourceRoles() {
const res = await this.private.api.get('/resource-roles');
if (!res.ok) throw new Error(res.statusText);
const result = await res.json();
return result;
}

/**
* Gets Resource roles on the specified Challenge.
* @param {Object} query
* @return {Promise} Resolves to the Resource roles.
*/
async getChallengeResourceRoles(query) {
let url = '/resources';
if (query) url += `?${qs.stringify(query)}`;
const res = await this.private.api.get(url);
if (!res.ok) throw new Error(res.statusText);
const result = await res.json();
return result;
}

/**
* Post New Resource for a challenge
* @param {Object} body. Body for the request.
* @return {Promise} Resolves to Resource object.
*/
async createChallengeResource(body) {
const url = '/resources';
const res = await this.private.api.postJson(url, body);
if (!res.ok) throw new Error(res.statusText);
const result = await res.json();
return result;
}
}

let lastInstance = null;
/**
* Returns a new or existing {@link module:services.resource~ResourcesService} service.
* @param {String} tokenV3 Optional. Topcoder auth token v3.
* @return {ResourcesService} ResourcesService service object.
*/
export function getService(tokenV3) {
if (!lastInstance || lastInstance.private.tokenV3 !== tokenV3) {
lastInstance = new ResourcesService(tokenV3);
}
return lastInstance;
}

export default undefined;