Skip to content

Commit

Permalink
Merge pull request #185 from Zren/announcements
Browse files Browse the repository at this point in the history
Add an announcements discussion category listed on the homepage.
  • Loading branch information
sizzlemctwizzle committed Jun 19, 2014
2 parents 4900e85 + bba62f5 commit b2e9cc9
Show file tree
Hide file tree
Showing 8 changed files with 137 additions and 12 deletions.
18 changes: 13 additions & 5 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ var express = require('express');
var MongoStore = require('connect-mongo')(express);
var mongoose = require('mongoose');
var passport = require('passport');
var util = require('util');

var app = express();

Expand Down Expand Up @@ -219,11 +220,18 @@ app_route('/api/group/search/:term/:addTerm?').get(group.search);

// Discussion routes
app_route('/forum').get(discussion.categoryListPage);
app.get(listRegex('\/(corner|garage|discuss)', ''), discussion.list);
app.get(listRegex('\/(corner|garage|discuss)\/([^\/]+?)', ''), discussion.show);
app.get('/post/:category(corner|garage|discuss)', discussion.newTopic);
app.post('/post/:category(corner|garage|discuss)', discussion.createTopic);
app.post('/:category(corner|garage|discuss)/:topic', discussion.createComment);
app_route('/forum/:category(announcements|corner|garage|discuss)').get(discussion.list);
app_route('/forum/:category(announcements|corner|garage|discuss)/new').get(discussion.newTopic).post(discussion.createTopic);
app_route('/forum/:category(announcements|corner|garage|discuss)/:topic').get(discussion.show).post(discussion.createComment);

// Discussion routes: Legacy
// app_route('/:category(announcements|corner|garage|discuss)').get(function(req, res, next) { res.redirect(util.format('/forum/%s', req.route.params.category)); });
// app_route('/:category(announcements|corner|garage|discuss)/:topic').get(function(req, res, next) { res.redirect(util.format('/forum/%s/%s', req.route.params.category, req.route.params.topic)) });
app.get(listRegex('\/(announcements|corner|garage|discuss)', ''), discussion.list);
app.get(listRegex('\/(announcements|corner|garage|discuss)\/([^\/]+?)', ''), discussion.show);
app.get('/post/:category(announcements|corner|garage|discuss)', discussion.newTopic);
app.post('/post/:category(announcements|corner|garage|discuss)', discussion.createTopic);
app.post('/:category(announcements|corner|garage|discuss)/:topic', discussion.createComment);

