mirror of
https://github.com/HackPlan/RootPanel.git
synced 2026-04-22 19:03:34 +08:00
refactor ticket router
This commit is contained in:
@@ -61,7 +61,7 @@ exports.run = ->
|
||||
|
||||
app.use (req, res, next) ->
|
||||
res.locals.app = app
|
||||
res.locals.t = i18n.getTranslator req.cookies.language
|
||||
res.locals.t = res.t = i18n.getTranslator req.cookies.language
|
||||
res.moment = moment().locale(req.cookies.language ? config.i18n.default_language).tz(req.cookies.timezone ? config.i18n.default_timezone)
|
||||
|
||||
next()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
mAccount = require './model/account'
|
||||
{mAccount} = app.models
|
||||
|
||||
exports.parseToken = (req, res, next) ->
|
||||
if req.headers['x-token']
|
||||
@@ -61,3 +61,11 @@ exports.requireInService = (service_name) ->
|
||||
return res.error 'not_in_service'
|
||||
|
||||
next()
|
||||
|
||||
exports.constructObjectID = (fields = ['id']) ->
|
||||
return (req, res, next) ->
|
||||
for field in fields
|
||||
if req.body[field]
|
||||
req.body[field] = new ObjectID req.body[field]
|
||||
|
||||
next()
|
||||
|
||||
@@ -13,7 +13,7 @@ sample =
|
||||
email: 'jysperm@gmail.com'
|
||||
created_at: Date()
|
||||
|
||||
group: ['root']
|
||||
groups: ['root']
|
||||
|
||||
settings:
|
||||
avatar_url: 'http://ruby-china.org/avatar/efcc15b92617a95a09f514a9bff9e6c3?s=58'
|
||||
@@ -124,9 +124,6 @@ exports.byUsernameOrEmailOrId = (username, callback) ->
|
||||
exports.matchPassword = (account, password) ->
|
||||
return exports.hashPassword(password, account.password_salt) == account.password
|
||||
|
||||
exports.inGroup = (account, group) ->
|
||||
return group in account.group
|
||||
|
||||
exports.joinPlan = (account, plan, callback) ->
|
||||
account.attribute.plans.push plan
|
||||
exports.update {_id: account._id},
|
||||
|
||||
@@ -17,4 +17,4 @@ exports.create = (account, type, amount, payload, callback) ->
|
||||
payload: payload
|
||||
created_at: new Date()
|
||||
, (err, result) ->
|
||||
callback err, _.first result
|
||||
callback _.first result
|
||||
|
||||
@@ -13,7 +13,7 @@ sample =
|
||||
ua: 'Mozilla/5.0 (Intel Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.102'
|
||||
|
||||
exports.create = (account, type, token, payload, callback) ->
|
||||
matched_token = _.first _.where account.tokens,
|
||||
matched_token = _.findWhere account.tokens,
|
||||
token: token
|
||||
|
||||
exports.insert
|
||||
@@ -22,5 +22,5 @@ exports.create = (account, type, token, payload, callback) ->
|
||||
token: token
|
||||
payload: payload
|
||||
created_at: new Date()
|
||||
, (err, rows) ->
|
||||
callback err, _.first rows
|
||||
, (err, result) ->
|
||||
callback _.first result
|
||||
|
||||
@@ -30,9 +30,6 @@ sample =
|
||||
]
|
||||
|
||||
exports.createTicket = (account, title, content, members, status, payload, callback) ->
|
||||
members_id = _.map (members) ->
|
||||
return member._id
|
||||
|
||||
exports.insert
|
||||
account_id: account._id
|
||||
created_at: new Date()
|
||||
@@ -41,14 +38,14 @@ exports.createTicket = (account, title, content, members, status, payload, callb
|
||||
content: content
|
||||
content_html: markdown.toHTML content
|
||||
status: status
|
||||
members: membersID
|
||||
members: _.pluck members, '_id'
|
||||
payload: payload
|
||||
replies: []
|
||||
, (err, result) ->
|
||||
callback err, _.first result
|
||||
callback _.first result
|
||||
|
||||
exports.createReply = (ticket, account, content, status, callback) ->
|
||||
data =
|
||||
reply =
|
||||
_id: new ObjectID()
|
||||
account_id: account._id
|
||||
created_at: new Date()
|
||||
@@ -58,26 +55,14 @@ exports.createReply = (ticket, account, content, status, callback) ->
|
||||
|
||||
exports.update {_id: ticket._id},
|
||||
$push:
|
||||
replies: data
|
||||
replies: reply
|
||||
$addToSet:
|
||||
members: account._id
|
||||
$set:
|
||||
status: status
|
||||
updated_at: new Date()
|
||||
, ->
|
||||
unless exports.getMember ticket, account
|
||||
exports.addMember ticket, account, ->
|
||||
callback null, data
|
||||
else
|
||||
callback null, data
|
||||
|
||||
exports.addMember = (ticket, account, callback) ->
|
||||
exports.update {_id: ticket._id},
|
||||
$push:
|
||||
members: account._id
|
||||
$set:
|
||||
updated_at: new Date()
|
||||
, (err) ->
|
||||
throw err if err
|
||||
callback()
|
||||
callback reply
|
||||
|
||||
exports.getMember = (ticket, account) ->
|
||||
return _.find(ticket.members, (member) -> member.equals(account._id))
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
markdown = require('markdown').markdown
|
||||
|
||||
{requireAuthenticate, renderAccount, getParam} = require './../middleware'
|
||||
|
||||
mAccount = require '../model/account'
|
||||
mTicket = require '../model/ticket'
|
||||
{requireAuthenticate, renderAccount, getParam, constructObjectID} = app.middleware
|
||||
{mAccount, mTicket} = app.models
|
||||
{config, notification} = app
|
||||
|
||||
module.exports = exports = express.Router()
|
||||
|
||||
@@ -24,8 +23,8 @@ exports.get '/list', requireAuthenticate, renderAccount, (req, res) ->
|
||||
exports.get '/create', requireAuthenticate, renderAccount, (req, res) ->
|
||||
res.render 'ticket/create'
|
||||
|
||||
exports.get '/view', requireAuthenticate, renderAccount, getParam, (req, res) ->
|
||||
mTicket.findId req.body.id, (err, ticket) ->
|
||||
exports.get '/view', requireAuthenticate, renderAccount, getParam, constructObjectID(), (req, res) ->
|
||||
mTicket.findOne _id: req.body.id, (err, ticket) ->
|
||||
unless ticket
|
||||
return res.send 404
|
||||
|
||||
@@ -33,22 +32,21 @@ exports.get '/view', requireAuthenticate, renderAccount, getParam, (req, res) ->
|
||||
unless mTicket.getMember ticket, req.account
|
||||
return res.send 403
|
||||
|
||||
async.map ticket.members, (member, callback) ->
|
||||
mAccount.findId member, (err, member_account) ->
|
||||
callback null, member_account
|
||||
async.map ticket.members, (member_id, callback) ->
|
||||
mAccount.findOne _id: member_id, callback
|
||||
, (err, result) ->
|
||||
ticket.members = result
|
||||
|
||||
async.map ticket.replys, (reply, callback) ->
|
||||
mAccount.findId reply.account_id, (err, reply_account) ->
|
||||
reply.account = reply_account
|
||||
async.map ticket.replies, (reply, callback) ->
|
||||
mAccount.findOne _id: reply.account_id, (err, account) ->
|
||||
reply.account = account
|
||||
callback null, reply
|
||||
|
||||
, (err, result) ->
|
||||
ticket.replys = result
|
||||
ticket.replies = result
|
||||
|
||||
mAccount.findId ticket.account_id, (err, ticket_account) ->
|
||||
ticket.account = ticket_account
|
||||
mAccount.findOne _id: ticket.account_id, (err, account) ->
|
||||
ticket.account = account
|
||||
|
||||
res.render 'ticket/view',
|
||||
ticket: ticket
|
||||
@@ -57,62 +55,72 @@ exports.post '/create', requireAuthenticate, (req, res) ->
|
||||
unless /^.+$/.test req.body.title
|
||||
return res.error 'invalid_title'
|
||||
|
||||
is_admin = 'root' in req.account.groups
|
||||
|
||||
createTicket = (members, status, callback) ->
|
||||
mTicket.createTicket req.account, req.body.title, req.body.content, members, status, {}, (err, ticket) ->
|
||||
res.json
|
||||
id: ticket._id
|
||||
callback ticket
|
||||
|
||||
if mAccount.inGroup req.account, 'root'
|
||||
tasks = []
|
||||
if is_admin
|
||||
req.body.members ?= []
|
||||
|
||||
if req.body.members
|
||||
for memberName in req.body.members
|
||||
do (memberName = _.clone(memberName)) ->
|
||||
tasks.push (callback) ->
|
||||
mAccount.byUsernameOrEmailOrId memberName, (err, member) ->
|
||||
unless member
|
||||
res.error 'invalid_account', username: memberName
|
||||
callback true
|
||||
|
||||
callback null, member
|
||||
|
||||
async.parallel tasks, (err, result) ->
|
||||
async.each req.body.members, (member_name, callback) ->
|
||||
mAccount.byUsernameOrEmailOrId member_name, (err, member) ->
|
||||
if member
|
||||
callback null, member
|
||||
else
|
||||
callback member_name
|
||||
, (err, result) ->
|
||||
if err
|
||||
return
|
||||
return res.error 'invalid_account', username: err
|
||||
else
|
||||
unless _.find(result, (item) -> item._id == req.account._id)
|
||||
result.push req.account
|
||||
|
||||
unless _.find(result, (item) -> item._id == req.account._id)
|
||||
result.push req.account
|
||||
|
||||
createTicket result, 'open', ->
|
||||
createTicket result, 'open'
|
||||
|
||||
else
|
||||
createTicket [req.account], 'pending', (ticket) ->
|
||||
mTicket.sendMailToAdmins "Ticket | #{req.body.title}", "#{ticket.content_html}\n<br /><br />\n#{req.account.username} <a href='#{config.web.url}/ticket/view/?id=#{ticket._id}'>#{ticket._id}</a>"
|
||||
notification.createGroupNotice 'root', 'ticket_create',
|
||||
title: _.template res.t('notification.ticket_create.title'), ticket
|
||||
body: _.template fs.readSync('./../template/ticket_create_email.html'),
|
||||
ticket: ticket
|
||||
account: req.account
|
||||
config: config
|
||||
, ->
|
||||
|
||||
exports.post '/reply', requireAuthenticate, (req, res) ->
|
||||
mTicket.findId req.body.id, (errr, ticket) ->
|
||||
exports.post '/reply', requireAuthenticate, constructObjectID(), (req, res) ->
|
||||
mTicket.findOne _id: req.body.id, (err, ticket) ->
|
||||
unless ticket
|
||||
return res.error 'ticket_not_exist'
|
||||
|
||||
unless mTicket.getMember ticket, req.account
|
||||
unless mAccount.inGroup req.account, 'root'
|
||||
unless 'root' in req.account.groups
|
||||
return res.error 'forbidden'
|
||||
|
||||
status = if mAccount.inGroup(req.account, 'root') then 'open' else 'pending'
|
||||
status = if 'root' in req.account.groups then 'open' else 'pending'
|
||||
|
||||
async.each ticket.members, (member_id, callback) ->
|
||||
if member_id.toString() == req.account._id.toString()
|
||||
return callback()
|
||||
mTicket.createReply ticket, req.account, req.body.content, status, (err, reply) ->
|
||||
async.each ticket.members, (member_id, callback) ->
|
||||
if member_id.toString() == req.account._id.toString()
|
||||
return callback()
|
||||
|
||||
mAccount.findOne
|
||||
_id: member_id
|
||||
, (err, account) ->
|
||||
mAccount.sendEmail account, "Ticket | #{ticket.title}", "#{markdown.toHTML(req.body.content)}\n<br /><br />\n#{req.account.username} <a href='#{config.web.url}/ticket/view/?id=#{ticket._id}'>#{ticket._id}</a>"
|
||||
callback()
|
||||
mAccount.findOne
|
||||
_id: member_id
|
||||
, (err, account) ->
|
||||
notification.createNotice account, 'ticket_reply',
|
||||
title: _.template res.t('notification.ticket_create.title'), ticket
|
||||
body: _.template fs.readSync('./../template/ticket_create_email.html'),
|
||||
ticket: ticket
|
||||
reply: reply
|
||||
account: req.account
|
||||
config: config
|
||||
, ->
|
||||
callback()
|
||||
|
||||
, ->
|
||||
mTicket.createReply ticket, req.account, req.body.content, status, (err, reply) ->
|
||||
, ->
|
||||
return res.json
|
||||
id: reply._id
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<%= content_html %>
|
||||
<%= ticket.content_html %>
|
||||
|
||||
<br /><br />
|
||||
|
||||
|
||||
6
core/template/ticket_reply_email.html
Normal file
6
core/template/ticket_reply_email.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<%= reply.content_html %>
|
||||
|
||||
<br /><br />
|
||||
|
||||
<%= account.username %>
|
||||
<a href='<%= config.web.url %>/ticket/view/?id=<%= ticket._id %>'><%= ticket._id %></a>
|
||||
Reference in New Issue
Block a user