From 00c13dcc04bd3db2bcd390281e55d527eca57b72 Mon Sep 17 00:00:00 2001 From: jysperm Date: Sat, 16 Aug 2014 04:02:08 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E5=8D=95=E9=82=AE=E4=BB=B6=E9=80=9A?= =?UTF-8?q?=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.coffee | 9 ++++++++ core/model/account.coffee | 13 ++++++++++++ core/model/ticket.coffee | 16 ++++++++++++-- core/router/ticket.coffee | 28 ++++++++++++++++++------- core/static/script/ticket/create.coffee | 2 +- core/view/ticket/create.jade | 2 +- package.json | 3 ++- 7 files changed, 61 insertions(+), 12 deletions(-) diff --git a/config.coffee b/config.coffee index bd4365e..6fb2adc 100644 --- a/config.coffee +++ b/config.coffee @@ -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 diff --git a/core/model/account.coffee b/core/model/account.coffee index 6a112ec..e182362 100644 --- a/core/model/account.coffee +++ b/core/model/account.coffee @@ -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 diff --git a/core/model/ticket.coffee b/core/model/ticket.coffee index ba85e19..7d8b6ff 100644 --- a/core/model/ticket.coffee +++ b/core/model/ticket.coffee @@ -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 diff --git a/core/router/ticket.coffee b/core/router/ticket.coffee index ccabd46..d02836e 100644 --- a/core/router/ticket.coffee +++ b/core/router/ticket.coffee @@ -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

\n#{ticket._id}" 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

\n#{ticket._id}" + 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 -> diff --git a/core/static/script/ticket/create.coffee b/core/static/script/ticket/create.coffee index fa9b8d1..50f941b 100644 --- a/core/static/script/ticket/create.coffee +++ b/core/static/script/ticket/create.coffee @@ -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 diff --git a/core/view/ticket/create.jade b/core/view/ticket/create.jade index d1125d9..a495267 100644 --- a/core/view/ticket/create.jade +++ b/core/view/ticket/create.jade @@ -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') diff --git a/package.json b/package.json index facac86..3f61322 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "moment": "*", "request": "*", "mongo-min": "*", - "redis": "*" + "redis": "*", + "nodemailer": "~0.7.0" } }