From 17315ea569684fffb88dee5effe3bc0e7bc71fb7 Mon Sep 17 00:00:00 2001 From: OldHawk Date: Mon, 26 Jun 2017 15:08:26 +0800 Subject: [PATCH] feat(Messages): merge adminMessages into user messages list --- .../controllers/header.client.controller.js | 2 +- .../controllers/messages.client.controller.js | 68 ++++++++---- modules/messages/client/less/message.less | 7 ++ .../client/views/box.client.view.html | 36 ++++--- .../admin-messages.server.controller.js | 44 ++++++++ .../controllers/messages.server.controller.js | 101 +++++++++++++----- .../models/admin-message.server.model.js | 4 + .../policies/admin-messages.server.policy.js | 9 +- .../routes/admin-messages.server.routes.js | 5 + 9 files changed, 211 insertions(+), 65 deletions(-) diff --git a/modules/core/client/controllers/header.client.controller.js b/modules/core/client/controllers/header.client.controller.js index ab99953b..d60cb489 100644 --- a/modules/core/client/controllers/header.client.controller.js +++ b/modules/core/client/controllers/header.client.controller.js @@ -74,7 +74,7 @@ vm.getCountUnread = function () { if (Authentication.user) { MessagesService.countUnread(function (data) { - vm.unreadCount = data.countFrom + data.countTo; + vm.unreadCount = data.countFrom + data.countTo + data.countAdmin; }); } }; diff --git a/modules/messages/client/controllers/messages.client.controller.js b/modules/messages/client/controllers/messages.client.controller.js index 4800bb1e..0dd2ecd0 100644 --- a/modules/messages/client/controllers/messages.client.controller.js +++ b/modules/messages/client/controllers/messages.client.controller.js @@ -6,10 +6,10 @@ .controller('MessageController', MessageController); MessageController.$inject = ['$scope', '$state', '$translate', '$timeout', 'Authentication', '$filter', 'NotifycationService', '$stateParams', 'MessagesService', - 'MeanTorrentConfig', 'ModalConfirmService', 'marked', '$rootScope']; + 'MeanTorrentConfig', 'ModalConfirmService', 'marked', '$rootScope', 'AdminMessagesService']; function MessageController($scope, $state, $translate, $timeout, Authentication, $filter, NotifycationService, $stateParams, MessagesService, - MeanTorrentConfig, ModalConfirmService, marked, $rootScope) { + MeanTorrentConfig, ModalConfirmService, marked, $rootScope, AdminMessagesService) { var vm = this; vm.messageConfig = MeanTorrentConfig.meanTorrentConfig.messages; vm.user = Authentication.user; @@ -17,7 +17,6 @@ vm.deleteList = []; $(document).on('keydown', function (e) { - console.log(e.keyCode); if (e.keyCode === 27) { // ESC vm.hideMessage(); } @@ -113,6 +112,7 @@ vm.filteredItems = $filter('filter')(vm.messages, { $: vm.search }); + vm.filteredItems = $filter('orderBy')(vm.filteredItems, ['-updatedat']); vm.filterLength = vm.filteredItems.length; var begin = ((vm.currentPage - 1) * vm.itemsPerPage); var end = begin + vm.itemsPerPage; @@ -199,7 +199,9 @@ } $timeout(function () { vm.selectedMessage = msg; - vm.updateReadStatus(msg); + if(vm.isUnread(msg)) { + vm.updateReadStatus(msg); + } }, 300); }; @@ -208,18 +210,33 @@ * @param m */ vm.updateReadStatus = function (m) { - var msg = new MessagesService({ - _messageId: m._id - }); + var msg; + if (m.type === 'user') { + msg = new MessagesService({ + _messageId: m._id + }); - if (fromIsMe(m)) { - msg.from_status = 1; - } - if (toIsMe(m)) { - msg.to_status = 1; + if (fromIsMe(m)) { + msg.from_status = 1; + } + if (toIsMe(m)) { + msg.to_status = 1; + } + + msg.$update(function (res) { + updateEnd(res); + }); + } else { //system message + msg = new AdminMessagesService({ + _adminMessageId: m._id + }); + + msg.$update(function (res) { + updateEnd(res); + }); } - msg.$update(function (res) { + function updateEnd(res) { vm.selectedMessage = res; vm.messages.splice(vm.messages.indexOf(m), 0, res); @@ -227,7 +244,7 @@ vm.figureOutItemsToDisplay(); $rootScope.$broadcast('user-unread-count-changed'); - }); + } }; /** @@ -235,7 +252,8 @@ */ vm.getCountUnread = function () { MessagesService.countUnread(function (data) { - vm.unreadCount = data.countFrom + data.countTo; + console.log(data); + vm.unreadCount = data.countFrom + data.countTo + data.countAdmin; }); }; @@ -252,24 +270,30 @@ }; /** - * getMessageClass + * isUnread * @param m * @returns {*} */ - vm.getMessageClass = function (m) { + vm.isUnread = function (m) { if (m) { if (m.from_user._id === vm.user._id) { if (m.from_status === 0) { - return 'unread'; + return true; } } - if (m.to_user._id === vm.user._id) { - if (m.to_status === 0) { - return 'unread'; + if (m.type === 'user') { + if (m.to_user._id === vm.user._id) { + if (m.to_status === 0) { + return true; + } + } + } else { //not user message + if (m._readers.indexOf(vm.user._id) < 0) { + return true; } } } - return 'read'; + return false; }; /** diff --git a/modules/messages/client/less/message.less b/modules/messages/client/less/message.less index b1a7eb07..b378e581 100644 --- a/modules/messages/client/less/message.less +++ b/modules/messages/client/less/message.less @@ -36,6 +36,10 @@ height: 38px; width: 38px; } + .admin-message-avatar { + color: #999; + font-size: 40px; + } .reply-avatar { float: left; margin-right: 10px; @@ -116,6 +120,9 @@ left: 0; bottom: 0; padding: 8px 10px; + &.not-user-message{ + height: 50px !important; + } } .message-popup { diff --git a/modules/messages/client/views/box.client.view.html b/modules/messages/client/views/box.client.view.html index 7b8b03d3..15941cad 100644 --- a/modules/messages/client/views/box.client.view.html +++ b/modules/messages/client/views/box.client.view.html @@ -46,12 +46,18 @@ - - + + -

+ + +

{{m.from_user.displayName}} {{'MESSAGES_FIELD.INFO_SEND_TO' | translate}} {{m.to_user.displayName}} {{'MESSAGES_FIELD.INFO_SEND_AT' | translate}} {{m.createdat | date: 'yyyy-MM-dd HH:mm:ss' }} - , {{'MESSAGES_FIELD.LAST_REPLY_AT' | translate}} {{m.updatedat | date: 'yyyy-MM-dd HH:mm:ss' }} + , {{'MESSAGES_FIELD.LAST_REPLY_AT' | translate}} {{m.updatedat | date: 'yyyy-MM-dd HH:mm:ss' }} +

+ +

+ {{m.from_user.displayName}} {{'MESSAGES_FIELD.INFO_SEND_AT' | translate}} {{m.createdat | date: 'yyyy-MM-dd HH:mm:ss' }}

@@ -65,7 +71,7 @@ + id="checkbox_{{m._id}}" ng-show="m.type=='user'"> @@ -95,17 +101,21 @@
-

+

{{vm.selectedMessage.from_user.displayName}} {{'MESSAGES_FIELD.INFO_SEND_TO' | translate}} {{vm.selectedMessage.to_user.displayName}} {{'MESSAGES_FIELD.INFO_SEND_AT' | translate}} {{vm.selectedMessage.createdat | date: 'yyyy-MM-dd HH:mm:ss' }}

+ +

+ {{vm.selectedMessage.from_user.displayName}} {{'MESSAGES_FIELD.INFO_SEND_AT' | translate}} {{vm.selectedMessage.createdat | date: 'yyyy-MM-dd HH:mm:ss' }} +

  • -
    -
  • +
    +
  • @@ -121,13 +131,15 @@
    -
    +
    + ng-model="vm.replyContent" ng-if="vm.selectedMessage.type=='user'" autofocus> - +
    diff --git a/modules/messages/server/controllers/admin-messages.server.controller.js b/modules/messages/server/controllers/admin-messages.server.controller.js index a13193cb..2155e02c 100644 --- a/modules/messages/server/controllers/admin-messages.server.controller.js +++ b/modules/messages/server/controllers/admin-messages.server.controller.js @@ -73,3 +73,47 @@ exports.delete = function (req, res) { } }; +/** + * setReaded + */ +exports.setReaded = function (req, res) { + var adminMessage = req.adminMessage; + + adminMessage._readers.push(req.user._id); + adminMessage.save(function (err) { + if (err) { + return res.status(422).send({ + message: errorHandler.getErrorMessage(err) + }); + } else { + res.json(adminMessage); + } + }); +}; + +/** + * Invitation middleware + */ +exports.adminMessageByID = function (req, res, next, id) { + + if (!mongoose.Types.ObjectId.isValid(id)) { + return res.status(400).send({ + message: 'Message is invalid' + }); + } + + AdminMessage.findById(id) + .populate('from_user', 'displayName profileImageURL uploaded downloaded') + .exec(function (err, message) { + if (err) { + return next(err); + } else if (!message) { + return res.status(404).send({ + message: 'No message with that identifier has been found' + }); + } + req.adminMessage = message; + next(); + }); +}; + diff --git a/modules/messages/server/controllers/messages.server.controller.js b/modules/messages/server/controllers/messages.server.controller.js index 0542b967..234709a0 100644 --- a/modules/messages/server/controllers/messages.server.controller.js +++ b/modules/messages/server/controllers/messages.server.controller.js @@ -9,6 +9,7 @@ var path = require('path'), errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller')), User = mongoose.model('User'), Message = mongoose.model('Message'), + AdminMessage = mongoose.model('AdminMessage'), async = require('async'); /** @@ -45,33 +46,57 @@ exports.create = function (req, res) { * @param res */ exports.list = function (req, res) { - Message.find({ - $or: [ - {from_user: req.user._id}, - {to_user: req.user._id} - ] - }) - .sort('-updatedat -createdat') - .populate('from_user', 'displayName profileImageURL uploaded downloaded') - .populate('to_user', 'displayName profileImageURL uploaded downloaded') - .populate({ - path: '_replies.from_user', - select: 'displayName profileImageURL uploaded downloaded', - model: 'User' + var findMessage = function (callback) { + Message.find({ + $or: [ + {from_user: req.user._id}, + {to_user: req.user._id} + ] }) - .populate({ - path: '_replies.to_user', - select: 'displayName profileImageURL uploaded downloaded', - model: 'User' + .sort('-updatedat -createdat') + .populate('from_user', 'displayName profileImageURL uploaded downloaded') + .populate('to_user', 'displayName profileImageURL uploaded downloaded') + .populate({ + path: '_replies.from_user', + select: 'displayName profileImageURL uploaded downloaded', + model: 'User' + }) + .populate({ + path: '_replies.to_user', + select: 'displayName profileImageURL uploaded downloaded', + model: 'User' + }) + .exec(function (err, messages) { + if (err) { + callback(err, null); + } else { + callback(null, messages); + } + }); + }; + + var findAdminMessage = function (callback) { + AdminMessage.find({ + createdat: {$gt: req.user.created} }) - .exec(function (err, messages) { - if (err) { - return res.status(422).send({ - message: errorHandler.getErrorMessage(err) - }); - } - res.json(messages); - }); + .sort('-createdat') + .populate('from_user', 'displayName profileImageURL uploaded downloaded') + .exec(function (err, messages) { + if (err) { + callback(err, null); + } else { + callback(null, messages); + } + }); + }; + + async.parallel([findMessage, findAdminMessage], function (err, results) { + if (err) { + return res.status(422).send(err); + } else { + res.json(results[0].concat(results[1])); + } + }); }; /** @@ -117,8 +142,12 @@ exports.delete = function (req, res) { exports.update = function (req, res) { var message = req.message; - message.from_status = req.body.from_status; - message.to_status = req.body.to_status; + if (req.body.from_status) { + message.from_status = req.body.from_status; + } + if (req.body.to_status) { + message.to_status = req.body.to_status; + } message.save(function (err) { if (err) { @@ -201,14 +230,28 @@ exports.countUnread = function (req, res) { } }); }; + var countAdminMessage = function (callback) { + AdminMessage.count({ + createdat: {$gt: req.user.created}, + _readers: {$not: {$in: [req.user._id]}} - async.parallel([countFrom, countTo], function (err, results) { + }, function (err, count) { + if (err) { + callback(err, null); + } else { + callback(null, count); + } + }); + }; + + async.parallel([countFrom, countTo, countAdminMessage], function (err, results) { if (err) { return res.status(422).send(err); } else { res.json({ countFrom: results[0], - countTo: results[1] + countTo: results[1], + countAdmin: results[2] }); } }); diff --git a/modules/messages/server/models/admin-message.server.model.js b/modules/messages/server/models/admin-message.server.model.js index 251ceb00..94765793 100644 --- a/modules/messages/server/models/admin-message.server.model.js +++ b/modules/messages/server/models/admin-message.server.model.js @@ -32,6 +32,10 @@ var AdminMessageSchema = new Schema({ type: Schema.Types.ObjectId, ref: 'User' }], + updatedat: { + type: Date, + default: Date.now + }, createdat: { type: Date, default: Date.now diff --git a/modules/messages/server/policies/admin-messages.server.policy.js b/modules/messages/server/policies/admin-messages.server.policy.js index a5de25a2..f01394c9 100644 --- a/modules/messages/server/policies/admin-messages.server.policy.js +++ b/modules/messages/server/policies/admin-messages.server.policy.js @@ -17,7 +17,14 @@ exports.invokeRolesPolicies = function () { { roles: ['admin', 'oper'], allows: [ - {resources: '/api/adminMessages', permissions: '*'} + {resources: '/api/adminMessages', permissions: '*'}, + {resources: '/api/adminMessages/:adminMessageId', permissions: '*'} + ] + }, + { + roles: ['user'], + allows: [ + {resources: '/api/adminMessages/:adminMessageId', permissions: ['put']} ] } ] diff --git a/modules/messages/server/routes/admin-messages.server.routes.js b/modules/messages/server/routes/admin-messages.server.routes.js index c0302577..7b254d6b 100644 --- a/modules/messages/server/routes/admin-messages.server.routes.js +++ b/modules/messages/server/routes/admin-messages.server.routes.js @@ -11,4 +11,9 @@ module.exports = function (app) { .get(adminMessages.list) .post(adminMessages.create) .delete(adminMessages.delete); + + app.route('/api/adminMessages/:adminMessageId').all(adminMessagesPolicy.isAllowed) + .put(adminMessages.setReaded); + + app.param('adminMessageId', adminMessages.adminMessageByID); };