160 lines
5.2 KiB
JavaScript
160 lines
5.2 KiB
JavaScript
const { body, validationResult } = require('express-validator')
|
|
const TicketConversation = require('../models/TicketConversation')
|
|
const User = require('../models/User')
|
|
const { notifyUser } = require('../WebSocket/controllers/user_EventsController')
|
|
const { notifyAdmin } = require('../WebSocket/controllers/admin_EventsController')
|
|
const { res404, res500, checkValidations } = require('../plugins/controllersHelperFunctions')
|
|
const { _sr } = require('../plugins/serverResponses')
|
|
const _faSr = _sr.fa
|
|
|
|
// env variables
|
|
const maxAttachmentSize = 2048
|
|
const userIdPopulation = 'first_name last_name verity_businessCode panatech_businessCode'
|
|
|
|
/// ////////// user
|
|
module.exports.add_ticket = [
|
|
[
|
|
body('title').notEmpty().withMessage(_faSr.required.title),
|
|
body('user_id').notEmpty().withMessage('کد مشتری را وارد کنید')
|
|
],
|
|
checkValidations(validationResult),
|
|
(req, res) => {
|
|
const { title, transaction_id, user_id } = req.body
|
|
|
|
const data = { title, transaction_id, user_id }
|
|
|
|
const ticketConversation = new TicketConversation(data)
|
|
ticketConversation.save((err, data) => {
|
|
if (err) console.log(err)
|
|
return res.json(data)
|
|
})
|
|
}
|
|
]
|
|
|
|
module.exports.add_message_to_ticket = [
|
|
[
|
|
body('message')
|
|
.if((value, { req }) => !req.files)
|
|
.notEmpty()
|
|
.withMessage(_faSr.required.message)
|
|
],
|
|
checkValidations(validationResult),
|
|
async (req, res) => {
|
|
const { message } = req.body
|
|
const { user_id } = req
|
|
|
|
const data = { message, user_id, isUser: true }
|
|
|
|
try {
|
|
// check user scope
|
|
const user = await User.findById(user_id)
|
|
if (user.scope.includes('admin')) data.isUser = false
|
|
|
|
// save files
|
|
if (req.files?.image) {
|
|
const image = req.files.image
|
|
const fileName = 'TicketAttachment_' + Date.now() + '.' + image.mimetype.split('/')[1]
|
|
const acceptableFormats = ['png', 'jpg', 'jpeg', 'webp']
|
|
if (!acceptableFormats.includes(image.mimetype.split('/')[1]))
|
|
return res.status(422).json({ validation: { image: { msg: _faSr.format.image } } })
|
|
if (image.size / 1024 > maxAttachmentSize)
|
|
return res
|
|
.status(422)
|
|
.json({ validation: { image: { msg: `حجم تصویر نباید بیشتر از ${maxAttachmentSize} KB باشد.` } } })
|
|
data.image = fileName
|
|
await image.mv(`./static/uploads/images/tickets/${fileName}`)
|
|
}
|
|
|
|
// find conversation and update messages
|
|
const conversation = await TicketConversation.findById(req.params.id)
|
|
.populate('user_id', userIdPopulation)
|
|
.populate('messages.user_id', userIdPopulation)
|
|
conversation.messages.push(data)
|
|
await conversation.save()
|
|
if (data.isUser) {
|
|
notifyAdmin('newTicketMsg')
|
|
notifyAdmin('updateUnreadTickets')
|
|
} else {
|
|
notifyUser('updateUnreadTickets', conversation.user_id._id)
|
|
notifyUser('newTicketMsg', conversation.user_id._id)
|
|
}
|
|
return res.json(conversation)
|
|
} catch (e) {
|
|
return res404(res, e)
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.get_all_tickets = [
|
|
(req, res) => {
|
|
const { user_id } = req
|
|
TicketConversation.find({ user_id }, (err, conversations) => {
|
|
if (err) return res500(res, err)
|
|
else return res.json(conversations)
|
|
})
|
|
}
|
|
]
|
|
|
|
module.exports.get_one_ticket = [
|
|
(req, res) => {
|
|
TicketConversation.findById(req.params.id)
|
|
.populate('user_id', userIdPopulation)
|
|
.populate('messages.user_id', userIdPopulation)
|
|
.exec((err, data) => {
|
|
if (err) return res404(res, err)
|
|
// after sending messages to user set read status to true
|
|
const messages = data.messages
|
|
setTimeout(async () => {
|
|
try {
|
|
const user = await User.findById(req.user_id)
|
|
if (messages.length) {
|
|
let userNeedsNotify = false
|
|
let adminNeedsNotify = false
|
|
messages.forEach((item, index) => {
|
|
if (item.isUser && user.scope.includes('admin') && !item.read) {
|
|
// console.log(index, ' these are user messages')
|
|
adminNeedsNotify = true
|
|
item.read = true
|
|
}
|
|
|
|
if (!item.isUser && !user.scope.includes('admin') && !item.read) {
|
|
// console.log(index, ' these are admin messages')
|
|
userNeedsNotify = true
|
|
item.read = true
|
|
}
|
|
|
|
if (index === messages.length - 1) {
|
|
data.save(err => {
|
|
if (err) console.log(err)
|
|
|
|
if (userNeedsNotify) notifyUser('updateUnreadTickets', data.user_id._id)
|
|
|
|
if (adminNeedsNotify) notifyAdmin('updateUnreadTickets')
|
|
})
|
|
}
|
|
})
|
|
}
|
|
} catch (e) {
|
|
return res500(res, e)
|
|
}
|
|
}, 500)
|
|
return res.json(data)
|
|
})
|
|
}
|
|
]
|
|
|
|
/// ///////// admin
|
|
|
|
module.exports.get_all_tickets_for_admin = [
|
|
(req, res) => {
|
|
TicketConversation.find()
|
|
.sort({created_at: -1})
|
|
.limit(400)
|
|
.populate('user_id', userIdPopulation)
|
|
.exec((err, data) => {
|
|
if (err) return res500(res, err)
|
|
return res.json(data)
|
|
})
|
|
}
|
|
]
|