feat(forums): forum Moderators manage by oper/admin

This commit is contained in:
OldHawk
2017-07-04 16:07:30 +08:00
parent 672cf10a15
commit f0b101dd91
10 changed files with 232 additions and 3 deletions

View File

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

View File

@@ -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: '讨论区',

View File

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

View File

@@ -30,3 +30,10 @@
color: #999;
}
}
.add-moderator-popover {
max-width: 250px;
max-height: 150px;
width: 250px;
height: auto;
}

View File

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

View File

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

View File

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

View File

@@ -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: '*'}
]
},
{

View File

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

View File

@@ -55,6 +55,10 @@
});
};
/**
* sendClicked
* @param idx
*/
vm.sendClicked = function (idx) {
vm.invitePopover.email = undefined;
vm.invitePopover.items[idx].isOpen = true;