Skip to content

Commit be0f6e1

Browse files
author
James Cori
committed
Merge branch 'develop'
2 parents a21eb1c + aeb98b3 commit be0f6e1

9 files changed

+53
-16
lines changed

src/common/helper.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,23 @@ async function scan (modelName, scanParams) {
295295
})
296296
}
297297

298+
/**
299+
* Get all data collection (avoid default page limit of DynamoDB) by scan parameters
300+
* @param {Object} modelName The dynamoose model name
301+
* @param {Object} scanParams The scan parameters object
302+
* @returns {Array}
303+
*/
304+
async function scanAll (modelName, scanParams) {
305+
let results = await models[modelName].scan(scanParams).exec()
306+
let lastKey = results.lastKey
307+
while (!_.isUndefined(results.lastKey)) {
308+
const newResult = await models[modelName].scan(scanParams).startAt(lastKey).exec()
309+
results = [...results, ...newResult]
310+
lastKey = newResult.lastKey
311+
}
312+
return results
313+
}
314+
298315
/**
299316
* Test whether the given value is partially match the filter.
300317
* @param {String} filter the filter
@@ -918,6 +935,7 @@ module.exports = {
918935
create,
919936
update,
920937
scan,
938+
scanAll,
921939
validateDuplicate,
922940
partialMatch,
923941
validatePhases,

src/controllers/ChallengeTimelineTemplateController.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
*/
44
const HttpStatus = require('http-status-codes')
55
const service = require('../services/ChallengeTimelineTemplateService')
6+
const helper = require('../common/helper')
67

78
/**
89
* Search challenge type timeline templates.
@@ -11,7 +12,8 @@ const service = require('../services/ChallengeTimelineTemplateService')
1112
*/
1213
async function searchChallengeTimelineTemplates (req, res) {
1314
const result = await service.searchChallengeTimelineTemplates(req.query)
14-
res.send(result)
15+
helper.setResHeaders(req, res, result)
16+
res.send(result.result)
1517
}
1618

