Skip to content

Commit f12979a

Browse files
committed
Added fixes.
1 parent 0589926 commit f12979a

File tree

24 files changed

+216
-95
lines changed

24 files changed

+216
-95
lines changed

.circleci/config.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ jobs:
4848
- POSTGRES_USER: circle_test
4949
- POSTGRES_DB: circle_test
5050
- image: elasticsearch:2.3
51+
- image: rabbitmq:3-management
5152
environment:
5253
DB_MASTER_URL: postgres://circle_test:@127.0.0.1:5432/circle_test
5354
AUTH_SECRET: secret
@@ -96,7 +97,7 @@ workflows:
9697
- test
9798
filters:
9899
branches:
99-
only: ['dev', 'dev-sts']
100+
only: ['dev', 'dev-sts', 'feature/looker-api-integration']
100101
- deployProd:
101102
context : org-global
102103
requires:

local/seed/seedMetadata.js

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,45 @@ module.exports = (targetUrl, token) => {
3737
'Authorization': 'Bearer ' + token
3838
}
3939

40-
let promises = _(data.result.content.projectTypes).map(pt=>{
40+
let promises
41+
42+
promises = _(data.result.content.forms).orderBy(['key', 'asc'], ['version', 'asc']).map(pt=>{
43+
const param = _.omit(pt, ['id', 'version', 'revision', 'key']);
44+
return axios
45+
.post(destUrl + `metadata/form/${pt.key}/versions`, param, {headers:headers})
46+
.catch((err) => {
47+
const errMessage = _.get(err, 'response.data.message', '');
48+
console.log(`Failed to create form with key=${pt.key} version=${pt.version}.`, errMessage)
49+
})
50+
});
51+
52+
await Promise.all(promises);
53+
54+
promises = _(data.result.content.planConfigs).orderBy(['key', 'asc'], ['version', 'asc']).map(pt=>{
55+
const param = _.omit(pt, ['id', 'version', 'revision', 'key']);
56+
return axios
57+
.post(destUrl + `metadata/planConfig/${pt.key}/versions`, param, {headers:headers})
58+
.catch((err) => {
59+
const errMessage = _.get(err, 'response.data.message', '');
60+
console.log(`Failed to create planConfig with key=${pt.key} version=${pt.version}.`, errMessage)
61+
})
62+
});
63+
64+
await Promise.all(promises);
65+
66+
promises = _(data.result.content.priceConfigs).orderBy(['key', 'asc'], ['version', 'asc']).map(pt=>{
67+
const param = _.omit(pt, ['id', 'version', 'revision', 'key']);
68+
return axios
69+
.post(destUrl + `metadata/priceConfig/${pt.key}/versions`, param, {headers:headers})
70+
.catch((err) => {
71+
const errMessage = _.get(err, 'response.data.message', '');
72+
console.log(`Failed to create priceConfig with key=${pt.key} version=${pt.version}.`, errMessage)
73+
})
74+
});
75+
76+
await Promise.all(promises);
77+
78+
promises = _(data.result.content.projectTypes).map(pt=>{
4179
return axios
4280
.post(destUrl+'metadata/projectTypes', pt, {headers:headers})
4381
.catch((err) => {

local/seed/seedProjects.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,21 @@ module.exports = (targetUrl, token) => {
6060
});
6161
}
6262

63+
await models.ProjectEstimation.create({
64+
projectId,
65+
buildingBlockKey: 'BLOCK_KEY',
66+
conditions: '( HAS_DEV_DELIVERABLE && ONLY_ONE_OS_MOBILE && CA_NEEDED )',
67+
price: 6500.50,
68+
quantity: 10,
69+
minTime: 35,
70+
maxTime: 35,
71+
metadata: {
72+
deliverable: 'dev-qa',
73+
},
74+
createdBy: 1,
75+
updatedBy: 1,
76+
});
77+
6378
// creating invitations
6479
if (Array.isArray(invites)) {
6580
let promises = []

src/models/form.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ module.exports = (sequelize, DataTypes) => {
4242
Form.latestVersion = classMethods.latestVersion;
4343
Form.latestRevisionOfLatestVersion = classMethods.latestRevisionOfLatestVersion;
4444
Form.latestVersionIncludeUsed = classMethods.latestVersionIncludeUsed;
45+
Form.findOneWithLatestRevision = classMethods.findOneWithLatestRevision;
4546

4647
return Form;
4748
};

src/models/projectMemberInvite.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ module.exports = function defineProjectMemberInvite(sequelize, DataTypes) {
6767
const where = { projectId, status: INVITE_STATUS.PENDING };
6868

6969
if (email && userId) {
70-
_.assign(where, { $or: [{ email: { $eq: email } }, { userId: { $eq: userId } }] });
70+
_.assign(where, { $or: [
71+
{ email: { $eq: email.toLowerCase() } },
72+
{ userId: { $eq: userId } },
73+
] });
7174
} else if (email) {
7275
_.assign(where, { email });
7376
} else if (userId) {

src/models/projectTemplate.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
/* eslint-disable valid-jsdoc */
2+
import _ from 'lodash';
3+
4+
import models from './';
25

36
/**
47
* The Project Template model
@@ -35,5 +38,15 @@ module.exports = (sequelize, DataTypes) => {
3538
deletedAt: 'deletedAt',
3639
});
3740

41+
ProjectTemplate.getTemplate = templateId =>
42+
ProjectTemplate.findByPk(templateId, { raw: true })
43+
.then((template) => {
44+
const formRef = template.form;
45+
return formRef
46+
? models.Form.findAll({ where: formRef, raw: true })
47+
.then(forms => Object.assign({}, template, { form: _.maxBy(forms, f => f.revision) }))
48+
: template;
49+
});
50+
3851
return ProjectTemplate;
3952
};

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ module.exports = [
117117
})
118118
.then((result) => {
119119
logger.debug(`project indexed successfully (projectId: ${projectIdStart}-${projectIdEnd})`, result);
120+
logger.debug(result);
120121
})
121122
.catch((error) => {
122123
logger.error(`Error in indexing project (projectId: ${projectIdStart}-${projectIdEnd})`, error);

src/routes/form/version/getVersion.js

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,7 @@ module.exports = [
4646
.then((data) => {
4747
if (data.length === 0) {
4848
req.log.debug('No form found in ES');
49-
models.Form.findOne({
50-
where: {
51-
key: req.params.key,
52-
version: req.params.version,
53-
},
54-
order: [['revision', 'DESC']],
55-
limit: 1,
56-
attributes: { exclude: ['deletedAt', 'deletedBy'] },
57-
})
49+
models.Form.findOneWithLatestRevision(req.params)
5850
.then((form) => {
5951
// Not found
6052
if (!form) {

src/routes/milestones/delete.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ module.exports = [
4646
// Update the deletedBy, and soft delete
4747
return milestone.update({ deletedBy: req.authUser.userId })
4848
.then(() => milestone.destroy());
49-
})
49+
}),
50+
)
5051
.then((deleted) => {
5152
// Send event to bus
5253
req.log.debug('Sending event to RabbitMQ bus for milestone %d', deleted.id);
@@ -66,6 +67,6 @@ module.exports = [
6667
res.status(204).end();
6768
return Promise.resolve();
6869
})
69-
.catch(next));
70+
.catch(next);
7071
},
7172
];

src/routes/milestones/delete.spec.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ const should = chai.should(); // eslint-disable-line no-unused-vars
1616

1717
const expectAfterDelete = (timelineId, id, err, next) => {
1818
if (err) throw err;
19-
setTimeout(() =>
2019
models.Milestone.findOne({
2120
where: {
2221
timelineId,
@@ -30,9 +29,15 @@ const expectAfterDelete = (timelineId, id, err, next) => {
3029
} else {
3130
chai.assert.isNotNull(res.deletedAt);
3231
chai.assert.isNotNull(res.deletedBy);
32+
33+
request(server)
34+
.get(`/v5/timelines/${timelineId}/milestones/${id}`)
35+
.set({
36+
Authorization: `Bearer ${testUtil.jwts.admin}`,
37+
})
38+
.expect(404, next);
3339
}
34-
next();
35-
}), 500);
40+
});
3641
};
3742

3843
describe('DELETE milestone', () => {

src/routes/milestones/get.spec.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,15 @@ describe('GET milestone', () => {
303303
should.not.exist(resJson.deletedBy);
304304
should.not.exist(resJson.deletedAt);
305305

306+
// validate statusHistory
307+
should.exist(resJson.statusHistory);
308+
resJson.statusHistory.should.be.an('array');
309+
resJson.statusHistory.length.should.be.eql(1);
310+
resJson.statusHistory.forEach((statusHistory) => {
311+
statusHistory.reference.should.be.eql('milestone');
312+
statusHistory.referenceId.should.be.eql(resJson.id);
313+
});
314+
306315
done();
307316
});
308317
});

src/routes/productTemplates/list.js

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,22 @@ const permissions = tcMiddleware.permissions;
1010
module.exports = [
1111
permissions('productTemplate.view'),
1212
(req, res, next) => {
13-
util.fetchFromES('productTemplates')
14-
.then((data) => {
15-
const filters = req.query;
16-
if (!util.isValidFilter(filters, ['productKey'])) {
17-
util.handleError('Invalid filters', null, req, next);
18-
}
19-
const where = { deletedAt: { $eq: null } };
20-
if (filters.productKey) {
21-
where.productKey = { $eq: filters.productKey };
22-
}
23-
if (data.productTemplates.length === 0) {
24-
req.log.debug('No productTemplate found in ES');
25-
models.ProductTemplate.findAll({
26-
where,
27-
attributes: { exclude: ['deletedAt', 'deletedBy'] },
28-
raw: true,
29-
})
30-
.then((productTemplates) => {
31-
res.json(productTemplates);
32-
})
33-
.catch(next);
34-
} else {
35-
req.log.debug('productTemplates found in ES');
36-
res.json(data.productTemplates);
37-
}
38-
});
13+
const filters = util.parseQueryFilter(req.query.filter);
14+
if (!util.isValidFilter(filters, ['productKey'])) {
15+
return util.handleError('Invalid filters', null, req, next);
16+
}
17+
const where = { deletedAt: { $eq: null }, disabled: false };
18+
if (filters.productKey) {
19+
where.productKey = { $eq: filters.productKey };
20+
}
21+
return models.ProductTemplate.findAll({
22+
where,
23+
attributes: { exclude: ['deletedAt', 'deletedBy'] },
24+
raw: true,
25+
})
26+
.then((productTemplates) => {
27+
res.json(productTemplates);
28+
})
29+
.catch(next);
3930
},
4031
];

src/routes/productTemplates/list.spec.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ import models from '../../models';
99
import server from '../../app';
1010
import testUtil from '../../tests/util';
1111

12-
const should = chai.should();
12+
const should = chai.should(); // eslint-disable-line no-unused-vars
1313

1414
const validateProductTemplates = (count, resJson, expectedTemplates) => {
15-
should.exist(resJson);
1615
resJson.length.should.be.eql(count);
16+
1717
resJson.forEach((pt, idx) => {
1818
pt.should.include.all.keys('id', 'name', 'productKey', 'category', 'subCategory', 'icon', 'brief', 'details',
1919
'aliases', 'template', 'disabled', 'form', 'hidden', 'isAddOn', 'createdBy', 'createdAt', 'updatedBy', 'updatedAt');
@@ -52,7 +52,7 @@ describe('LIST product templates', () => {
5252
},
5353
alias2: [1, 2, 3],
5454
},
55-
disabled: true,
55+
disabled: false,
5656
hidden: true,
5757
isAddOn: true,
5858
template: {
@@ -192,7 +192,7 @@ describe('LIST product templates', () => {
192192
.expect(200)
193193
.end((err, res) => {
194194
const resJson = res.body;
195-
validateProductTemplates(1, resJson, [templates[1]]);
195+
validateProductTemplates(1, [resJson[1]], [templates[1]]);
196196
done();
197197
});
198198
});

src/routes/projectTemplates/list.js

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,21 @@
33
*/
44
import { middleware as tcMiddleware } from 'tc-core-library-js';
55
import models from '../../models';
6-
import util from '../../util';
76

87
const permissions = tcMiddleware.permissions;
98

109
module.exports = [
1110
permissions('projectTemplate.view'),
12-
(req, res, next) => {
13-
util.fetchFromES('projectTemplates')
14-
.then((data) => {
15-
if (data.projectTemplates.length === 0) {
16-
req.log.debug('No projectTemplate found in ES');
17-
models.ProjectTemplate.findAll({
18-
where: {
19-
deletedAt: { $eq: null },
20-
},
21-
attributes: { exclude: ['deletedAt', 'deletedBy'] },
22-
raw: true,
23-
}).then((projectTemplates) => {
24-
res.json(projectTemplates);
25-
})
26-
.catch(next);
27-
} else {
28-
req.log.debug('projectTemplates found in ES');
29-
res.json(data.projectTemplates);
30-
}
31-
});
32-
},
11+
(req, res, next) => models.ProjectTemplate.findAll({
12+
where: {
13+
deletedAt: { $eq: null },
14+
disabled: false,
15+
},
16+
attributes: { exclude: ['deletedAt', 'deletedBy'] },
17+
raw: true,
18+
})
19+
.then((projectTemplates) => {
20+
res.json(projectTemplates);
21+
})
22+
.catch(next),
3323
];

src/routes/projectTemplates/list.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ describe('LIST project templates', () => {
2020
question: 'question 1',
2121
info: 'info 1',
2222
aliases: ['key-1', 'key_1'],
23-
disabled: true,
23+
disabled: false,
2424
hidden: true,
2525
scope: {
2626
scope1: {

src/routes/projects/list.spec.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,8 @@ describe('LIST Project', () => {
247247
}).then(() => {
248248
// sleep for some time, let elasticsearch indices be settled
249249
// sleep.sleep(5);
250-
done();
250+
testUtil.wait(done);
251+
// done();
251252
});
252253
});
253254
});

0 commit comments

Comments
 (0)