feat(Messages): merge adminMessages into user messages list

This commit is contained in:
OldHawk
2017-06-26 15:08:26 +08:00
parent e664086d65
commit 17315ea569
9 changed files with 211 additions and 65 deletions

View File

@@ -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;
});
}
};

View File

@@ -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;
};
/**

View File

@@ -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 {

View File

@@ -46,12 +46,18 @@
<tbody>
<tr class="message-item" ng-repeat="m in vm.pagedItems" ng-click="vm.showMessage(m);">
<td>
<img class="message-avatar" ng-src="/{{m.from_user.profileImageURL}}">
<span class="message-title" ng-class="vm.getMessageClass(m);" ng-bind="m.title"></span>
<img class="message-avatar" ng-src="/{{m.from_user.profileImageURL}}" ng-if="m.type=='user'">
<span class="message-avatar glyphicon glyphicon-cog admin-message-avatar" ng-if="m.type!='user'"></span>
<p class="message-info">
<span class="message-title" ng-class="vm.isUnread(m)? 'unread' : 'read'" ng-bind="m.title"></span>
<p class="message-info" ng-if="m.type=='user'">
{{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' }}
<span ng-show="m.updatedat">, {{'MESSAGES_FIELD.LAST_REPLY_AT' | translate}} {{m.updatedat | date: 'yyyy-MM-dd HH:mm:ss' }}</span>
<span ng-show="m._replies.length">, {{'MESSAGES_FIELD.LAST_REPLY_AT' | translate}} {{m.updatedat | date: 'yyyy-MM-dd HH:mm:ss' }}</span>
</p>
<p class="message-info" ng-if="m.type!='user'">
{{m.from_user.displayName}} {{'MESSAGES_FIELD.INFO_SEND_AT' | translate}} {{m.createdat | date: 'yyyy-MM-dd HH:mm:ss' }}
</p>
</td>
<td class="td-v-middle text-center">
@@ -65,7 +71,7 @@
</td>
<td class="td-v-middle text-center" ng-click="$event.stopPropagation();">
<input type="checkbox" class="tcheckbox" ng-model="vm.selected[m._id]"
id="checkbox_{{m._id}}">
id="checkbox_{{m._id}}" ng-show="m.type=='user'">
</label>
</td>
</tr>
@@ -95,17 +101,21 @@
<div class="title-info">
<span class="message-title" ng-class="vm.getMessageClass(vm.selectedMessage);" ng-bind="vm.selectedMessage.title"></span>
<p class="message-info">
<p class="message-info" ng-if="m.type=='user'">
{{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' }}
</p>
<p class="message-info" ng-if="m.type!='user'">
{{vm.selectedMessage.from_user.displayName}} {{'MESSAGES_FIELD.INFO_SEND_AT' | translate}} {{vm.selectedMessage.createdat | date: 'yyyy-MM-dd HH:mm:ss' }}
</p>
</div>
</div>
<li class="status-divider"></li>
<div class="message-content" ng-bind-html="vm.getContentMarked(vm.selectedMessage);"></div>
<div class="message-reply">
<li class="status-divider" ng-show="vm.selectedMessage._replies.length>0"></li>
<div class="message-reply" ng-if="vm.selectedMessage._replies.length>0">
<li class="status-divider"></li>
<div class="reply-item" ng-repeat="r in vm.selectedMessage._replies">
<img class="reply-avatar" ng-src="/{{r.from_user.profileImageURL}}">
@@ -121,13 +131,15 @@
</div>
</div>
<div class="bottom-control">
<div class="bottom-control" ng-class="{'not-user-message': vm.selectedMessage.type!='user'}">
<textarea class="form-control reply-textarea" id="reply-content" name="reply-content"
ng-model="vm.replyContent" autofocus></textarea>
ng-model="vm.replyContent" ng-if="vm.selectedMessage.type=='user'" autofocus></textarea>
<button class="btn btn-default" ng-click="vm.hideMessage();">{{ 'BUTTON_MESSAGE_CLOSE' | translate }}</button>
<button class="btn btn-default" ng-click="vm.delete(vm.selectedMessage);">{{ 'BUTTON_MESSAGE_DELETE' | translate }}</button>
<button class="btn btn-default" ng-click="vm.delete(vm.selectedMessage);"
ng-if="vm.selectedMessage.type=='user'">{{ 'BUTTON_MESSAGE_DELETE' | translate }}
</button>
<button class="btn btn-success pull-right" ng-disabled="!vm.replyContent"
ng-click="vm.replyMessage(vm.selectedMessage);">{{ 'BUTTON_MESSAGE_REPLY' | translate }}
ng-click="vm.replyMessage(vm.selectedMessage);" ng-if="vm.selectedMessage.type=='user'">{{ 'BUTTON_MESSAGE_REPLY' | translate }}
</button>
</div>
</div>

View File

@@ -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();
});
};

View File

@@ -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]
});
}
});

View File

@@ -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

View File

@@ -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']}
]
}
]

View File

@@ -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);
};