From ccdc703e75c515cc4e80a59ea75a1ebc204336f8 Mon Sep 17 00:00:00 2001 From: jysperm Date: Sat, 15 Mar 2014 22:24:08 +0800 Subject: [PATCH] finish ticket/create, non-test --- DOC/API/ticket.md | 6 ++++ core/config.coffee | 5 ++++ core/model/Ticket.coffee | 22 +++++++++++++++ core/router/ticket.coffee | 59 +++++++++++++++++++++++++++++++++++++++ package.json | 5 +++- 5 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 core/router/ticket.coffee diff --git a/DOC/API/ticket.md b/DOC/API/ticket.md index 7d8d28f..2fea65b 100644 --- a/DOC/API/ticket.md +++ b/DOC/API/ticket.md @@ -21,6 +21,12 @@ Response: "id": "525284cc2cebb6d0008b4567" } +Exception: + +* invalid_title `/^.+$/` +* invalid_type +* invalid_account: username + ### POST /ticket/reply Request: diff --git a/core/config.coffee b/core/config.coffee index 7762653..48ceac5 100644 --- a/core/config.coffee +++ b/core/config.coffee @@ -9,6 +9,11 @@ module.exports = defaultLanguage: 'zh_CN' availableLanguage: ['zh_CN'] + ticket: + availableType: [ + 'linux', 'nodejs', 'php', 'python', 'rootpanel' + ] + db: type: 'mongo' server: 'localhost' diff --git a/core/model/Ticket.coffee b/core/model/Ticket.coffee index 9a12893..1d960da 100644 --- a/core/model/Ticket.coffee +++ b/core/model/Ticket.coffee @@ -1,5 +1,27 @@ +markdown = require('markdown').markdown + Model = require './Model' module.exports = class Ticket extends Model @create: (data) -> new Ticket data + + @createTicket: (account, title, content, type, members, attribute, callback) -> + membersID = [] + for member in members + membersID.push member.id() + + @insert + account_id: account.id() + created_at: new Date() + updated_at: new Date() + title: title + content: content + content_html: markdown.toHTML content + type: type + status: 'open' + members: membersID + attribute: attribute + replys: [] + , (ticket) -> + callback ticket diff --git a/core/router/ticket.coffee b/core/router/ticket.coffee new file mode 100644 index 0000000..d236b36 --- /dev/null +++ b/core/router/ticket.coffee @@ -0,0 +1,59 @@ +async = require 'async' +clone = require 'clone' + +config = require '../config' + +Account = require '../model/Account' +Ticket = require '../model/Ticket' + +module.exports = + get: {} + + post: + create: (req, res) -> + Account.authenticate req.token, (account) -> + unless account + return res.json 400, error: 'auth_failed' + + data = req.body + + unless /^.+$/.test data.title + return res.json 400, error: 'invalid_title' + + unless data.type in config.ticket.availableType + return res.json 400, error: 'invalid_type' + + createTicket = (members) -> + Ticket.createTicket account, title, content, type, members, {}, (ticket) -> + return res.json + id: ticket.id() + + if account.inGroup('root') + tasks = [] + + if data.members + for memberName in data.members + do (memberName = clone(memberName)) -> + tasks.push (callback) -> + Account.byUsernameOrEmail memberName, (member) -> + unless member + res.json 400, error: 'invalid_account', username: memberName + callback true + + callback null, member + + async.parallel tasks, (err, result) -> + if err + return + + unless _.find(result, (item) -> item.id() == account.id()) + result.push account + + createTicket result + + else + createTicket [account] + + reply: (req, res) -> + + update: (req, res) -> diff --git a/package.json b/package.json index 6670b04..f29df4b 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,12 @@ "dependencies": { "express": "*", "jade": "*", + "less": "*", "i18next": "*", "coffee-script": "*", "mongodb": "*", - "underscore": "*" + "underscore": "*", + "markdown": "*", + "clone": "*" } }