Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 28 additions & 16 deletions controllers/discussion.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,18 @@ var categories = [
name: 'General Discussion',
description: 'Off-topic discussion about anything related to user scripts or OpenUserJS.org'
},
{
slug: 'issues',
name: 'Issues',
description: 'Discussions on scripts',
virtual: true
},
{
slug: 'all',
name: 'All Discussions',
description: 'Overview of all discussions',
virtual: true
}
];
exports.categories = categories;

Expand Down Expand Up @@ -73,6 +85,9 @@ exports.categoryListPage = function (aReq, aRes, aNext) {
// discussionListQuery
var discussionListQuery = Discussion.find();

// discussionListQuery: remove issues
discussionListQuery.and({ issue: { $ne: true } });

// discussionListQuery: Defaults
modelQuery.applyDiscussionListQueryDefaults(discussionListQuery, options, aReq);

Expand All @@ -97,20 +112,7 @@ exports.categoryListPage = function (aReq, aRes, aNext) {
_.map(options.discussionList, function (aDiscussion) {
var category = _.findWhere(categories, { slug: aDiscussion.category });
if (!category) {
category = {
name: aDiscussion.category,
slug: aDiscussion.category,
};

var regex = /^(scripts|libs)\/([^\/]+)(\/[^\/]+)?\/([^\/]+)\/issues$/;
var match = regex.exec(category.slug);
var isScriptIssue = match;
if (isScriptIssue) {
var scriptAuthorNameSlug = match[2];
var scriptNameSlug = match[4];
var scriptName = scriptNameSlug.replace(/\_/g, ' ');
category.name = scriptAuthorNameSlug + '/' + scriptName;
}
category = modelParser.parseCategoryUnknown(aDiscussion.category);
}
aDiscussion.category = modelParser.parseCategory(category);
});
Expand Down Expand Up @@ -144,7 +146,8 @@ exports.list = function (aReq, aRes, aNext) {

// Category
category = options.category = modelParser.parseCategory(category);
options.canPostTopicToCategory = category.canUserPostTopic(authedUser);
options.canPostTopicToCategory = !category.virtual && category.canUserPostTopic(authedUser);
options.multipleCategories = category.virtual;

// Page metadata
pageMetadata(options, [category.name, 'Discussions'], category.description);
Expand All @@ -159,7 +162,7 @@ exports.list = function (aReq, aRes, aNext) {
var discussionListQuery = Discussion.find();

// discussionListQuery: category
discussionListQuery.find({ category: category.slug });
modelQuery.applyDiscussionCategoryFilter(discussionListQuery, options, category.slug);

// discussionListQuery: Defaults
modelQuery.applyDiscussionListQueryDefaults(discussionListQuery, options, aReq);
Expand All @@ -182,6 +185,15 @@ exports.list = function (aReq, aRes, aNext) {
//--- PreRender
// discussionList
options.discussionList = _.map(options.discussionList, modelParser.parseDiscussion);
if (category.virtual) {
_.map(options.discussionList, function (aDiscussion) {
var category = _.findWhere(categories, { slug: aDiscussion.category });
if (!category) {
category = modelParser.parseCategoryUnknown(aDiscussion.category);
}
aDiscussion.category = modelParser.parseCategory(category);
});
}

// Pagination
options.paginationRendered = pagination.renderDefault(aReq);
Expand Down
18 changes: 18 additions & 0 deletions libs/modelParser.js
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,24 @@ var parseCategory = function (aCategoryData) {
parseModelFnMap.Category = parseCategory;
exports.parseCategory = parseCategory;

var parseCategoryUnknown = function (aCategoryUnknownSlug) {
var category = {
name: aCategoryUnknownSlug,
slug: aCategoryUnknownSlug
};

var isScriptIssueRegex = /^(scripts|libs)\/([^\/]+)(\/[^\/]+)?\/([^\/]+)\/issues$/;
var isScriptIssue = isScriptIssueRegex.exec(category.slug);
if (isScriptIssue) {
var scriptAuthorNameSlug = isScriptIssue[2];
var scriptNameSlug = isScriptIssue[4];
var scriptName = scriptNameSlug.replace(/\_/g, ' ');
category.name = scriptAuthorNameSlug + '/' + scriptName;
}
return category;
};
exports.parseCategoryUnknown = parseCategoryUnknown;

/**
* Remove
*/
Expand Down
9 changes: 9 additions & 0 deletions libs/modelQuery.js
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,15 @@ var parseRemovedItemSearchQuery = function (aRemovedItemListQuery, aQuery) {
};
exports.parseCommentSearchQuery = parseCommentSearchQuery;

exports.applyDiscussionCategoryFilter = function (aDiscussionListQuery, aOptions, aCatergorySlug) {
if (aCatergorySlug === 'all') { return; }
if (aCatergorySlug === 'issues') {
aDiscussionListQuery.find({ issue: true });
} else {
aDiscussionListQuery.find({ category: aCatergorySlug });
}
};

var applyModelListQueryFlaggedFilter = function (aModelListQuery, aOptions, aFlaggedQuery) {
// Only list flagged items if authedUser >= moderator or if authedUser owns the item.
if (aOptions.isYou || aOptions.isMod) {
Expand Down
2 changes: 1 addition & 1 deletion routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ module.exports = function (aApp) {
// Discussion routes
// TODO: Update templates for new discussion routes
aApp.route('/forum').get(discussion.categoryListPage);
aApp.route('/:p(forum)?/:category(announcements|corner|garage|discuss)').get(discussion.list);
aApp.route('/:p(forum)?/:category(announcements|corner|garage|discuss|issues|all)').get(discussion.list);
aApp.route('/:p(forum)?/:category(announcements|corner|garage|discuss)/:topic').get(discussion.show).post(discussion.createComment);
aApp.route('/:p(forum)?/:category(announcements|corner|garage|discuss)/new').get(discussion.newTopic).post(discussion.createTopic);
// dupe
Expand Down