From 10a7c4151f74385078763021dbf7719188d9ac33 Mon Sep 17 00:00:00 2001 From: imcaizheng Date: Fri, 27 Nov 2020 23:49:42 +0800 Subject: [PATCH] validate skills before create/update jobs --- src/common/helper.js | 1 + src/services/JobService.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/common/helper.js b/src/common/helper.js index 4df5766b..dd8a20a9 100644 --- a/src/common/helper.js +++ b/src/common/helper.js @@ -406,6 +406,7 @@ module.exports = { isConnectMember, getESClient, getUserId, + getM2Mtoken, postEvent, getBusApiClient, isDocumentMissingException, diff --git a/src/services/JobService.js b/src/services/JobService.js index f4953782..6970db49 100644 --- a/src/services/JobService.js +++ b/src/services/JobService.js @@ -5,6 +5,7 @@ const _ = require('lodash') const Joi = require('joi') const config = require('config') +const HttpStatus = require('http-status-codes') const { Op } = require('sequelize') const { v4: uuid } = require('uuid') const helper = require('../common/helper') @@ -46,6 +47,34 @@ async function _getJobCandidates (jobId) { return candidates } +/** + * Validate if all skills exist. + * + * @param {Array} skills the list of skills + * @returns {undefined} + */ +async function _validateSkills (skills) { + const m2mToken = await helper.getM2Mtoken() + const responses = await Promise.all( + skills.map( + skill => helper.getSkillById(`Bearer ${m2mToken}`, skill) + .then(() => { + return { found: true } + }) + .catch(err => { + if (err.status !== HttpStatus.NOT_FOUND) { + throw err + } + return { found: false, skill } + }) + ) + ) + const errResponses = responses.filter(res => !res.found) + if (errResponses.length) { + throw new errors.BadRequestError(`Invalid skills: [${errResponses.map(res => res.skill)}]`) + } +} + /** * Get job by id * @param {String} id the job id @@ -91,6 +120,7 @@ getJob.schema = Joi.object().keys({ * @returns {Object} the created job */ async function createJob (currentUser, job) { + await _validateSkills(job.skills) if (!currentUser.isBookingManager) { const connect = await helper.isConnectMember(job.projectId, currentUser.jwtToken) if (!connect) { @@ -130,6 +160,9 @@ createJob.schema = Joi.object().keys({ * @returns {Object} the updated job */ async function updateJob (currentUser, id, data) { + if (data.skills) { + await _validateSkills(data.skills) + } let job = await Job.findById(id) if (!currentUser.isBookingManager) { const connect = await helper.isConnectMember(job.dataValues.projectId, currentUser.jwtToken)