@europeana/portal
Version:
Europeana Portal
67 lines (59 loc) • 2.07 kB
JavaScript
import axios from 'axios';
import { errorHandler } from '../';
import { truncate, wordLength } from '../../../plugins/vue-filters';
const JIRA_SERVICE_DESK_API_PATH = '/rest/servicedeskapi/request';
const JSON_CONTENT_TYPE = 'application/json';
const jiraData = (options, req) => {
const { customFields } = options.serviceDesk;
const data = {
serviceDeskId: options.serviceDesk.serviceDeskId,
requestTypeId: options.serviceDesk.requestTypeId,
requestFieldValues: {
summary: truncate(req.body.feedback, 50),
description: req.body.feedback
}
};
if (customFields) {
if (customFields.pageUrl && req.body.pageUrl) {
data.requestFieldValues[customFields.pageUrl] = req.body.pageUrl;
}
if (customFields.browser && req.body.browser) {
data.requestFieldValues[customFields.browser] = req.body.browser;
}
if (customFields.screensize && req.body.screensize) {
data.requestFieldValues[customFields.screensize] = req.body.screensize;
}
}
if (req.body.email) {
data.raiseOnBehalfOf = req.body.email;
}
return data;
};
const validateFeedbackLength = feedback => wordLength(feedback) >= 5;
const validateFeedback = feedback => new Promise((resolve, reject) => {
if (validateFeedbackLength(feedback)) {
resolve();
} else {
reject({ status: 400, message: 'Invalid feedback.' });
}
});
const jiraOptions = options => ({
auth: {
username: options.username,
password: options.password
},
headers: {
'Accept': JSON_CONTENT_TYPE,
'Content-Type': JSON_CONTENT_TYPE
}
});
// Docs: https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-request/#api-rest-servicedeskapi-request-post
export default (options = {}) => (req, res) => {
return validateFeedback(req.body.feedback)
.then(() => (axios
.create({ baseURL: options.origin })
.post(JIRA_SERVICE_DESK_API_PATH, jiraData(options, req), jiraOptions(options))
.then(jiraRes => res.sendStatus(jiraRes.status))
))
.catch(error => errorHandler(res, error));
};