feat(forums): add forums server policy & routes & controller

This commit is contained in:
OldHawk
2017-07-03 18:00:24 +08:00
parent fccb6407ee
commit 567f4eed85
13 changed files with 276 additions and 109 deletions

View File

@@ -618,7 +618,8 @@
},
//forum
FORUM: {
FORUMS: {
BTN_ADD_FORUM: 'Add New Forum',
CATEGORY: {
AFFAIRS: 'Affairs',
DISCUSS: 'Discuss',

View File

@@ -618,7 +618,8 @@
},
//forum
FORUM: {
FORUMS: {
BTN_ADD_FORUM: '添加版块',
CATEGORY: {
AFFAIRS: '站务区',
DISCUSS: '讨论区',

View File

@@ -31,3 +31,4 @@
});
}
}());

View File

@@ -5,13 +5,18 @@
.module('forums')
.controller('ForumsController', ForumsController);
ForumsController.$inject = ['$scope', '$translate'];
ForumsController.$inject = ['$scope', '$translate', 'Authentication', 'MeanTorrentConfig', 'ForumsAdminService'];
function ForumsController($scope, $translate) {
function ForumsController($scope, $translate, Authentication, MeanTorrentConfig, ForumsAdminService) {
var vm = this;
vm.formsConfig = MeanTorrentConfig.meanTorrentConfig.forumsConfig;
vm.user = Authentication.user;
vm.init = function () {
ForumsAdminService.query({}, function (items) {
vm.forums = items;
console.log(items);
});
};
}
}());

View File

@@ -1,6 +1,22 @@
(function () {
'use strict';
angular
.module('forums.services')
.factory('ForumsAdminService', ForumsAdminService);
ForumsAdminService.$inject = ['$resource'];
function ForumsAdminService($resource) {
return $resource('/api/admin/forums/:forumId', {
forumId: '@_Id'
}, {
update: {
method: 'PUT'
}
});
}
angular
.module('forums.services')
.factory('ForumsService', ForumsService);

View File

@@ -1,3 +1,36 @@
<section class="container padding-top-10" ng-controller="" ng-init="">
<h1>Forums Configure</h1>
</section>
<section class="container padding-top-10" ng-controller="ForumsController as vm" ng-init="vm.init();">
<div class="row margin-top-20">
<div class="col-md-10 col-md-offset-1">
<button class="btn btn-success">  {{ 'FORUMS.BTN_ADD_FORUM' | translate }}  </button>
</div>
<div class="col-sm-10 col-sm-offset-1">
<div class="panel panel-default margin-top-30" ng-repeat="cat in vm.formsConfig.category">
<div class="panel-heading text-center mt-title">
{{ 'FORUMS.CATEGORY.'+cat.name | translate }}
</div>
<div class="table-responsive" ng-if="vm.used_invitations.length>0">
<table class="table table-hover table-valign-middle">
<thead>
<tr>
<th></th>
<th class="text-center">{{'INVITATION.TITLE_TOKEN' | translate}}</th>
<th class="text-center">{{'INVITATION.TITLE_EMAIL' | translate}}</th>
<th class="text-center">{{'INVITATION.TITLE_SIGNINAT' | translate}}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="r in vm.used_invitations">
<th scope="row">{{$index+1}}</th>
<td class="text-center">{{r.token}}</td>
<td class="text-center">{{r.to_email}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</section>

View File

@@ -1,3 +1,3 @@
<section class="container padding-top-10" ng-controller="" ng-init="">
<h1>Forums Management</h1>
<h3>Forums Management</h3>
</section>

View File

@@ -0,0 +1,120 @@
'use strict';
/**
* Module dependencies
*/
var path = require('path'),
config = require(path.resolve('./config/config')),
mongoose = require('mongoose'),
errorHandler = require(path.resolve('./modules/core/server/controllers/errors.server.controller')),
User = mongoose.model('User'),
Forum = mongoose.model('Forum'),
Topic = mongoose.model('Topic'),
async = require('async');
/**
* create a forum
* @param req
* @param res
*/
exports.create = function (req, res) {
var forum = new Forum(req.body);
forum.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(forum);
}
});
};
/**
* list forums
* @param req
* @param res
*/
exports.list = function (req, res) {
Forum.find()
.sort('order -createdat')
.populate('lastTopic')
.populate('moderators', 'username displayName profileImageURL uploaded downloaded')
.exec(function (err, forums) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
}
res.json(forums);
});
};
/**
* Update an forum
*/
exports.update = function (req, res) {
var forum = req.forum;
forum.name = req.body.name;
forum.desc = req.body.desc;
forum.order = req.body.order;
forum.readOnly = req.body.readOnly;
forum.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(forum);
}
});
};
/**
* delete forum
* @param req
* @param res
*/
exports.delete = function (req, res) {
var forum = req.forum;
forum.remove(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(forum);
}
});
};
/**
* Invitation middleware
*/
exports.forumByID = function (req, res, next, id) {
if (!mongoose.Types.ObjectId.isValid(id)) {
return res.status(400).send({
message: 'Forum is invalid'
});
}
Forum.findById(id)
.populate('lastTopic')
.populate('moderators', 'username displayName profileImageURL uploaded downloaded')
.exec(function (err, forum) {
if (err) {
return next(err);
} else if (!forum) {
return res.status(404).send({
message: 'No forum with that identifier has been found'
});
}
req.forum = forum;
next();
});
};

