From 4895bce2e2caa4f347c14747d5cf54e1032fa36a Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Tue, 22 Jul 2025 00:03:23 +0300 Subject: [PATCH 1/2] PM-1498 - support for opportunity title --- src/routes/copilotRequest/create.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/copilotRequest/create.js b/src/routes/copilotRequest/create.js index 2b05f524..1522fac6 100644 --- a/src/routes/copilotRequest/create.js +++ b/src/routes/copilotRequest/create.js @@ -14,6 +14,7 @@ const addCopilotRequestValidations = { data: Joi.object() .keys({ projectId: Joi.number().required(), + opportunityTitle: Joi.string().required(), copilotUsername: Joi.string(), complexity: Joi.string().valid('low', 'medium', 'high').required(), requiresCommunication: Joi.string().valid('yes', 'no').required(), From 191cc9803578deee6bff680b0b3874edd3980440 Mon Sep 17 00:00:00 2001 From: Vasilica Olariu Date: Tue, 22 Jul 2025 13:44:00 +0300 Subject: [PATCH 2/2] PM-1499 - edit copilot request --- src/routes/copilotRequest/update.js | 79 +++++++++++++++++++++++++++++ src/routes/index.js | 3 +- 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 src/routes/copilotRequest/update.js diff --git a/src/routes/copilotRequest/update.js b/src/routes/copilotRequest/update.js new file mode 100644 index 00000000..bf141885 --- /dev/null +++ b/src/routes/copilotRequest/update.js @@ -0,0 +1,79 @@ +import validate from 'express-validation'; +import _ from 'lodash'; +import Joi from 'joi'; + +import models from '../../models'; +import util from '../../util'; +import { COPILOT_OPPORTUNITY_TYPE } from '../../constants'; +import { PERMISSION } from '../../permissions/constants'; + +const updateCopilotRequestValidations = { + body: Joi.object().keys({ + data: Joi.object() + .keys({ + projectId: Joi.number().required(), + copilotUsername: Joi.string(), + complexity: Joi.string().valid('low', 'medium', 'high'), + requiresCommunication: Joi.string().valid('yes', 'no'), + paymentType: Joi.string().valid('standard', 'other'), + otherPaymentType: Joi.string(), + opportunityTitle: Joi.string(), + projectType: Joi.string().valid(_.values(COPILOT_OPPORTUNITY_TYPE)), + overview: Joi.string().min(10), + skills: Joi.array().items( + Joi.object({ + id: Joi.string().required(), + name: Joi.string().required(), + }), + ), + startDate: Joi.date().iso(), + numWeeks: Joi.number().integer().positive(), + tzRestrictions: Joi.string(), + numHoursPerWeek: Joi.number().integer().positive(), + }) + .required(), + }), +}; + +module.exports = [ + validate(updateCopilotRequestValidations), + async (req, res, next) => { + const copilotRequestId = _.parseInt(req.params.copilotRequestId); + const patchData = req.body.data; + + if (!util.hasPermissionByReq(PERMISSION.MANAGE_COPILOT_REQUEST, req)) { + const err = new Error('Unable to update copilot request'); + _.assign(err, { + details: JSON.stringify({ message: 'You do not have permission to update copilot request' }), + status: 403, + }); + util.handleError('Permission error', err, req, next); + return; + } + + try { + const copilotRequest = await models.CopilotRequest.findOne({ + where: { id: copilotRequestId }, + }); + + if (!copilotRequest) { + const err = new Error(`Copilot request not found for id ${copilotRequestId}`); + err.status = 404; + throw err; + } + + // Only update fields provided in patchData + await copilotRequest.update(_.extend({ + data: patchData, + updatedBy: req.authUser.userId, + })); + + res.status(200).json(copilotRequest); + } catch (err) { + if (err.message) { + _.assign(err, { details: err.message }); + } + util.handleError('Error updating copilot request', err, req, next); + } + }, +]; diff --git a/src/routes/index.js b/src/routes/index.js index fd069fcd..87e48a86 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -396,7 +396,8 @@ router.route('/v5/projects/:projectId(\\d+)/settings') router.route('/v5/projects/copilots/requests') .get(require('./copilotRequest/list')); router.route('/v5/projects/copilots/requests/:copilotRequestId(\\d+)') - .get(require('./copilotRequest/get')); + .get(require('./copilotRequest/get')) + .patch(require('./copilotRequest/update')); router.route('/v5/projects/:projectId(\\d+)/copilots/requests') .get(require('./copilotRequest/list')) .post(require('./copilotRequest/create'));