From c954ba03e5705daa15481a383fe720b767fa4bba Mon Sep 17 00:00:00 2001 From: Chris Brame Date: Wed, 14 Apr 2021 01:37:42 -0400 Subject: [PATCH] fix(tickets): third party --- src/client/actions/tickets.js | 4 ++- src/client/actions/types.js | 1 + src/client/api/index.js | 6 ++++ .../Tickets/SingleTicketContainer.jsx | 35 +++++++++++++++---- src/client/sagas/tickets/index.js | 20 ++++++++++- src/controllers/api/v2/routes.js | 1 + src/controllers/api/v2/tickets.js | 33 +++++++++++++++++ src/helpers/viewdata/index.js | 10 ++++++ src/settings/settingsUtil.js | 2 ++ 9 files changed, 104 insertions(+), 8 deletions(-) diff --git a/src/client/actions/tickets.js b/src/client/actions/tickets.js index e17e44bae..24f9eb41e 100644 --- a/src/client/actions/tickets.js +++ b/src/client/actions/tickets.js @@ -28,7 +28,8 @@ import { UNLOAD_TICKETS, TICKET_UPDATED, DELETE_TICKET, - TICKET_EVENT + TICKET_EVENT, + TRANSFER_TO_THIRDPARTY } from 'actions/types' export const fetchTickets = createAction(FETCH_TICKETS.ACTION) @@ -56,3 +57,4 @@ export const deletePriority = createAction(DELETE_PRIORITY.ACTION, ({ id, newPri export const getTagsWithPage = createAction(GET_TAGS_WITH_PAGE.ACTION, ({ limit, page }) => ({ limit, page })) export const tagsUpdateCurrentPage = createAction(TAGS_UPDATE_CURRENT_PAGE.ACTION, currentPage => ({ currentPage })) export const createTag = createAction(CREATE_TAG.ACTION, ({ name, currentPage }) => ({ name, currentPage })) +export const transferToThirdParty = createAction(TRANSFER_TO_THIRDPARTY.ACTION, ({ uid }) => ({ uid })) diff --git a/src/client/actions/types.js b/src/client/actions/types.js index 22fbc079b..19fd0fbcc 100644 --- a/src/client/actions/types.js +++ b/src/client/actions/types.js @@ -45,6 +45,7 @@ export const DELETE_PRIORITY = defineAction('DELETE_PRIORITY', [SUCCESS, ERROR]) export const GET_TAGS_WITH_PAGE = defineAction('GET_TAGS_WITH_PAGE', [SUCCESS, ERROR]) export const TAGS_UPDATE_CURRENT_PAGE = defineAction('TAGS_UPDATE_CURRENT_PAGE', [SUCCESS, ERROR]) export const CREATE_TAG = defineAction('CREATE_TAG', [SUCCESS, ERROR]) +export const TRANSFER_TO_THIRDPARTY = defineAction('TRANSFER_TO_THIRDPARTY', [SUCCESS, ERROR]) // Accounts export const FETCH_ACCOUNTS = defineAction('FETCH_ACCOUNTS', [PENDING, SUCCESS, ERROR]) diff --git a/src/client/api/index.js b/src/client/api/index.js index a85a24889..4f4ed9d65 100644 --- a/src/client/api/index.js +++ b/src/client/api/index.js @@ -129,6 +129,12 @@ api.tickets.createTag = ({ name }) => { }) } +api.tickets.transferToThirdParty = ({ uid }) => { + return axios.post(`/api/v2/tickets/transfer/${uid}`).then(res => { + return res.data + }) +} + api.accounts = {} api.accounts.create = payload => { return axios.post('/api/v2/accounts', payload).then(res => { diff --git a/src/client/containers/Tickets/SingleTicketContainer.jsx b/src/client/containers/Tickets/SingleTicketContainer.jsx index 0a58347cb..1f34decc8 100644 --- a/src/client/containers/Tickets/SingleTicketContainer.jsx +++ b/src/client/containers/Tickets/SingleTicketContainer.jsx @@ -19,6 +19,7 @@ import { observer } from 'mobx-react' import sortBy from 'lodash/sortBy' import union from 'lodash/union' +import { transferToThirdParty } from 'actions/tickets' import { fetchGroups, unloadGroups } from 'actions/groups' import { showModal } from 'actions/common' @@ -202,6 +203,11 @@ class SingleTicketContainer extends React.Component { }) } + transferToThirdParty (e) { + socket.ui.sendUpdateTicketStatus(this.ticket._id, 3) + this.props.transferToThirdParty({ uid: this.ticket.uid }) + } + @computed get notesTagged () { this.ticket.notes.forEach(i => (i.isNote = true)) @@ -336,7 +342,10 @@ class SingleTicketContainer extends React.Component { type.priorities.findIndex(p => p._id === this.ticket.priority._id) !== -1 if (!hasPriority) { - socket.ui.setTicketPriority(this.ticket._id, type.priorities.find(() => true)) + socket.ui.setTicketPriority( + this.ticket._id, + type.priorities.find(() => true) + ) showPriorityConfirm() } @@ -493,6 +502,20 @@ class SingleTicketContainer extends React.Component { {/* Right Side */}
+ {this.props.common.hasThirdParty && ( +
+ { + e.preventDefault() + this.transferToThirdParty(e) + }} + > + Transfer to ThirdParty + +
+ )}
({ @@ -764,7 +788,6 @@ const mapStateToProps = state => ({ groupsState: state.groupsState }) -export default connect( - mapStateToProps, - { fetchGroups, unloadGroups, showModal } -)(SingleTicketContainer) +export default connect(mapStateToProps, { fetchGroups, unloadGroups, showModal, transferToThirdParty })( + SingleTicketContainer +) diff --git a/src/client/sagas/tickets/index.js b/src/client/sagas/tickets/index.js index cde5a5276..6ed1b16b6 100644 --- a/src/client/sagas/tickets/index.js +++ b/src/client/sagas/tickets/index.js @@ -32,7 +32,8 @@ import { UNLOAD_TICKETS, TICKET_UPDATED, DELETE_TICKET, - TICKET_EVENT + TICKET_EVENT, + TRANSFER_TO_THIRDPARTY } from 'actions/types' import helpers from 'lib/helpers' @@ -204,6 +205,22 @@ function * createTag ({ payload }) { } } +function * transferToThirdParty ({ payload }) { + try { + const response = yield call(api.tickets.transferToThirdParty, payload) + yield put({ type: TRANSFER_TO_THIRDPARTY.SUCCESS, response }) + helpers.UI.showSnackbar(`Ticket Transferred Successfully`, false) + } catch (error) { + const errorText = error.response ? error.response.data.error : error + if (error.response && error.response.status !== (401 || 403)) { + Log.error(errorText, error) + helpers.UI.showSnackbar(`Error: ${errorText}`, true) + } + + yield put({ type: TRANSFER_TO_THIRDPARTY.ERROR, error }) + } +} + export default function * watcher () { yield takeLatest(FETCH_TICKETS.ACTION, fetchTickets) yield takeLatest(CREATE_TICKET.ACTION, createTicket) @@ -218,4 +235,5 @@ export default function * watcher () { yield takeLatest(DELETE_PRIORITY.ACTION, deletePriority) yield takeLatest(GET_TAGS_WITH_PAGE.ACTION, getTagsWithPage) yield takeLatest(CREATE_TAG.ACTION, createTag) + yield takeLatest(TRANSFER_TO_THIRDPARTY.ACTION, transferToThirdParty) } diff --git a/src/controllers/api/v2/routes.js b/src/controllers/api/v2/routes.js index ddf793c28..8434c8f81 100644 --- a/src/controllers/api/v2/routes.js +++ b/src/controllers/api/v2/routes.js @@ -33,6 +33,7 @@ module.exports = function (middleware, router, controllers) { // Tickets router.get('/api/v2/tickets', apiv2Auth, apiv2.tickets.get) router.post('/api/v2/tickets', apiv2Auth, apiv2.tickets.create) + router.post('/api/v2/tickets/transfer/:uid', apiv2Auth, isAdmin, apiv2.tickets.transferToThirdParty) router.get('/api/v2/tickets/:uid', apiv2Auth, apiv2.tickets.single) router.put('/api/v2/tickets/batch', apiv2Auth, apiv2.tickets.batchUpdate) router.put('/api/v2/tickets/:uid', apiv2Auth, apiv2.tickets.update) diff --git a/src/controllers/api/v2/tickets.js b/src/controllers/api/v2/tickets.js index e26e82e24..d55727bdb 100644 --- a/src/controllers/api/v2/tickets.js +++ b/src/controllers/api/v2/tickets.js @@ -210,4 +210,37 @@ ticketsV2.permDelete = function (req, res) { }) } +ticketsV2.transferToThirdParty = function (req, res) { + var uid = req.params.uid + if (!uid) return apiUtils.sendApiError(res, 400, 'Invalid Parameters') + + Ticket.getTicketByUid(uid, function (err, ticket) { + if (err) return apiUtils.sendApiError(res, 400, err.message) + if (!ticket) return apiUtils.sendApiError(res, 404, 'Ticket not found') + + var request = require('axios') + var nconf = require('nconf') + var thirdParty = nconf.get('thirdParty') + var url = thirdParty.url + '/api/v2/tickets' + + var ticketObj = { + subject: ticket.subject, + description: ticket.issue, + email: ticket.owner.email, + status: 2, + priority: 2 + } + + request + .post(url, ticketObj, { auth: { username: thirdParty.apikey, password: '1' } }) + .then(function (response) { + return apiUtils.sendApiSuccess(res) + }) + .catch(function (err) { + console.log(err) + return apiUtils.sendApiError(res, err.response.status, err.response.data.message) + }) + }) +} + module.exports = ticketsV2 diff --git a/src/helpers/viewdata/index.js b/src/helpers/viewdata/index.js index 71b1b02b9..2d5a3b7c7 100644 --- a/src/helpers/viewdata/index.js +++ b/src/helpers/viewdata/index.js @@ -356,6 +356,16 @@ viewController.getData = function (request, cb) { return callback() }) }, + function (callback) { + var settingsUtil = require('../../settings/settingsUtil') + settingsUtil.getSettings(function (err, res) { + if (err) return callback(err) + + viewdata.hasThirdParty = res.data.settings.hasThirdParty + + return callback() + }) + }, function (callback) { viewController.getPluginsInfo(request, function (err, data) { if (err) return callback(err) diff --git a/src/settings/settingsUtil.js b/src/settings/settingsUtil.js index ffbcd67ce..b3a9549ec 100644 --- a/src/settings/settingsUtil.js +++ b/src/settings/settingsUtil.js @@ -14,6 +14,7 @@ var _ = require('lodash') var async = require('async') +var nconf = require('nconf') var jsStringEscape = require('js-string-escape') var settingSchema = require('../models/setting') var ticketTypeSchema = require('../models/tickettype') @@ -51,6 +52,7 @@ util.getSettings = function (callback) { } s.emailBeta = parseSetting(settings, 'beta:email', false) + s.hasThirdParty = !nconf.get('thirdParty') ? false : nconf.get('thirdParty').enable s.siteTitle = parseSetting(settings, 'gen:sitetitle', 'Trudesk') s.siteUrl = parseSetting(settings, 'gen:siteurl', '')