1719
/**

src/services/AuditLogService.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const helper = require('../common/helper')
1515
async function searchAuditLogs (criteria) {
1616
const page = criteria.page || 1
1717
const perPage = criteria.perPage || 50
18-
let records = await helper.scan('AuditLog')
18+
let records = await helper.scanAll('AuditLog')
1919
// TODO this needs to be in ES
2020
if (criteria.fieldName) records = _.filter(records, e => helper.partialMatch(criteria.fieldName, e.fieldName))
2121
if (criteria.createdDateStart) records = _.filter(records, e => criteria.createdDateStart.getTime() <= e.created.getTime())

src/services/ChallengeService.js

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,7 @@ searchChallenges.schema = {
640640
tags: Joi.array().items(Joi.string()),
641641
includeAllTags: Joi.boolean().default(true),
642642
projectId: Joi.number().integer().positive(),
643-
forumId: Joi.number().integer().positive(),
643+
forumId: Joi.number().integer(),
644644
legacyId: Joi.number().integer().positive(),
645645
status: Joi.string().valid(_.values(constants.challengeStatuses)),
646646
group: Joi.string(),
@@ -722,13 +722,19 @@ async function validateChallengeData (challenge) {
722722
* @param {String} timelineTemplateId the timeline template id
723723
*/
724724
async function populatePhases (phases, startDate, timelineTemplateId) {
725-
if (!phases || phases.length === 0) {
726-
return
727-
}
728725
if (_.isUndefined(timelineTemplateId)) {
729726
throw new errors.BadRequestError(`Invalid timeline template ID: ${timelineTemplateId}`)
730727
}
731728
const template = await helper.getById('TimelineTemplate', timelineTemplateId)
729+
if (!phases || phases.length === 0) {
730+
// auto populate phases
731+
for (const p of template.phases) {
732+
phases.push({
733+
phaseId: p.phaseId,
734+
duration: p.defaultDuration
735+
})
736+
}
737+
}
732738
const phaseDefinitions = await helper.scan('Phase')
733739
// generate phase instance ids
734740
for (let i = 0; i < phases.length; i += 1) {
@@ -861,7 +867,11 @@ async function createChallenge (currentUser, challenge, userToken) {
861867
throw new errors.BadRequestError(`trackId and typeId are required to create a challenge`)
862868
}
863869
}
864-
if (challenge.timelineTemplateId && challenge.phases && challenge.phases.length > 0) {
870+
871+
if (challenge.timelineTemplateId) {
872+
if (!challenge.phases) {
873+
challenge.phases = []
874+
}
865875
await populatePhases(challenge.phases, challenge.startDate, challenge.timelineTemplateId)
866876
}
867877

@@ -1072,7 +1082,7 @@ async function getChallenge (currentUser, id) {
10721082
// Remove privateDescription for unregistered users
10731083
let memberChallengeIds
10741084
if (currentUser) {
1075-
if (!currentUser.isMachine) {
1085+
if (!currentUser.isMachine && !helper.hasAdminRole(currentUser)) {
10761086
memberChallengeIds = await helper.listChallengesByMember(currentUser.userId)
10771087
if (!_.includes(memberChallengeIds, challenge.id)) {
10781088
_.unset(challenge, 'privateDescription')
@@ -1306,11 +1316,13 @@ async function update (currentUser, challengeId, data, userToken, isFull) {
13061316
}
13071317
}
13081318
}
1309-
const newPhases = challenge.phases
1319+
1320+
const newPhases = _.cloneDeep(challenge.phases) || []
13101321
const newStartDate = data.startDate || challenge.startDate
13111322

13121323
await helper.validatePhases(newPhases)
13131324
// populate phases
1325+
13141326
await populatePhases(newPhases, newStartDate, data.timelineTemplateId || challenge.timelineTemplateId)
13151327
data.phases = newPhases
13161328
data.startDate = newStartDate
@@ -1793,7 +1805,7 @@ partiallyUpdateChallenge.schema = {
17931805
reviewType: Joi.string(),
17941806
confidentialityType: Joi.string().default(config.DEFAULT_CONFIDENTIALITY_TYPE),
17951807
directProjectId: Joi.number(),
1796-
forumId: Joi.number().integer().positive(),
1808+
forumId: Joi.number().integer(),
17971809
isTask: Joi.boolean()
17981810
}).unknown(true),
17991811
task: Joi.object().keys({

src/services/ChallengeTimelineTemplateService.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,17 @@ const constants = require('../../app-constants')
1616
* @returns {Array} the search result
1717
*/
1818
async function searchChallengeTimelineTemplates (criteria) {
19-
let records = await helper.scan('ChallengeTimelineTemplate')
19+
let records = await helper.scanAll('ChallengeTimelineTemplate')
2020
if (criteria.typeId) records = _.filter(records, e => (criteria.typeId === e.typeId))
2121
if (criteria.trackId) records = _.filter(records, e => (criteria.trackId === e.trackId))
2222
if (criteria.timelineTemplateId) records = _.filter(records, e => (criteria.timelineTemplateId === e.timelineTemplateId))
2323
if (!_.isUndefined(criteria.isDefault)) records = _.filter(records, e => (e.isDefault === (criteria.isDefault === 'true')))
24-
return records
24+
return {
25+
total: records.length,
26+
page: 1,
27+
perPage: Math.max(records.length, 10),
28+
result: records
29+
}
2530
}
2631

2732
searchChallengeTimelineTemplates.schema = {

src/services/ChallengeTrackService.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const constants = require('../../app-constants')
1616
*/
1717
async function searchChallengeTracks (criteria) {
1818
// TODO - move this to ES
19-
let records = await helper.scan('ChallengeTrack')
19+
let records = await helper.scanAll('ChallengeTrack')
2020
const page = criteria.page || 1
2121
const perPage = criteria.perPage || 50
2222

src/services/ChallengeTypeService.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const constants = require('../../app-constants')
1515
*/
1616
async function searchChallengeTypes (criteria) {
1717
// TODO - move this to ES
18-
let records = await helper.scan('ChallengeType')
18+
let records = await helper.scanAll('ChallengeType')
1919
const page = criteria.page || 1
2020
const perPage = criteria.perPage || 50
2121

src/services/PhaseService.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const constants = require('../../app-constants')
1717
async function searchPhases (criteria) {
1818
const page = criteria.page || 1
1919
const perPage = criteria.perPage || 50
20-
const list = await helper.scan('Phase')
20+
const list = await helper.scanAll('Phase')
2121
const records = _.filter(list, e => helper.partialMatch(criteria.name, e.name))
2222
const total = records.length
2323
const result = records.slice((page - 1) * perPage, page * perPage)

src/services/TimelineTemplateService.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const constants = require('../../app-constants')
1717
async function searchTimelineTemplates (criteria) {
1818
const page = criteria.page || 1
1919
const perPage = criteria.perPage || 50
20-
const list = await helper.scan('TimelineTemplate')
20+
const list = await helper.scanAll('TimelineTemplate')
2121
const records = _.filter(list, e => helper.partialMatch(criteria.name, e.name))
2222
const total = records.length
2323
const result = records.slice((page - 1) * perPage, page * perPage)

0 commit comments

Comments
 (0)