mirror of
https://github.com/taobataoma/meanTorrent.git
synced 2026-02-27 00:31:05 +01:00
feat(Messages): merge adminMessages into user messages list
This commit is contained in:
@@ -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;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -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]
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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']}
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user