mirror of
https://github.com/taobataoma/meanTorrent.git
synced 2026-05-06 12:46:39 +02:00
feat(forums): forum Moderators manage by oper/admin
This commit is contained in:
@@ -634,6 +634,12 @@
|
||||
DELETE_CONFIRM_CANCEL: 'Cancel',
|
||||
DELETE_CONFIRM_HEADER_TEXT: 'Delete Confirm',
|
||||
DELETE_CONFIRM_BODY_TEXT: 'Are you sure want to delete this forum?',
|
||||
MODERATOR_TITLE: 'Add Moderator',
|
||||
ADD_MODERATOR_SUCCESSFULLY: 'Add moderator successfully',
|
||||
ADD_MODERATOR_FAILED: 'Add moderator failed',
|
||||
REMOVE_MODERATOR_SUCCESSFULLY: 'Remove moderator successfully',
|
||||
REMOVE_MODERATOR_FAILED: 'Remove moderator failed',
|
||||
REMOVE_CONFIRM_BODY_TEXT: 'Are you sure want to delete this moderator?',
|
||||
CATEGORY: {
|
||||
AFFAIRS: 'Affairs',
|
||||
DISCUSS: 'Discuss',
|
||||
|
||||
@@ -634,6 +634,12 @@
|
||||
DELETE_CONFIRM_CANCEL: '取消',
|
||||
DELETE_CONFIRM_HEADER_TEXT: '删除确认',
|
||||
DELETE_CONFIRM_BODY_TEXT: '您确定要删除这个版块吗?',
|
||||
MODERATOR_TITLE: '添加版主',
|
||||
ADD_MODERATOR_SUCCESSFULLY: '添加版主成功',
|
||||
ADD_MODERATOR_FAILED: '添加版主失败',
|
||||
REMOVE_MODERATOR_SUCCESSFULLY: '删除版主成功',
|
||||
REMOVE_MODERATOR_FAILED: '删除版主失败',
|
||||
REMOVE_CONFIRM_BODY_TEXT: '您确定要删除该版主吗?',
|
||||
CATEGORY: {
|
||||
AFFAIRS: '站务区',
|
||||
DISCUSS: '讨论区',
|
||||
|
||||
@@ -14,6 +14,12 @@
|
||||
vm.forumsConfig = MeanTorrentConfig.meanTorrentConfig.forumsConfig;
|
||||
vm.user = Authentication.user;
|
||||
|
||||
vm.addModeratorPopover = {
|
||||
title: 'FORUMS.MODERATOR_TITLE',
|
||||
templateUrl: 'add-moderator.html',
|
||||
items: []
|
||||
};
|
||||
|
||||
/**
|
||||
* init
|
||||
*/
|
||||
@@ -21,6 +27,10 @@
|
||||
ForumsAdminService.query({}, function (items) {
|
||||
vm.forums = items;
|
||||
console.log(items);
|
||||
|
||||
angular.forEach(vm.forums, function (f) {
|
||||
vm.addModeratorPopover.items.push(f._id, false);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
@@ -130,5 +140,59 @@
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* addModerator
|
||||
*/
|
||||
vm.addModerator = function () {
|
||||
ForumsAdminService.addModerator({
|
||||
_id: vm.forum._id,
|
||||
_username: vm.addModeratorPopover.username
|
||||
}, function (res) {
|
||||
NotifycationService.showSuccessNotify('FORUMS.ADD_MODERATOR_SUCCESSFULLY');
|
||||
vm.addModeratorPopover.items[vm.forum._id] = false;
|
||||
vm.init();
|
||||
}, function (res) {
|
||||
NotifycationService.showErrorNotify(res.data.message, 'FORUMS.ADD_MODERATOR_FAILED');
|
||||
vm.addModeratorPopover.items[vm.forum._id] = false;
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* addModeratorClicked
|
||||
* @param idx
|
||||
*/
|
||||
vm.addModeratorClicked = function (f) {
|
||||
vm.addModeratorPopover.username = undefined;
|
||||
vm.addModeratorPopover.items[f._id] = true;
|
||||
|
||||
vm.forum = f;
|
||||
};
|
||||
|
||||
/**
|
||||
* removeModeratorClicked
|
||||
* @param f forum
|
||||
* @param m moderator
|
||||
*/
|
||||
vm.removeModeratorClicked = function (f, m) {
|
||||
var modalOptions = {
|
||||
closeButtonText: $translate.instant('FORUMS.DELETE_CONFIRM_CANCEL'),
|
||||
actionButtonText: $translate.instant('FORUMS.DELETE_CONFIRM_OK'),
|
||||
headerText: $translate.instant('FORUMS.DELETE_CONFIRM_HEADER_TEXT'),
|
||||
bodyText: $translate.instant('FORUMS.REMOVE_CONFIRM_BODY_TEXT')
|
||||
};
|
||||
|
||||
ModalConfirmService.showModal({}, modalOptions)
|
||||
.then(function (result) {
|
||||
ForumsAdminService.removeModerator({
|
||||
_id: f._id,
|
||||
_username: m.username
|
||||
}, function (res) {
|
||||
NotifycationService.showSuccessNotify('FORUMS.REMOVE_MODERATOR_SUCCESSFULLY');
|
||||
vm.init();
|
||||
}, function (res) {
|
||||
NotifycationService.showErrorNotify(res.data.message, 'FORUMS.REMOVE_MODERATOR_FAILED');
|
||||
});
|
||||
});
|
||||
};
|
||||
}
|
||||
}());
|
||||
|
||||
@@ -30,3 +30,10 @@
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
|
||||
.add-moderator-popover {
|
||||
max-width: 250px;
|
||||
max-height: 150px;
|
||||
width: 250px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
@@ -13,6 +13,22 @@
|
||||
}, {
|
||||
update: {
|
||||
method: 'PUT'
|
||||
},
|
||||
addModerator: {
|
||||
method: 'PUT',
|
||||
url: '/api/admin/forums/:forumId/addModerator/:username',
|
||||
params: {
|
||||
forumId: '@_id',
|
||||
username: '@_username'
|
||||
}
|
||||
},
|
||||
removeModerator: {
|
||||
method: 'PUT',
|
||||
url: '/api/admin/forums/:forumId/removeModerator/:username',
|
||||
params: {
|
||||
forumId: '@_id',
|
||||
username: '@_username'
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -22,12 +22,34 @@
|
||||
<tbody>
|
||||
<tr ng-repeat="f in vm.forums | filter: { category: cat.value }">
|
||||
<td scope="row">
|
||||
<h4>{{f.name}} <span class="badge badge_mt" ng-show="f.readOnly">R</span><small>[<a href="#" ng-click="vm.popupEditForum($event, f);">Edit</a>]</small></h4>
|
||||
<h4>{{f.name}} <span class="badge badge_mt" ng-show="f.readOnly">R</span>
|
||||
<small>[<a href="#" ng-click="vm.popupEditForum($event, f);">Edit</a>]</small>
|
||||
</h4>
|
||||
|
||||
<p class="forum-desc" ng-bind-html="vm.getForumDesc(f);"></p>
|
||||
</td>
|
||||
<td class="text-center">{{f.order}}</td>
|
||||
<td class="text-center"></td>
|
||||
<td class="text-center">
|
||||
<div ng-repeat="m in f.moderators">
|
||||
<strong>{{m.username}}</strong> <small>[
|
||||
<a href="#" ng-click="vm.removeModeratorClicked(f, m);">-</a> ]
|
||||
</small>
|
||||
</div>
|
||||
<div>
|
||||
<small>[
|
||||
<a href="#"
|
||||
uib-popover-template="vm.addModeratorPopover.templateUrl"
|
||||
popover-append-to-body="true"
|
||||
popover-title="{{vm.addModeratorPopover.title | translate}}"
|
||||
popover-trigger="'outsideClick'"
|
||||
popover-placement="bottom"
|
||||
popover-is-open="vm.addModeratorPopover.items[f._id]"
|
||||
popover-class="add-moderator-popover"
|
||||
ng-click="vm.addModeratorClicked(f);">
|
||||
+</a> ]
|
||||
</small>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -106,5 +128,19 @@
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/ng-template" id="add-moderator.html">
|
||||
<form>
|
||||
<div class="form-group">
|
||||
<input type="text" ng-model="vm.addModeratorPopover.username" class="form-control"
|
||||
placeholder="{{ 'STATUS_FIELD.USERNAME' | translate }}" autofocus>
|
||||
</div>
|
||||
<div class="margin-top-10">
|
||||
<button class="btn btn-default" ng-disabled="!vm.addModeratorPopover.username"
|
||||
ng-click="vm.addModerator();">{{ 'FORUMS.BTN_ADD' | translate }}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</script>
|
||||
</section>
|
||||
|
||||
|
||||
@@ -74,6 +74,65 @@ exports.update = function (req, res) {
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* addModerator
|
||||
* @param req
|
||||
* @param res
|
||||
*/
|
||||
exports.addModerator = function (req, res) {
|
||||
var forum = req.forum;
|
||||
var mu = req.nameuser;
|
||||
|
||||
var om = [];
|
||||
forum.moderators.forEach(function (m) {
|
||||
om.push(m._id.toString());
|
||||
});
|
||||
|
||||
if (om.indexOf(mu._id.toString()) >= 0) {
|
||||
return res.status(422).send({
|
||||
message: 'username "' + mu.username + '" already exist!'
|
||||
});
|
||||
} else {
|
||||
forum.moderators.push(mu);
|
||||
forum.save(function (err) {
|
||||
if (err) {
|
||||
return res.status(422).send({
|
||||
message: errorHandler.getErrorMessage(err)
|
||||
});
|
||||
} else {
|
||||
res.json(forum);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
exports.removeModerator = function (req, res) {
|
||||
var forum = req.forum;
|
||||
var mu = req.nameuser;
|
||||
|
||||
var om = [];
|
||||
forum.moderators.forEach(function (m) {
|
||||
om.push(m._id.toString());
|
||||
});
|
||||
|
||||
if (om.indexOf(mu._id.toString()) < 0) {
|
||||
return res.status(422).send({
|
||||
message: 'username "' + mu.username + '" not exist!'
|
||||
});
|
||||
} else {
|
||||
forum.moderators.splice(om.indexOf(mu._id.toString()), 1);
|
||||
forum.save(function (err) {
|
||||
if (err) {
|
||||
return res.status(422).send({
|
||||
message: errorHandler.getErrorMessage(err)
|
||||
});
|
||||
} else {
|
||||
res.json(forum);
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* delete forum
|
||||
* @param req
|
||||
@@ -119,3 +178,24 @@ exports.forumByID = function (req, res, next, id) {
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Invitation middleware
|
||||
*/
|
||||
exports.userByUsername = function (req, res, next, uname) {
|
||||
User.findOne({
|
||||
username: uname
|
||||
})
|
||||
.select('username displayName profileImageURL uploaded downloaded')
|
||||
.exec(function (err, user) {
|
||||
if (err) {
|
||||
return next(err);
|
||||
} else if (!user) {
|
||||
return res.status(404).send({
|
||||
message: 'No user with that username has been found'
|
||||
});
|
||||
}
|
||||
req.nameuser = user;
|
||||
next();
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
@@ -18,7 +18,9 @@ exports.invokeRolesPolicies = function () {
|
||||
roles: ['admin', 'oper'],
|
||||
allows: [
|
||||
{resources: '/api/admin/forums', permissions: '*'},
|
||||
{resources: '/api/admin/forums/:forumId', permissions: '*'}
|
||||
{resources: '/api/admin/forums/:forumId', permissions: '*'},
|
||||
{resources: '/api/admin/forums/:forumId/addModerator/:username', permissions: '*'},
|
||||
{resources: '/api/admin/forums/:forumId/removeModerator/:username', permissions: '*'}
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
@@ -17,6 +17,14 @@ module.exports = function (app) {
|
||||
.put(forums.update)
|
||||
.delete(forums.delete);
|
||||
|
||||
// Single article routes
|
||||
app.route('/api/admin/forums/:forumId/addModerator/:username').all(forumsPolicy.isAllowed)
|
||||
.put(forums.addModerator);
|
||||
// Single article routes
|
||||
app.route('/api/admin/forums/:forumId/removeModerator/:username').all(forumsPolicy.isAllowed)
|
||||
.put(forums.removeModerator);
|
||||
|
||||
// Finish by binding the article middleware
|
||||
app.param('forumId', forums.forumByID);
|
||||
app.param('username', forums.userByUsername);
|
||||
};
|
||||
|
||||
@@ -55,6 +55,10 @@
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* sendClicked
|
||||
* @param idx
|
||||
*/
|
||||
vm.sendClicked = function (idx) {
|
||||
vm.invitePopover.email = undefined;
|
||||
vm.invitePopover.items[idx].isOpen = true;
|
||||
|
||||
Reference in New Issue
Block a user