refactor ticket router

This commit is contained in:
jysperm
2014-09-12 10:15:13 +08:00
parent ace5967d6f
commit bf18734c14
9 changed files with 86 additions and 82 deletions

View File

@@ -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()

View File

@@ -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()

View File

@@ -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},

View File

@@ -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

View File

@@ -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

View File

@@ -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))

View File

@@ -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

View File

@@ -1,4 +1,4 @@
<%= content_html %>
<%= ticket.content_html %>
<br /><br />

View 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>