diff --git a/DOC/API/ticket.md b/DOC/API/ticket.md index 90cf88c..13010a0 100644 --- a/DOC/API/ticket.md +++ b/DOC/API/ticket.md @@ -63,10 +63,12 @@ Request: "public": true }, "members": { - // add a user - "525284cc2cebb6d0008b4567": true, - // remove a user - "4cc2cebb6d5254567280008b": false + "add": [ + "525284cc2cebb6d0008b4567" + ], + "remove": [ + "4cc2cebb6d5254567280008b" + ] } } diff --git a/DOC/DEV/Feature/Account.md b/DOC/DEV/Feature/Account.md index 9b6f5c4..91b9fd2 100644 --- a/DOC/DEV/Feature/Account.md +++ b/DOC/DEV/Feature/Account.md @@ -1,5 +1,7 @@ ## 用户系统 +在 API 中,所有需要指明一个用户的参数,都可以使用「用户名」,「邮件地址」,「ID」任意之一。 + ### 用户组 * root - 全站最高管理员 diff --git a/core/api/account.coffee b/core/api/account.coffee index 97e06a3..a49da4f 100644 --- a/core/api/account.coffee +++ b/core/api/account.coffee @@ -13,7 +13,7 @@ module.exports = post: signup: (req, res) -> - unless /^[0-9a-z_]+$/.test req.body.username + unless /^[0-9a-z_]{3,23}$/.test req.body.username return res.json 400, error: 'invalid_username' unless /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test req.body.email @@ -39,7 +39,7 @@ module.exports = id: account._id login: (req, res) -> - mAccount.byUsernameOrEmail req.body.username, (account) -> + mAccount.byUsernameOrEmailOrId req.body.username, (account) -> unless account return res.json 400, error: 'auth_failed' diff --git a/core/api/ticket.coffee b/core/api/ticket.coffee index a3aad01..4825ff6 100644 --- a/core/api/ticket.coffee +++ b/core/api/ticket.coffee @@ -71,7 +71,7 @@ module.exports = for memberName in req.body.members do (memberName = _.clone(memberName)) -> tasks.push (callback) -> - mAccount.byUsernameOrEmail memberName, (member) -> + mAccount.byUsernameOrEmailOrId memberName, (member) -> unless member res.json 400, error: 'invalid_account', username: memberName callback true @@ -170,6 +170,37 @@ module.exports = else return res.json 400, error: 'invalid_status' + saveToDatabase = -> + async.parallel [ + (callback) -> + unless _.isEmpty modifier + mTicket.update _id: ticket._id, + $set: modifier + , {}, callback + else + callback() + + (callback) -> + unless _.isEmpty addToSetModifier + mTicket.update _id: ticket._id, + $addToSet: + members: + $each: addToSetModifier + , {}, callback + else + callback() + + (callback) -> + unless _.isEmpty pullModifier + mTicket.update _id: ticket._id, + $pullAll: + members: pullModifier + , {}, callback + else + callback() + ], -> + return res.json {} + if mAccount.inGroup account, 'root' if req.body.attribute if req.body.attribute.public @@ -178,42 +209,27 @@ module.exports = modifier['attribute.public'] = false if req.body.members - for member_id, op of req.body.members - member_id = db.ObjectID member_id + tasks = {} - if mTicket.getMember ticket, {_id: member_id} - unless op - pullModifier.push member_id - else - if op - addToSetModifier.push member_id + member_name = _.filter _.union(req.body.members.add, req.body.members.remove), (item) -> item + for item in member_name + tasks[item] = do (item = _.clone(item)) -> + return (callback) -> + mAccount.byUsernameOrEmailOrId item, (result) -> + callback null, result - async.parallel [ - (callback) -> - unless _.isEmpty modifier - mTicket.update _id: ticket._id, - $set: modifier - , {}, callback - else - callback() + async.parallel tasks, (err, result) -> + console.log result - (callback) -> - unless _.isEmpty addToSetModifier - mTicket.update _id: ticket._id, - $addToSet: - members: - $each: addToSetModifier - , {}, callback - else - callback() + if req.body.members.add + for item in req.body.members.add + addToSetModifier.push result[item]._id - (callback) -> - unless _.isEmpty pullModifier - mTicket.update _id: ticket._id, - $pullAll: - members: pullModifier - , {}, callback - else - callback() - ], -> - return res.json {} + if req.body.members.remove + for item in req.body.members.remove + pullModifier.push result[item]._id + + saveToDatabase() + + else + saveToDatabase() diff --git a/core/model/account.coffee b/core/model/account.coffee index cdb0d9a..f59a1d8 100644 --- a/core/model/account.coffee +++ b/core/model/account.coffee @@ -79,12 +79,16 @@ exports.authenticate = (token, callback) -> 'tokens.token': token , {}, callback -exports.byUsernameOrEmail = (username, callback) -> +exports.byUsernameOrEmailOrId = (username, callback) -> exports.byUsername username, (account) -> if account return callback account - exports.byEmail username, callback + exports.byEmail username, (account) -> + if account + return callback account + + exports.findId username, callback # @return bool exports.matchPasswd = (account, passwd) ->