diff --git a/src/bootstrap.js b/src/bootstrap.js index 6a364e8a..2999f131 100644 --- a/src/bootstrap.js +++ b/src/bootstrap.js @@ -16,7 +16,7 @@ Joi.rateType = () => Joi.string().valid('hourly', 'daily', 'weekly', 'monthly') Joi.jobStatus = () => Joi.string().valid('sourcing', 'in-review', 'assigned', 'closed', 'cancelled') Joi.resourceBookingStatus = () => Joi.string().valid('placed', 'closed', 'cancelled') Joi.workload = () => Joi.string().valid('full-time', 'fractional') -Joi.jobCandidateStatus = () => Joi.string().valid('open', 'placed', 'selected', 'client rejected - screening', 'client rejected - interview', 'rejected - other', 'cancelled', 'interview', 'topcoder-rejected') +Joi.jobCandidateStatus = () => Joi.string().valid('open', 'placed', 'selected', 'client rejected - screening', 'client rejected - interview', 'rejected - other', 'cancelled', 'interview', 'topcoder-rejected', 'applied','rejected-pre-screen','skills-test','skills-test','phone-screen','job-closed') Joi.title = () => Joi.string().max(128) Joi.paymentStatus = () => Joi.string().valid('pending', 'partially-completed', 'completed', 'cancelled') Joi.xaiTemplate = () => Joi.string().valid(...allowedXAITemplate) diff --git a/src/common/helper.js b/src/common/helper.js index b8dc9c5a..0ce11905 100644 --- a/src/common/helper.js +++ b/src/common/helper.js @@ -725,9 +725,6 @@ function getPageLink(req, page) { * @param {Object} result the operation result */ function setResHeaders(req, res, result) { - if (result.fromDb) { - return; - } const totalPages = Math.ceil(result.total / result.perPage); if (result.page > 1) { res.set('X-Prev-Page', result.page - 1); diff --git a/src/eventHandlers/ResourceBookingEventHandler.js b/src/eventHandlers/ResourceBookingEventHandler.js index 3e8c18c3..ef5825fc 100644 --- a/src/eventHandlers/ResourceBookingEventHandler.js +++ b/src/eventHandlers/ResourceBookingEventHandler.js @@ -169,7 +169,9 @@ async function updateWorkPeriods (payload) { raw: true }) // gather workPeriod dates - const newWorkPeriods = helper.extractWorkPeriods(payload.value.startDate || payload.options.oldValue.startDate, payload.value.endDate || payload.options.oldValue.endDate) + const newWorkPeriods = helper.extractWorkPeriods( + _.isUndefined(payload.value.startDate) ? payload.options.oldValue.startDate : payload.value.startDate, + _.isUndefined(payload.value.endDate) ? payload.options.oldValue.endDate : payload.value.endDate) // find which workPeriods should be removed const workPeriodsToRemove = _.differenceBy(workPeriods, newWorkPeriods, 'startDate') // find which workperiods should be created diff --git a/src/services/PaymentService.js b/src/services/PaymentService.js index 3143b936..d06ad671 100644 --- a/src/services/PaymentService.js +++ b/src/services/PaymentService.js @@ -84,8 +84,8 @@ async function createChallenge (challenge, token) { if (challenge.billingAccountId) { body.billing = { - billingAccountId: challenge.billingAccountId, - markup: 0 // for TaaS payments we always use 0 markup + billingAccountId: _.toString(challenge.billingAccountId), + markup: 0 // for TaaS payments we always use 0 markup } } try { diff --git a/src/services/ResourceBookingService.js b/src/services/ResourceBookingService.js index 81c21fda..f5c40206 100644 --- a/src/services/ResourceBookingService.js +++ b/src/services/ResourceBookingService.js @@ -194,7 +194,9 @@ async function _ensurePaidWorkPeriodsNotDeleted (resourceBookingId, oldValue, ne return } // gather workPeriod dates from provided dates - const newWorkPeriods = helper.extractWorkPeriods(newValue.startDate || oldValue.startDate, newValue.endDate || oldValue.endDate) + const newWorkPeriods = helper.extractWorkPeriods( + _.isUndefined(newValue.startDate) ? oldValue.startDate : newValue.startDate, + _.isUndefined(newValue.endDate) ? oldValue.endDate : newValue.endDate) // find which workPeriods should be removed const workPeriodsToRemove = _.differenceBy(workPeriods, newWorkPeriods, 'startDate') // we can't delete workperiods with paymentStatus 'partially-completed' or 'completed'. @@ -470,6 +472,7 @@ async function searchResourceBookings (currentUser, criteria, options = { return criteria.sortOrder = 'desc' } try { + throw new Error('fallback to DB') const esQuery = { index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), _source_includes: queryOpt.include, @@ -477,14 +480,7 @@ async function searchResourceBookings (currentUser, criteria, options = { return body: { query: { bool: { - must: [ - { - nested: { - path: 'workPeriods', - query: { bool: { must: [] } } - } - } - ] + must: [] } }, from: (page - 1) * perPage, @@ -526,22 +522,33 @@ async function searchResourceBookings (currentUser, criteria, options = { return }] } // Apply WorkPeriod filters - _.each(_.pick(criteria, ['workPeriods.paymentStatus', 'workPeriods.startDate', 'workPeriods.endDate', 'workPeriods.userHandle']), (value, key) => { - esQuery.body.query.bool.must[0].nested.query.bool.must.push({ - term: { - [key]: { - value + const workPeriodFilters = ['workPeriods.paymentStatus', 'workPeriods.startDate', 'workPeriods.endDate', 'workPeriods.userHandle'] + if (_.intersection(criteria, workPeriodFilters).length > 0) { + const workPeriodsMust = [] + _.each(_.pick(criteria, workPeriodFilters), (value, key) => { + workPeriodsMust.push({ + term: { + [key]: { + value + } } + }) + }) + + esQuery.body.query.bool.must.push({ + nested: { + path: 'workPeriods', + query: { bool: { must: workPeriodsMust } } } }) - }) + } logger.debug({ component: 'ResourceBookingService', context: 'searchResourceBookings', message: `Query: ${JSON.stringify(esQuery)}` }) const { body } = await esClient.search(esQuery) let resourceBookings = _.map(body.hits.hits, '_source') // ESClient will return ResourceBookings with it's all nested WorkPeriods // We re-apply WorkPeriod filters - _.each(_.pick(criteria, ['workPeriods.startDate', 'workPeriods.endDate', 'workPeriods.userHandle', 'workPeriods.paymentStatus']), (value, key) => { + _.each(_.pick(criteria, workPeriodFilters), (value, key) => { key = key.split('.')[1] _.each(resourceBookings, r => { r.workPeriods = _.filter(r.workPeriods, { [key]: value }) @@ -612,9 +619,10 @@ async function searchResourceBookings (currentUser, criteria, options = { return queryCriteria.order = [[{ model: WorkPeriod, as: 'workPeriods' }, _.split(criteria.sortBy, '.')[1], criteria.sortOrder]] } const resourceBookings = await ResourceBooking.findAll(queryCriteria) + const total = await ResourceBooking.count(_.omit(queryCriteria, ['limit', 'offset', 'attributes', 'order'])) return { fromDb: true, - total: resourceBookings.length, + total, page, perPage, result: resourceBookings