From 567f4eed854bb021880a2d6dee3c4d20a96329e4 Mon Sep 17 00:00:00 2001 From: OldHawk Date: Mon, 3 Jul 2017 18:00:24 +0800 Subject: [PATCH] feat(forums): add forums server policy & routes & controller --- modules/core/client/app/trans-string-en.js | 3 +- modules/core/client/app/trans-string-zh.js | 3 +- .../admin/forums-admin.client.routes.js | 1 + .../controllers/forums.client.controller.js | 11 +- .../client/services/forums.client.service.js | 16 +++ .../views/admin/configure.client.view.html | 39 +++++- .../views/admin/management.client.view.html | 2 +- .../forums.admin.server.controller.js | 120 ++++++++++++++++++ .../controllers/forums.server.controller.js | 85 ------------- .../policies/forums.admin.server.policy.js | 64 ++++++++++ .../server/policies/forums.server.policy.js | 9 +- .../routes/forums.admin.server.routes.js | 22 ++++ .../server/routes/forums.server.routes.js | 10 +- 13 files changed, 276 insertions(+), 109 deletions(-) create mode 100644 modules/forums/server/controllers/forums.admin.server.controller.js create mode 100644 modules/forums/server/policies/forums.admin.server.policy.js create mode 100644 modules/forums/server/routes/forums.admin.server.routes.js diff --git a/modules/core/client/app/trans-string-en.js b/modules/core/client/app/trans-string-en.js index 2f518699..9092a770 100644 --- a/modules/core/client/app/trans-string-en.js +++ b/modules/core/client/app/trans-string-en.js @@ -618,7 +618,8 @@ }, //forum - FORUM: { + FORUMS: { + BTN_ADD_FORUM: 'Add New Forum', CATEGORY: { AFFAIRS: 'Affairs', DISCUSS: 'Discuss', diff --git a/modules/core/client/app/trans-string-zh.js b/modules/core/client/app/trans-string-zh.js index ab9cdc25..6778be82 100644 --- a/modules/core/client/app/trans-string-zh.js +++ b/modules/core/client/app/trans-string-zh.js @@ -618,7 +618,8 @@ }, //forum - FORUM: { + FORUMS: { + BTN_ADD_FORUM: '添加版块', CATEGORY: { AFFAIRS: '站务区', DISCUSS: '讨论区', diff --git a/modules/forums/client/config/admin/forums-admin.client.routes.js b/modules/forums/client/config/admin/forums-admin.client.routes.js index 88884848..3a55c6ce 100644 --- a/modules/forums/client/config/admin/forums-admin.client.routes.js +++ b/modules/forums/client/config/admin/forums-admin.client.routes.js @@ -31,3 +31,4 @@ }); } }()); + diff --git a/modules/forums/client/controllers/forums.client.controller.js b/modules/forums/client/controllers/forums.client.controller.js index 72d0ffe0..6ff9e36e 100644 --- a/modules/forums/client/controllers/forums.client.controller.js +++ b/modules/forums/client/controllers/forums.client.controller.js @@ -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); + }); }; } }()); diff --git a/modules/forums/client/services/forums.client.service.js b/modules/forums/client/services/forums.client.service.js index bb3801e4..0fd06b22 100644 --- a/modules/forums/client/services/forums.client.service.js +++ b/modules/forums/client/services/forums.client.service.js @@ -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); diff --git a/modules/forums/client/views/admin/configure.client.view.html b/modules/forums/client/views/admin/configure.client.view.html index 04f7a730..b2d2d5db 100644 --- a/modules/forums/client/views/admin/configure.client.view.html +++ b/modules/forums/client/views/admin/configure.client.view.html @@ -1,3 +1,36 @@ -
-

Forums Configure

-
\ No newline at end of file +
+
+
+ +
+ +
+
+
+ {{ 'FORUMS.CATEGORY.'+cat.name | translate }} +
+ +
+ + + + + + + + + + + + + + + + +
{{'INVITATION.TITLE_TOKEN' | translate}}{{'INVITATION.TITLE_EMAIL' | translate}}{{'INVITATION.TITLE_SIGNINAT' | translate}}
{{$index+1}}{{r.token}}{{r.to_email}}
+
+
+
+
+
+ diff --git a/modules/forums/client/views/admin/management.client.view.html b/modules/forums/client/views/admin/management.client.view.html index ea106640..0683aa38 100644 --- a/modules/forums/client/views/admin/management.client.view.html +++ b/modules/forums/client/views/admin/management.client.view.html @@ -1,3 +1,3 @@
-

Forums Management

+

Forums Management

\ No newline at end of file diff --git a/modules/forums/server/controllers/forums.admin.server.controller.js b/modules/forums/server/controllers/forums.admin.server.controller.js new file mode 100644 index 00000000..d6fcd828 --- /dev/null +++ b/modules/forums/server/controllers/forums.admin.server.controller.js @@ -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(); + }); +}; + diff --git a/modules/forums/server/controllers/forums.server.controller.js b/modules/forums/server/controllers/forums.server.controller.js index d6fcd828..322c0627 100644 --- a/modules/forums/server/controllers/forums.server.controller.js +++ b/modules/forums/server/controllers/forums.server.controller.js @@ -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(); - }); -}; diff --git a/modules/forums/server/policies/forums.admin.server.policy.js b/modules/forums/server/policies/forums.admin.server.policy.js new file mode 100644 index 00000000..845b9f01 --- /dev/null +++ b/modules/forums/server/policies/forums.admin.server.policy.js @@ -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' + }); + } + } + }); +}; diff --git a/modules/forums/server/policies/forums.server.policy.js b/modules/forums/server/policies/forums.server.policy.js index 878ae8e3..ebbc45cd 100644 --- a/modules/forums/server/policies/forums.server.policy.js +++ b/modules/forums/server/policies/forums.server.policy.js @@ -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: [ diff --git a/modules/forums/server/routes/forums.admin.server.routes.js b/modules/forums/server/routes/forums.admin.server.routes.js new file mode 100644 index 00000000..7b55b363 --- /dev/null +++ b/modules/forums/server/routes/forums.admin.server.routes.js @@ -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); +}; diff --git a/modules/forums/server/routes/forums.server.routes.js b/modules/forums/server/routes/forums.server.routes.js index 5beb37e9..fec13004 100644 --- a/modules/forums/server/routes/forums.server.routes.js +++ b/modules/forums/server/routes/forums.server.routes.js @@ -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); };