Skip to content

Commit e9239fd

Browse files
author
vikasrohit
authored
Merge pull request #112 from topcoder-platform/dev
Promoting changes to production for connect release 2.4.3
2 parents 364b048 + ccbf3ad commit e9239fd

35 files changed

+876
-282
lines changed

migrations/20180608_project_add_templateId_and_new_tables.sql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ CREATE TABLE product_templates (
139139
details character varying(255) NOT NULL,
140140
aliases json NOT NULL,
141141
template json NOT NULL,
142-
disabled: boolean DEFAULT false,
143-
hidden: boolean DEFAULT false,
142+
"hidden" boolean DEFAULT false,
143+
"disabled" boolean DEFAULT false,
144144
"deletedAt" timestamp with time zone,
145145
"createdAt" timestamp with time zone,
146146
"updatedAt" timestamp with time zone,
@@ -206,8 +206,8 @@ CREATE TABLE project_templates (
206206
aliases json NOT NULL,
207207
scope json NOT NULL,
208208
phases json NOT NULL,
209-
disabled: boolean DEFAULT false,
210-
hidden: boolean DEFAULT false,
209+
"disabled" boolean DEFAULT false,
210+
"hidden" boolean DEFAULT false,
211211
"deletedAt" timestamp with time zone,
212212
"createdAt" timestamp with time zone,
213213
"updatedAt" timestamp with time zone,
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
--
2+
-- UPDATE EXISTING TABLES:
3+
-- project_types
4+
-- icon column: added
5+
-- info column: added
6+
-- question column: added
7+
-- aliases column: added
8+
--
9+
10+
--
11+
-- project_types
12+
--
13+
ALTER TABLE project_types ADD COLUMN "icon" character varying(255);
14+
UPDATE project_types set icon='product-cat-app' where icon is null;
15+
ALTER TABLE project_types ALTER COLUMN "icon" SET NOT NULL;
16+
17+
ALTER TABLE project_types ADD COLUMN "info" character varying(255);
18+
UPDATE project_types set info="displayName" where info is null;
19+
ALTER TABLE project_types ALTER COLUMN "info" SET NOT NULL;
20+
21+
ALTER TABLE project_types ADD COLUMN "question" character varying(255);
22+
UPDATE project_types set question='What do you want to develop?' where question is null;
23+
ALTER TABLE project_types ALTER COLUMN "question" SET NOT NULL;
24+
25+
ALTER TABLE project_types ADD COLUMN "aliases" json;
26+
UPDATE project_types set aliases='{}' where aliases is null;
27+
ALTER TABLE project_types ALTER COLUMN "aliases" SET NOT NULL;
28+
29+
ALTER TABLE project_types ADD COLUMN "hidden" boolean DEFAULT false;
30+
ALTER TABLE project_types ADD COLUMN "disabled" boolean DEFAULT false;

package-lock.json

Lines changed: 77 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"jsonwebtoken": "^8.3.0",
5454
"lodash": "^4.16.4",
5555
"method-override": "^2.3.9",
56+
"moment": "^2.22.2",
5657
"pg": "^4.5.5",
5758
"pg-native": "^1.10.1",
5859
"sequelize": "^3.23.0",

src/models/project.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,11 +155,11 @@ module.exports = function defineProject(sequelize, DataTypes) {
155155
.then(projects => ({ rows: projects, count }));
156156
});
157157
},
158-
findProjectRange(models, startId, endId, fields) {
158+
findProjectRange(models, startId, endId, fields, raw = true) {
159159
return this.findAll({
160160
where: { id: { $between: [startId, endId] } },
161161
attributes: _.get(fields, 'projects', null),
162-
raw: true,
162+
raw,
163163
include: [{
164164
model: models.ProjectPhase,
165165
as: 'phases',

src/models/projectType.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ module.exports = function definePhaseProduct(sequelize, DataTypes) {
44
const ProjectType = sequelize.define('ProjectType', {
55
key: { type: DataTypes.STRING(45), primaryKey: true },
66
displayName: { type: DataTypes.STRING(255), allowNull: false },
7+
icon: { type: DataTypes.STRING(255), allowNull: false },
8+
question: { type: DataTypes.STRING(255), allowNull: false },
9+
info: { type: DataTypes.STRING(255), allowNull: false },
10+
aliases: { type: DataTypes.JSON, allowNull: false },
11+
disabled: { type: DataTypes.BOOLEAN, defaultValue: false },
12+
hidden: { type: DataTypes.BOOLEAN, defaultValue: false },
713

814
deletedAt: { type: DataTypes.DATE, allowNull: true },
915
createdAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW },

src/permissions/index.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const projectEdit = require('./project.edit');
66
const projectDelete = require('./project.delete');
77
const projectMemberDelete = require('./projectMember.delete');
88
const projectAdmin = require('./admin.ops');
9-
const connectManagerOrAdmin = require('./connectManagerOrAdmin.ops');
9+
// const connectManagerOrAdmin = require('./connectManagerOrAdmin.ops');
1010
const copilotAndAbove = require('./copilotAndAbove');
1111

1212
module.exports = () => {
@@ -26,14 +26,14 @@ module.exports = () => {
2626
Authorizer.setPolicy('project.updateMember', projectEdit);
2727
Authorizer.setPolicy('project.admin', projectAdmin);
2828

29-
Authorizer.setPolicy('projectTemplate.create', connectManagerOrAdmin);
30-
Authorizer.setPolicy('projectTemplate.edit', connectManagerOrAdmin);
31-
Authorizer.setPolicy('projectTemplate.delete', connectManagerOrAdmin);
29+
Authorizer.setPolicy('projectTemplate.create', projectAdmin);
30+
Authorizer.setPolicy('projectTemplate.edit', projectAdmin);
31+
Authorizer.setPolicy('projectTemplate.delete', projectAdmin);
3232
Authorizer.setPolicy('projectTemplate.view', true);
3333

34-
Authorizer.setPolicy('productTemplate.create', connectManagerOrAdmin);
35-
Authorizer.setPolicy('productTemplate.edit', connectManagerOrAdmin);
36-
Authorizer.setPolicy('productTemplate.delete', connectManagerOrAdmin);
34+
Authorizer.setPolicy('productTemplate.create', projectAdmin);
35+
Authorizer.setPolicy('productTemplate.edit', projectAdmin);
36+
Authorizer.setPolicy('productTemplate.delete', projectAdmin);
3737
Authorizer.setPolicy('productTemplate.view', true);
3838

3939
Authorizer.setPolicy('project.addProjectPhase', copilotAndAbove);

src/permissions/project.view.js

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import _ from 'lodash';
33
import util from '../util';
44
import models from '../models';
5-
import { USER_ROLE } from '../constants';
5+
import { USER_ROLE, PROJECT_STATUS, PROJECT_MEMBER_ROLE } from '../constants';
66

77
/**
88
* Super admin, Topcoder Managers are allowed to view any projects
@@ -37,8 +37,37 @@ module.exports = freq => new Promise((resolve, reject) => {
3737
})
3838
.then((hasAccess) => {
3939
if (!hasAccess) {
40+
let errorMessage = 'You do not have permissions to perform this action';
41+
// customize error message for copilots
42+
if (util.hasRole(freq, USER_ROLE.COPILOT)) {
43+
if (_.findIndex(freq.context.currentProjectMembers, m => m.role === PROJECT_MEMBER_ROLE.COPILOT) >= 0) {
44+
errorMessage = 'Copilot: Project is already claimed by another copilot';
45+
return Promise.resolve(errorMessage);
46+
}
47+
return models.Project
48+
.find({
49+
where: { id: projectId },
50+
attributes: ['status'],
51+
raw: true,
52+
})
53+
.then((project) => {
54+
if (!project || [PROJECT_STATUS.DRAFT, PROJECT_STATUS.IN_REVIEW].indexOf(project.status) >= 0) {
55+
errorMessage = 'Copilot: Project is not yet available to copilots';
56+
} else {
57+
// project status is 'active' or higher so it's not available to copilots
58+
errorMessage = 'Copilot: Project has already started';
59+
}
60+
return Promise.resolve(errorMessage);
61+
});
62+
}
63+
// user is not an admin nor is a registered project member
64+
return Promise.resolve(errorMessage);
65+
}
66+
return Promise.resolve(null);
67+
}).then((errorMessage) => {
68+
if (errorMessage) {
4069
// user is not an admin nor is a registered project member
41-
return reject(new Error('You do not have permissions to perform this action'));
70+
return reject(new Error(errorMessage));
4271
}
4372
return resolve(true);
4473
});

src/routes/admin/project-index-create.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,14 @@ module.exports = [
5050
});
5151

5252
const eClient = util.getElasticSearchClient();
53-
return models.Project.findProjectRange(models, projectIdStart, projectIdEnd, fields)
53+
return models.Project.findProjectRange(models, projectIdStart, projectIdEnd, fields, false)
5454
.then((_projects) => {
5555
const projects = _projects.map((_project) => {
5656
const project = _project;
5757
if (!project) {
5858
return Promise.resolve(null);
5959
}
60+
logger.debug('phases', project.phases);
6061
if (project.phases) {
6162
// removs the delete audit fields from the index data
6263
project.phases = project.phases.map(phase => _.omit(phase, ['deletedAt', 'deletedBy']));

0 commit comments

Comments
 (0)