工单邮件通知

This commit is contained in:
jysperm
2014-08-16 04:02:08 +08:00
parent 4bd65a9d91
commit 00c13dcc04
7 changed files with 61 additions and 12 deletions

View File

@@ -47,6 +47,15 @@ module.exports =
redis_password: 'password'
email:
send_from: 'robot@rpvhost.net'
account:
service: 'Postmark'
auth:
user: 'postmark-api-token'
pass: 'postmark-api-token'
bitcoin:
coinbase_api_key: null

View File

@@ -1,4 +1,5 @@
crypto = require 'crypto'
nodemailer = require 'nodemailer'
config = require '../../config'
bitcoin = require '../bitcoin'
@@ -196,3 +197,15 @@ exports.calcResourcesLimit = (plans) ->
limit[k] += v
return limit
exports.sendEmail = (account, title, content) ->
mailer = nodemailer.createTransport 'SMTP', config.email.account
mail =
from: config.email.send_from
to: account.email
subject: title
html: content
mailer.sendMail mail, (err) ->
throw err if err

View File

@@ -1,5 +1,7 @@
markdown = require('markdown').markdown
mAccount = require './account'
module.exports = exports = app.db.buildModel 'tickets'
sample =
@@ -73,8 +75,18 @@ exports.addMember = (ticket, account, callback) ->
exports.update _id: ticket._id,
$push:
members: account._id
updated_at: new Date()
, callback
$set:
updated_at: new Date()
, (err) ->
throw err if err
callback()
exports.getMember = (ticket, account) ->
return _.find(ticket.members, (member) -> member.equals(account._id))
exports.sendMailToAdmins = (title, content) ->
mAccount.find
group: 'root'
.toArray (err, accounts) ->
for account in accounts
mAccount.sendEmail account, title, content

View File

@@ -55,10 +55,11 @@ exports.post '/create', requireAuthenticate, (req, res) ->
unless /^.+$/.test req.body.title
return res.error 'invalid_title'
createTicket = (members, status) ->
createTicket = (members, status, callback) ->
mTicket.createTicket req.account, req.body.title, req.body.content, members, status, {}, (err, ticket) ->
return res.json
res.json
id: ticket._id
callback ticket
if mAccount.inGroup req.account, 'root'
tasks = []
@@ -81,10 +82,11 @@ exports.post '/create', requireAuthenticate, (req, res) ->
unless _.find(result, (item) -> item._id == req.account._id)
result.push req.account
createTicket result, 'open'
createTicket result, 'open', ->
else
createTicket [req.account], 'pending'
createTicket [req.account], 'pending', (ticket) ->
mTicket.sendMailToAdmins "TK Create | #{req.account.username} | #{req.body.title}", "#{req.body.content}\n<br /><br />\n<a href='#{config.web.url}/ticket/view/?id=#{ticket._id}'>#{ticket._id}</a>"
exports.post '/reply', requireAuthenticate, (req, res) ->
mTicket.findId req.body.id, (errr, ticket) ->
@@ -96,9 +98,21 @@ exports.post '/reply', requireAuthenticate, (req, res) ->
return res.error 'forbidden'
status = if mAccount.inGroup(req.account, 'root') then 'open' else 'pending'
mTicket.createReply ticket, req.account, req.body.content, status, (err, reply) ->
return res.json
id: reply._id
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, "TK Reply | #{req.account.username} | #{ticket.title}", "#{req.body.content}\n<br /><br />\n<a href='#{config.web.url}/ticket/view/?id=#{ticket._id}'>#{ticket._id}</a>"
callback()
, ->
mTicket.createReply ticket, req.account, req.body.content, status, (err, reply) ->
return res.json
id: reply._id
exports.post '/list', requireAuthenticate, (req, res) ->
mTicket.find do ->

View File

@@ -3,7 +3,7 @@ $ ->
$.post '/ticket/create/', JSON.stringify
type: $('#type').val()
title: $('#title').val()
content: $('#content').val()
content: $(':input[name=content]').val()
.fail (jqXHR) ->
if jqXHR.responseJSON?.error
alert jqXHR.responseJSON.error

View File

@@ -10,7 +10,7 @@ block main
.form-group.padding
input#title.form-control(type='text', name='title', placeholder= t('ticket.title'),required)
.form-group.padding
textarea#content.form-control(name='content', rows='15', required)
textarea.form-control(name='content', rows='15', required)
.form-group.padding
button.btn.btn-lg.btn-primary.action-create(type='button')= t('ticket.create')

View File

@@ -47,6 +47,7 @@
"moment": "*",
"request": "*",
"mongo-min": "*",
"redis": "*"
"redis": "*",
"nodemailer": "~0.7.0"
}
}