// Search routes
app.post('/search', function(req, res) {
Expand Down
45 changes: 41 additions & 4 deletions controllers/discussion.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,15 @@ var modelParser = require('../libs/modelParser');
var modelQuery = require('../libs/modelQuery');
var cleanFilename = require('../libs/helpers').cleanFilename;
var execQueryTask = require('../libs/tasks').execQueryTask;
var statusCodePage = require('../libs/templateHelpers').statusCodePage;

var categories = [
{
slug: 'announcements',
name: 'Announcements',
description: 'UserScripts News (OpenUserJS, GreaseMonkey, etc)',
roleReqToPostTopic: 3, // Moderator
},
{
slug: 'garage',
name: 'The Garage',
Expand All @@ -26,6 +33,7 @@ var categories = [
description: 'Off-topic discussion about anything related to user scripts or OpenUserJS.org'
},
];
exports.categories = categories;

exports.categoryListPage = function (req, res, next) {
var authedUser = req.session.user;
Expand Down Expand Up @@ -122,6 +130,7 @@ exports.list = function (req, res, next) {

// Category
category = options.category = modelParser.parseCategory(category);
options.canPostTopicToCategory = category.canUserPostTopic(authedUser);

// Metadata
options.title = category.name + ' | OpenUserJS.org';
Expand Down Expand Up @@ -278,6 +287,13 @@ exports.newTopic = function (req, res, next) {
options.isMod = authedUser && authedUser.isMod;
options.isAdmin = authedUser && authedUser.isAdmin;

if (!category.canUserPostTopic(authedUser)) {
return statusCodePage(req, res, next, {
statusCode: 403,
statusMessage: 'You cannot post a topic to this category',
});
}

//
options.category = category;

Expand Down Expand Up @@ -368,14 +384,35 @@ exports.postTopic = postTopic;

// post route to create a new topic
exports.createTopic = function (req, res, next) {
var user = req.session.user;
var category = req.route.params.category;
var authedUser = req.session.user;

if (!authedUser)
return res.redirect('/login');

var categorySlug = req.route.params.category;
var topic = req.body['discussion-topic'];
var content = req.body['comment-content'];

if (!user) { return next(); }
var category = _.findWhere(categories, {slug: categorySlug});
if (!category)
return next();

//
var options = {};

// Session
authedUser = options.authedUser = modelParser.parseUser(authedUser);
options.isMod = authedUser && authedUser.isMod;
options.isAdmin = authedUser && authedUser.isAdmin;

if (!category.canUserPostTopic(authedUser)) {
return statusCodePage(req, res, next, {
statusCode: 403,
statusMessage: 'You cannot post a topic to this category',
});
}

postTopic(user, category, topic, content, false, function (discussion) {
postTopic(authedUser, category.slug, topic, content, false, function (discussion) {
if (!discussion) { return exports.newTopic(req, res, next); }

res.redirect(encodeURI(discussion.path
Expand Down
19 changes: 19 additions & 0 deletions controllers/index.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
var async = require('async');
var _ = require('underscore');

var Discussion = require('../models/discussion').Discussion;
var Group = require('../models/group').Group;
var User = require('../models/user').User;
var Script = require('../models/script').Script;
var Strategy = require('../models/strategy').Strategy;

var strategies = require('./strategies.json');
var discussionLib = require('./discussion');
var modelsList = require('../libs/modelsList');
var modelParser = require('../libs/modelParser');
var modelQuery = require('../libs/modelQuery');
Expand Down Expand Up @@ -60,6 +62,17 @@ exports.home = function (req, res) {
.sort('-rating')
.limit(25);

// Announcements
options.announcementsCategory = _.findWhere(discussionLib.categories, {slug: 'announcements'});
options.announcementsCategory = modelParser.parseCategory(options.announcementsCategory);

// announcementsDiscussionListQuery
var announcementsDiscussionListQuery = Discussion.find();
announcementsDiscussionListQuery
.and({category: options.announcementsCategory.slug})
.sort('-created')
.limit(5);

//--- Tasks

// Pagination
Expand All @@ -71,6 +84,9 @@ exports.home = function (req, res) {
// popularGroupListQuery
tasks.push(execQueryTask(popularGroupListQuery, options, 'popularGroupList'));

// announcementsDiscussionListQuery
tasks.push(execQueryTask(announcementsDiscussionListQuery, options, 'announcementsDiscussionList'));

//---
function preRender(){
// scriptList
Expand All @@ -79,6 +95,9 @@ exports.home = function (req, res) {
// popularGroupList
options.popularGroupList = _.map(options.popularGroupList, modelParser.parseGroup);

// announcementsDiscussionList
options.announcementsDiscussionList = _.map(options.announcementsDiscussionList, modelParser.parseDiscussion);

// Pagination
options.paginationRendered = pagination.renderDefault(req);

Expand Down
24 changes: 24 additions & 0 deletions libs/modelParser.js
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ exports.parseGroup = parseGroup;
var parseDiscussion = function(discussionData) {
if (!discussionData) return;
var discussion = discussionData.toObject ? discussionData.toObject() : discussionData;
// var discussion = discussionData; // Can't override discussionData.category

// Urls
discussion.discussionPageUrl = discussion.path + (discussion.duplicateId ? '_' + discussion.duplicateId : '');
Expand All @@ -265,6 +266,9 @@ var parseDiscussion = function(discussionData) {
});
discussion.recentCommentors = recentCommentors;

// Replies
discussion.replies = (discussion.comments && discussion.comments > 0) ? discussion.comments - 1 : 0;

//discussion.path = discussion.path + (discussion.duplicateId ? '_' + discussion.duplicateId : '');

return discussion;
Expand Down Expand Up @@ -314,6 +318,21 @@ exports.renderComment = function(comment) {
* Category
*/

var canUserPostTopicToCategory = function(user, category) {
// Check if user is logged in.
if (_.isUndefined(user) || _.isNull(user))
return false; // Not logged in.

// Check if this category requires a minimum role to post topics.
console.log(category.roleReqToPostTopic, _.isNumber(category.roleReqToPostTopic), user.role, user.role <= category.roleReqToPostTopic)
if (_.isNumber(category.roleReqToPostTopic)) {
return user.role <= category.roleReqToPostTopic;
} else {
// No specified role required
return true;
}
};

//
var parseCategory = function(categoryData) {
if (!categoryData) return;
Expand All @@ -323,6 +342,11 @@ var parseCategory = function(categoryData) {
category.categoryPageUrl = '/' + category.slug;
category.categoryPostDiscussionPageUrl = '/post/' + category.slug;

// Functions
category.canUserPostTopic = function (user) {
return canUserPostTopicToCategory(user, category);
};

return category;
};
parseModelFnMap.Category = parseCategory;
Expand Down
36 changes: 36 additions & 0 deletions views/includes/announcementsPanel.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@


<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title">
<i class="fa fa-fw fa-exclamation-circle"></i>
Announcements
</div>
</div>
<div>
<div class="table-responsive">
<table class="table table-hover table-condensed table-striped">
<tbody>
{{#announcementsDiscussionList}}
<tr class="tr-link">
<td>
<b>
<a href="{{{discussionPageUrl}}}" class="tr-link-a">{{topic}}</a>
</b>
</td>
<td class="text-center td-fit">
<p>{{replies}} replies</p>
</td>
<td class="text-center td-fit">
<time datetime="{{createdISOFormat}}" title="{{created}}">{{createdHumanized}}</time>
</td>
</tr>
{{/announcementsDiscussionList}}
</tbody>
</table>
<div class="text-center">
<a href="{{{announcementsCategory.categoryPageUrl}}}" class="btn btn-link">Older</a>
</div>
</div>
</div>
</div>
4 changes: 2 additions & 2 deletions views/includes/discussionList.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<th class="text-center td-fit">Category</th>
{{/multipleCategories}}
<th class="text-center td-fit">Users</th>
<th class="text-center td-fit"><a href="?orderBy=comments&orderDir=desc">Posts</a></th>
<th class="text-center td-fit"><a href="?orderBy=comments&orderDir=desc">Replies</a></th>
<th class="text-center td-fit">Views</th>
<th class="text-center td-fit"><a href="?orderBy=created&orderDir=desc">Created</a></th>
<th class="text-center td-fit"><a href="?orderBy=updated&orderDir=desc">Updated</a></th>
Expand All @@ -32,7 +32,7 @@
{{/recentCommentors}}
</td>
<td class="text-center td-fit">
<p>{{comments}}</p>
<p>{{replies}}</p>
</td>
<td class="text-center td-fit">
<p>?</p>
Expand Down
2 changes: 1 addition & 1 deletion views/pages/discussionListPage.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
<li class=""><a href="/forum">Forum</a></li>
<li class="active"><a href="{{{category.categoryPageUrl}}}">{{category.name}}</a></li>
</ol>
<a href="{{{category.categoryPostDiscussionPageUrl}}}" class="btn btn-success pull-right" id="create-topic">
<a href="{{{category.categoryPostDiscussionPageUrl}}}" class="btn btn-success pull-right {{^canPostTopicToCategory}}disabled{{/canPostTopicToCategory}}" id="create-topic">
<i class="fa fa-plus"></i> Create Topic
</a>
</div>
Expand Down
1 change: 1 addition & 0 deletions views/pages/scriptListPage.html
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ <h2 class="page-heading">
<div class="col-sm-4">
{{> includes/searchBarPanel.html }}
{{> includes/popularGroupsPanel.html }}
{{> includes/announcementsPanel.html }}
</div>
</div>
</div>
Expand Down

0 comments on commit b2e9cc9

Please sign in to comment.