diff --git a/src/bootstrap.js b/src/bootstrap.js index f9b0f7a..5648bbc 100644 --- a/src/bootstrap.js +++ b/src/bootstrap.js @@ -9,6 +9,10 @@ Joi.jobStatus = () => Joi.string().valid('sourcing', 'in-review', 'assigned', 'c Joi.jobCandidateStatus = () => Joi.string().valid('open', 'selected', 'shortlist', 'rejected', 'cancelled', 'interview') Joi.workload = () => Joi.string().valid('full-time', 'fractional') Joi.title = () => Joi.string().max(128) +// Empty string is not allowed by Joi by default and must be enabled with allow(''). +// See https://joi.dev/api/?v=17.3.0#string fro details why it's like this. +// In many cases we would like to allow empty string to make it easier to create UI for editing data. +Joi.stringAllowEmpty = () => Joi.string().allow('') const zapierSwitch = Joi.string().label('ZAPIER_SWITCH').valid(...Object.values(constants.Zapier.Switch)) diff --git a/src/scripts/createIndex.js b/src/scripts/createIndex.js index 4edce30..45cca2e 100644 --- a/src/scripts/createIndex.js +++ b/src/scripts/createIndex.js @@ -20,7 +20,7 @@ async function createIndex () { description: { type: 'text' }, title: { type: 'text' }, startDate: { type: 'date' }, - endDate: { type: 'date' }, + duration: { type: 'integer' }, numPositions: { type: 'integer' }, resourceType: { type: 'keyword' }, rateType: { type: 'keyword' }, diff --git a/src/services/JobCandidateProcessorService.js b/src/services/JobCandidateProcessorService.js index 0936815..3d0243c 100644 --- a/src/services/JobCandidateProcessorService.js +++ b/src/services/JobCandidateProcessorService.js @@ -2,7 +2,6 @@ * Jobcandidate Processor Service */ -const _ = require('lodash') const Joi = require('@hapi/joi') const logger = require('../common/logger') const helper = require('../common/helper') @@ -80,7 +79,7 @@ async function processCreate (message, transactionId) { index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), id: jobcandidate.id, transactionId, - body: _.omit(jobcandidate, 'id'), + body: jobcandidate, refresh: constants.esRefreshOption }) } @@ -97,9 +96,11 @@ processCreate.schema = { userId: Joi.string().uuid().required(), createdAt: Joi.date().required(), createdBy: Joi.string().uuid().required(), + updatedAt: Joi.date().allow(null), + updatedBy: Joi.string().uuid().allow(null), status: Joi.jobCandidateStatus().required(), - externalId: Joi.string(), - resume: Joi.string().uri() + externalId: Joi.string().allow(null), + resume: Joi.string().uri().allow(null) }).required() }).required(), transactionId: Joi.string().required() @@ -117,7 +118,7 @@ async function processUpdate (message, transactionId) { id: data.id, transactionId, body: { - doc: _.omit(data, ['id']) + doc: data }, refresh: constants.esRefreshOption }) @@ -127,25 +128,7 @@ async function processUpdate (message, transactionId) { }) } -processUpdate.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - payload: Joi.object().keys({ - id: Joi.string().uuid(), - jobId: Joi.string().uuid(), - userId: Joi.string().uuid(), - status: Joi.jobCandidateStatus(), - externalId: Joi.string(), - resume: Joi.string().uri(), - updatedAt: Joi.date(), - updatedBy: Joi.string().uuid() - }).required() - }).required(), - transactionId: Joi.string().required() -} +processUpdate.schema = processCreate.schema /** * Process delete entity message diff --git a/src/services/JobProcessorService.js b/src/services/JobProcessorService.js index 72131ed..a2e35a1 100644 --- a/src/services/JobProcessorService.js +++ b/src/services/JobProcessorService.js @@ -2,7 +2,6 @@ * Job Processor Service */ -const _ = require('lodash') const Joi = require('@hapi/joi') const logger = require('../common/logger') const helper = require('../common/helper') @@ -51,7 +50,7 @@ async function processCreate (message, transactionId) { index: config.get('esConfig.ES_INDEX_JOB'), id: job.id, transactionId, - body: _.omit(job, 'id'), + body: job, refresh: constants.esRefreshOption }) await postMessageToZapier({ @@ -69,18 +68,20 @@ processCreate.schema = { payload: Joi.object().keys({ id: Joi.string().uuid().required(), projectId: Joi.number().integer().required(), - externalId: Joi.string(), - description: Joi.string(), + externalId: Joi.string().allow(null), + description: Joi.stringAllowEmpty().allow(null), title: Joi.title().required(), - startDate: Joi.date(), - endDate: Joi.date(), + startDate: Joi.date().allow(null), + duration: Joi.number().integer().min(1).allow(null), numPositions: Joi.number().integer().min(1).required(), - resourceType: Joi.string(), - rateType: Joi.rateType(), - workload: Joi.workload(), + resourceType: Joi.stringAllowEmpty().allow(null), + rateType: Joi.rateType().allow(null), + workload: Joi.workload().allow(null), skills: Joi.array().items(Joi.string().uuid()).required(), createdAt: Joi.date().required(), createdBy: Joi.string().uuid().required(), + updatedAt: Joi.date().allow(null), + updatedBy: Joi.string().uuid().allow(null), status: Joi.jobStatus().required() }).required() }).required(), @@ -99,7 +100,7 @@ async function processUpdate (message, transactionId) { id: data.id, transactionId, body: { - doc: _.omit(data, ['id']) + doc: data }, refresh: constants.esRefreshOption }) @@ -109,32 +110,7 @@ async function processUpdate (message, transactionId) { }) } -processUpdate.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - payload: Joi.object().keys({ - id: Joi.string().uuid().required(), - projectId: Joi.number().integer(), - externalId: Joi.string(), - description: Joi.string(), - title: Joi.title(), - startDate: Joi.date(), - endDate: Joi.date(), - numPositions: Joi.number().integer().min(1), - resourceType: Joi.string(), - rateType: Joi.rateType(), - workload: Joi.workload(), - skills: Joi.array().items(Joi.string().uuid()), - status: Joi.jobStatus(), - updatedAt: Joi.date(), - updatedBy: Joi.string().uuid() - }).required() - }).required(), - transactionId: Joi.string().required() -} +processUpdate.schema = processCreate.schema /** * Process delete entity message diff --git a/src/services/ResourceBookingProcessorService.js b/src/services/ResourceBookingProcessorService.js index 23b1de3..964f4d0 100644 --- a/src/services/ResourceBookingProcessorService.js +++ b/src/services/ResourceBookingProcessorService.js @@ -2,7 +2,6 @@ * ResourceBooking Processor Service */ -const _ = require('lodash') const Joi = require('@hapi/joi') const logger = require('../common/logger') const helper = require('../common/helper') @@ -22,7 +21,7 @@ async function processCreate (message, transactionId) { index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), id: resourcebooking.id, transactionId, - body: _.omit(resourcebooking, 'id'), + body: resourcebooking, refresh: constants.esRefreshOption }) } @@ -37,14 +36,16 @@ processCreate.schema = { id: Joi.string().uuid().required(), projectId: Joi.number().integer().required(), userId: Joi.string().uuid().required(), - jobId: Joi.string().uuid(), - startDate: Joi.date(), - endDate: Joi.date(), - memberRate: Joi.number(), - customerRate: Joi.number(), + jobId: Joi.string().uuid().allow(null), + startDate: Joi.date().allow(null), + endDate: Joi.date().allow(null), + memberRate: Joi.number().allow(null), + customerRate: Joi.number().allow(null), rateType: Joi.rateType().required(), createdAt: Joi.date().required(), createdBy: Joi.string().uuid().required(), + updatedAt: Joi.date().allow(null), + updatedBy: Joi.string().uuid().allow(null), status: Joi.jobStatus().required() }).required() }).required(), @@ -63,35 +64,13 @@ async function processUpdate (message, transactionId) { id: data.id, transactionId, body: { - doc: _.omit(data, ['id']) + doc: data }, refresh: constants.esRefreshOption }) } -processUpdate.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - payload: Joi.object().keys({ - id: Joi.string().uuid().required(), - projectId: Joi.number().integer(), - userId: Joi.string().uuid(), - jobId: Joi.string().uuid(), - startDate: Joi.date(), - endDate: Joi.date(), - memberRate: Joi.number(), - customerRate: Joi.number(), - rateType: Joi.rateType(), - status: Joi.jobStatus(), - updatedAt: Joi.date(), - updatedBy: Joi.string().uuid() - }).required() - }).required(), - transactionId: Joi.string().required() -} +processUpdate.schema = processCreate.schema /** * Process delete entity message