mirror of
https://github.com/taobataoma/meanTorrent.git
synced 2026-05-07 07:16:27 +02:00
feat(forums): add forums server policy & routes & controller
This commit is contained in:
@@ -618,7 +618,8 @@
|
||||
},
|
||||
|
||||
//forum
|
||||
FORUM: {
|
||||
FORUMS: {
|
||||
BTN_ADD_FORUM: 'Add New Forum',
|
||||
CATEGORY: {
|
||||
AFFAIRS: 'Affairs',
|
||||
DISCUSS: 'Discuss',
|
||||
|
||||
@@ -618,7 +618,8 @@
|
||||
},
|
||||
|
||||
//forum
|
||||
FORUM: {
|
||||
FORUMS: {
|
||||
BTN_ADD_FORUM: '添加版块',
|
||||
CATEGORY: {
|
||||
AFFAIRS: '站务区',
|
||||
DISCUSS: '讨论区',
|
||||
|
||||
@@ -31,3 +31,4 @@
|
||||
});
|
||||
}
|
||||
}());
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
};
|
||||
}
|
||||
}());
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<section class="container padding-top-10" ng-controller="" ng-init="">
|
||||
<h1>Forums Management</h1>
|
||||
<h3>Forums Management</h3>
|
||||
</section>
|
||||
@@ -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();
|
||||
});
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
64
modules/forums/server/policies/forums.admin.server.policy.js
Normal file
64
modules/forums/server/policies/forums.admin.server.policy.js
Normal 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'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
@@ -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: [
|
||||
|
||||
22
modules/forums/server/routes/forums.admin.server.routes.js
Normal file
22
modules/forums/server/routes/forums.admin.server.routes.js
Normal 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);
|
||||
};
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user