Skip to content

Commit e90266a

Browse files
author
Vikas Agarwal
committed
Github issue#2132, Need backend support for new fields in project types
— Added required fields
1 parent ba089f3 commit e90266a

File tree

9 files changed

+319
-37
lines changed

9 files changed

+319
-37
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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;

src/models/projectType.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ 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 },
711

812
deletedAt: { type: DataTypes.DATE, allowNull: true },
913
createdAt: { type: DataTypes.DATE, defaultValue: DataTypes.NOW },

src/routes/projectTypes/create.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ const schema = {
1515
param: Joi.object().keys({
1616
key: Joi.string().max(45).required(),
1717
displayName: Joi.string().max(255).required(),
18+
icon: Joi.string().max(255).required(),
19+
question: Joi.string().max(255).required(),
20+
info: Joi.string().max(255).required(),
21+
aliases: Joi.array().required(),
1822
createdAt: Joi.any().strip(),
1923
updatedAt: Joi.any().strip(),
2024
deletedAt: Joi.any().strip(),

src/routes/projectTypes/create.spec.js

Lines changed: 67 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/**
22
* Tests for create.js
33
*/
4+
import _ from 'lodash';
45
import chai from 'chai';
56
import request from 'supertest';
67

@@ -15,6 +16,10 @@ describe('CREATE project type', () => {
1516
.then(() => models.ProjectType.create({
1617
key: 'key1',
1718
displayName: 'displayName 1',
19+
icon: 'http://example.com/icon1.ico',
20+
question: 'question 1',
21+
info: 'info 1',
22+
aliases: ['key-1', 'key_1'],
1823
createdBy: 1,
1924
updatedBy: 1,
2025
})).then(() => Promise.resolve()),
@@ -26,6 +31,10 @@ describe('CREATE project type', () => {
2631
param: {
2732
key: 'app_dev',
2833
displayName: 'Application Development',
34+
icon: 'prod-cat-app-icon',
35+
info: 'Application Development Info',
36+
question: 'What kind of devlopment you need?',
37+
aliases: ['key-1', 'key_1'],
2938
},
3039
};
3140

@@ -67,11 +76,8 @@ describe('CREATE project type', () => {
6776
});
6877

6978
it('should return 422 for missing key', (done) => {
70-
const invalidBody = {
71-
param: {
72-
displayName: 'displayName',
73-
},
74-
};
79+
const invalidBody = _.cloneDeep(body);
80+
delete invalidBody.param.key;
7581

7682
request(server)
7783
.post('/v4/projectTypes')
@@ -84,11 +90,50 @@ describe('CREATE project type', () => {
8490
});
8591

8692
it('should return 422 for missing displayName', (done) => {
87-
const invalidBody = {
88-
param: {
89-
key: 'key',
90-
},
91-
};
93+
const invalidBody = _.cloneDeep(body);
94+
delete invalidBody.param.displayName;
95+
96+
request(server)
97+
.post('/v4/projectTypes')
98+
.set({
99+
Authorization: `Bearer ${testUtil.jwts.admin}`,
100+
})
101+
.send(invalidBody)
102+
.expect('Content-Type', /json/)
103+
.expect(422, done);
104+
});
105+
106+
it('should return 422 for missing icon', (done) => {
107+
const invalidBody = _.cloneDeep(body);
108+
delete invalidBody.param.icon;
109+
110+
request(server)
111+
.post('/v4/projectTypes')
112+
.set({
113+
Authorization: `Bearer ${testUtil.jwts.admin}`,
114+
})
115+
.send(invalidBody)
116+
.expect('Content-Type', /json/)
117+
.expect(422, done);
118+
});
119+
120+
it('should return 422 for missing question', (done) => {
121+
const invalidBody = _.cloneDeep(body);
122+
delete invalidBody.param.question;
123+
124+
request(server)
125+
.post('/v4/projectTypes')
126+
.set({
127+
Authorization: `Bearer ${testUtil.jwts.admin}`,
128+
})
129+
.send(invalidBody)
130+
.expect('Content-Type', /json/)
131+
.expect(422, done);
132+
});
133+
134+
it('should return 422 for missing info', (done) => {
135+
const invalidBody = _.cloneDeep(body);
136+
delete invalidBody.param.info;
92137

93138
request(server)
94139
.post('/v4/projectTypes')
@@ -101,12 +146,8 @@ describe('CREATE project type', () => {
101146
});
102147

103148
it('should return 422 for duplicated key', (done) => {
104-
const invalidBody = {
105-
param: {
106-
key: 'key1',
107-
displayName: 'displayName',
108-
},
109-
};
149+
const invalidBody = _.cloneDeep(body);
150+
invalidBody.param.key = 'key1';
110151

111152
request(server)
112153
.post('/v4/projectTypes')
@@ -131,6 +172,10 @@ describe('CREATE project type', () => {
131172
const resJson = res.body.result.content;
132173
resJson.key.should.be.eql(body.param.key);
133174
resJson.displayName.should.be.eql(body.param.displayName);
175+
resJson.icon.should.be.eql(body.param.icon);
176+
resJson.info.should.be.eql(body.param.info);
177+
resJson.question.should.be.eql(body.param.question);
178+
resJson.aliases.should.be.eql(body.param.aliases);
134179

135180
resJson.createdBy.should.be.eql(40051333); // admin
136181
should.exist(resJson.createdAt);
@@ -154,6 +199,12 @@ describe('CREATE project type', () => {
154199
.expect(201)
155200
.end((err, res) => {
156201
const resJson = res.body.result.content;
202+
resJson.key.should.be.eql(body.param.key);
203+
resJson.displayName.should.be.eql(body.param.displayName);
204+
resJson.icon.should.be.eql(body.param.icon);
205+
resJson.info.should.be.eql(body.param.info);
206+
resJson.question.should.be.eql(body.param.question);
207+
resJson.aliases.should.be.eql(body.param.aliases);
157208
resJson.createdBy.should.be.eql(40051336); // connect admin
158209
resJson.updatedBy.should.be.eql(40051336); // connect admin
159210
done();

src/routes/projectTypes/delete.spec.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ describe('DELETE project type', () => {
1515
.then(() => models.ProjectType.create({
1616
key: 'key1',
1717
displayName: 'displayName 1',
18+
icon: 'http://example.com/icon1.ico',
19+
question: 'question 1',
20+
info: 'info 1',
21+
aliases: ['key-1', 'key_1'],
1822
createdBy: 1,
1923
updatedBy: 1,
2024
})).then(() => Promise.resolve()),

src/routes/projectTypes/get.spec.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ describe('GET project type', () => {
1414
const type = {
1515
key: 'key1',
1616
displayName: 'displayName 1',
17+
icon: 'http://example.com/icon1.ico',
18+
question: 'question 1',
19+
info: 'info 1',
20+
aliases: ['key-1', 'key_1'],
1721
createdBy: 1,
1822
updatedBy: 1,
1923
};
@@ -65,6 +69,10 @@ describe('GET project type', () => {
6569
const resJson = res.body.result.content;
6670
resJson.key.should.be.eql(type.key);
6771
resJson.displayName.should.be.eql(type.displayName);
72+
resJson.icon.should.be.eql(type.icon);
73+
resJson.info.should.be.eql(type.info);
74+
resJson.question.should.be.eql(type.question);
75+
resJson.aliases.should.be.eql(type.aliases);
6876
resJson.createdBy.should.be.eql(type.createdBy);
6977
should.exist(resJson.createdAt);
7078
resJson.updatedBy.should.be.eql(type.updatedBy);

src/routes/projectTypes/list.spec.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,20 @@ describe('LIST project types', () => {
1515
{
1616
key: 'key1',
1717
displayName: 'displayName 1',
18+
icon: 'http://example.com/icon1.ico',
19+
question: 'question 1',
20+
info: 'info 1',
21+
aliases: ['key-1', 'key_1'],
1822
createdBy: 1,
1923
updatedBy: 1,
2024
},
2125
{
2226
key: 'key2',
23-
displayName: 'displayName 1',
27+
displayName: 'displayName 2',
28+
icon: 'http://example.com/icon2.ico',
29+
question: 'question 2',
30+
info: 'info 2',
31+
aliases: ['key-2', 'key_2'],
2432
createdBy: 1,
2533
updatedBy: 1,
2634
},
@@ -54,6 +62,10 @@ describe('LIST project types', () => {
5462
resJson.should.have.length(2);
5563
resJson[0].key.should.be.eql(type.key);
5664
resJson[0].displayName.should.be.eql(type.displayName);
65+
resJson[0].icon.should.be.eql(type.icon);
66+
resJson[0].info.should.be.eql(type.info);
67+
resJson[0].question.should.be.eql(type.question);
68+
resJson[0].aliases.should.be.eql(type.aliases);
5769
resJson[0].createdBy.should.be.eql(type.createdBy);
5870
should.exist(resJson[0].createdAt);
5971
resJson[0].updatedBy.should.be.eql(type.updatedBy);

src/routes/projectTypes/update.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ const schema = {
1717
body: {
1818
param: Joi.object().keys({
1919
key: Joi.any().strip(),
20-
displayName: Joi.string().max(255).required(),
20+
displayName: Joi.string().max(255).optional(),
21+
icon: Joi.string().max(255).optional(),
22+
question: Joi.string().max(255).optional(),
23+
info: Joi.string().max(255).optional(),
24+
aliases: Joi.array().optional(),
2125
createdAt: Joi.any().strip(),
2226
updatedAt: Joi.any().strip(),
2327
deletedAt: Joi.any().strip(),

0 commit comments

Comments
 (0)