View File

@@ -12,25 +12,6 @@ var path = require('path'),
Topic = mongoose.model('Topic'),
async = require('async');
/**
* create a forum
* @param req
* @param res
*/
exports.create = function (req, res) {
var forum = new Forum(req.body);
forum.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(forum);
}
});
};
/**
* list forums
* @param req
@@ -51,70 +32,4 @@ exports.list = function (req, res) {
});
};
/**
* Update an forum
*/
exports.update = function (req, res) {
var forum = req.forum;
forum.name = req.body.name;
forum.desc = req.body.desc;
forum.order = req.body.order;
forum.readOnly = req.body.readOnly;
forum.save(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(forum);
}
});
};
/**
* delete forum
* @param req
* @param res
*/
exports.delete = function (req, res) {
var forum = req.forum;
forum.remove(function (err) {
if (err) {
return res.status(422).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(forum);
}
});
};
/**
* Invitation middleware
*/
exports.forumByID = function (req, res, next, id) {
if (!mongoose.Types.ObjectId.isValid(id)) {
return res.status(400).send({
message: 'Forum is invalid'
});
}
Forum.findById(id)
.populate('lastTopic')
.populate('moderators', 'username displayName profileImageURL uploaded downloaded')
.exec(function (err, forum) {
if (err) {
return next(err);
} else if (!forum) {
return res.status(404).send({
message: 'No forum with that identifier has been found'
});
}
req.forum = forum;
next();
});
};

View File

@@ -0,0 +1,64 @@
'use strict';
/**
* Module dependencies
*/
var acl = require('acl');
// Using the memory backend
acl = new acl(new acl.memoryBackend());
/**
* Invoke Invitations Permissions
*/
exports.invokeRolesPolicies = function () {
acl.allow(
[
{
roles: ['admin', 'oper'],
allows: [
{resources: '/api/admin/forums', permissions: '*'},
{resources: '/api/admin/forums/:forumId', permissions: '*'}
]
},
{
roles: ['user'],
allows: [
{resources: '/api/admin/forums', permissions: ['get']},
{resources: '/api/admin/forums/:forumId', permissions: ['get']}
]
},
{
roles: ['guest'],
allows: [
{resources: '/api/admin/forums', permissions: ['get']},
{resources: '/api/admin/forums/:forumId', permissions: ['get']}
]
}
]
);
};
/**
* Check If Invitations Policy Allows
*/
exports.isAllowed = function (req, res, next) {
var roles = (req.user) ? req.user.roles : ['guest'];
// Check for user roles
acl.areAnyRolesAllowed(roles, req.route.path, req.method.toLowerCase(), function (err, isAllowed) {
if (err) {
// An authorization error occurred
return res.status(500).send('Unexpected authorization error');
} else {
if (isAllowed) {
// Access granted! Invoke next middleware
return next();
} else {
return res.status(403).json({
message: 'User is not authorized'
});
}
}
});
};

View File

@@ -15,19 +15,12 @@ exports.invokeRolesPolicies = function () {
acl.allow(
[
{
roles: ['admin', 'oper'],
roles: ['admin', 'oper', 'user'],
allows: [
{resources: '/api/forums', permissions: '*'},
{resources: '/api/forums/:forumId', permissions: '*'}
]
},
{
roles: ['user'],
allows: [
{resources: '/api/forums', permissions: ['get']},
{resources: '/api/forums/:forumId', permissions: ['get']}
]
},
{
roles: ['guest'],
allows: [

View File

@@ -0,0 +1,22 @@
'use strict';
/**
* Module dependencies
*/
var forumsPolicy = require('../policies/forums.admin.server.policy'),
forums = require('../controllers/forums.admin.server.controller');
module.exports = function (app) {
// Articles collection routes
app.route('/api/admin/forums').all(forumsPolicy.isAllowed)
.get(forums.list)
.post(forums.create);
// Single article routes
app.route('/api/admin/forums/:forumId').all(forumsPolicy.isAllowed)
.put(forums.update)
.delete(forums.delete);
// Finish by binding the article middleware
app.param('forumId', forums.forumByID);
};

View File

@@ -9,14 +9,10 @@ var forumsPolicy = require('../policies/forums.server.policy'),
module.exports = function (app) {
// Articles collection routes
app.route('/api/forums').all(forumsPolicy.isAllowed)
.get(forums.list)
.post(forums.create);
.get(forums.list);
// Single article routes
app.route('/api/forums/:forumId').all(forumsPolicy.isAllowed)
.put(forums.update)
.delete(forums.delete);
//app.route('/api/forums/:forumId').all(forumsPolicy.isAllowed)
// .get(forums.listTopic);
// Finish by binding the article middleware
app.param('forumId', forums.forumByID);
};