Skip to content

Commit 3a70a72

Browse files
committed
Conflicts: app.js controllers/discussion.js controllers/group.js controllers/issue.js controllers/script.js controllers/scriptStorage.js controllers/user.js libs/markdown.js libs/modelParser.js views/includes/discussionList.html
2 parents acd6eb5 + c883fe5 commit 3a70a72

17 files changed

+469
-117
lines changed

app.js

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ var express = require('express');
33
var MongoStore = require('connect-mongo')(express);
44
var mongoose = require('mongoose');
55
var passport = require('passport');
6+
var util = require('util');
67

78
var app = express();
89

@@ -158,12 +159,9 @@ app_route('/script/:namespace?/:scriptname/edit').get(script.edit).post(script.e
158159
app_route('/scripts/:username/:namespace?/:scriptname/source').get(user.editScript); // Legacy TODO Remove
159160

160161
// Script routes: Legacy
161-
app.get('/install/:username/:scriptname', scriptStorage.sendScript);
162-
app.get('/install/:username/:namespace/:scriptname', scriptStorage.sendScript);
163-
app.get('/meta/:username/:scriptname', scriptStorage.sendMeta);
164-
app.get('/meta/:username/:namespace/:scriptname', scriptStorage.sendMeta);
165-
app.get('/vote/scripts/:username/:scriptname/:vote', script.vote);
166-
app.get('/vote/scripts/:username/:namespace/:scriptname/:vote', script.vote);
162+
app.get('/install/:username/:namespace?/:scriptname', scriptStorage.sendScript);
163+
app.get('/meta/:username/:namespace?/:scriptname', scriptStorage.sendMeta);
164+
app.get('/vote/scripts/:username/:namespace?/:scriptname/:vote', script.vote);
167165
app.post('/github/hook', scriptStorage.webhook);
168166
app.post('/github/service', function(req, res, next) { next(); });
169167

@@ -176,7 +174,7 @@ app.post('/lib/:scriptname/edit', script.lib(script.edit));
176174
app.get('/libs/:username/:scriptname/source', script.lib(user.editScript));
177175
app.get('/libs/src/:username/:scriptname', scriptStorage.sendScript);
178176
app.get('/vote/libs/:username/:scriptname/:vote', script.lib(script.vote));
179-
app.get(listRegex('\/use\/lib\/([^\/]+?)\/([^\/]+?)', 'script'), script.useLib);
177+
//app.get(listRegex('\/use\/lib\/([^\/]+?)\/([^\/]+?)', 'script'), script.useLib);
180178

181179
// Issues routes
182180
app_route('/:type(scripts|libs)/:username/:namespace?/:scriptname/issues/:open(closed)?').get(issue.list);
@@ -185,10 +183,8 @@ app_route('/:type(scripts|libs)/:username/:namespace?/:scriptname/issue/new').ge
185183
app_route('/:type(scripts|libs)/:username/:namespace?/:scriptname/issues/:topic').get(issue.view);
186184

187185
// Issues routes: Legacy
188-
app.post('/:type(scripts|libs)/:username/:scriptname/issues/:topic', issue.comment);
189-
app.post('/:type(scripts|libs)/:username/:namespace/:scriptname/issues/:topic', issue.comment);
190-
app.get('/:type(scripts|libs)/:username/:scriptname/issues/:topic/:action(close|reopen)', issue.changeStatus);
191-
app.get('/:type(scripts|libs)/:username/:namespace/:scriptname/issues/:topic/:action(close|reopen)', issue.changeStatus);
186+
app.post('/:type(scripts|libs)/:username/:namespace?/:scriptname/issues/:topic', issue.comment);
187+
app.get('/:type(scripts|libs)/:username/:namespace?/:scriptname/issues/:topic/:action(close|reopen)', issue.changeStatus);
192188

193189
// Admin routes
194190
app.get('/admin', admin.adminPage);
@@ -202,8 +198,7 @@ app_route('/mod').get(moderation.modPage);
202198
app_route('/mod/removed').get(moderation.removedItemListPage);
203199
app_route('/mod/removed/:id').get(moderation.removedItemPage);
204200
app.get('/flag/users/:username/:unflag?', user.flag);
205-
app.get('/flag/scripts/:username/:namespace/:scriptname/:unflag?', script.flag);
206-
app.get('/flag/scripts/:username/:scriptname/:unflag?', script.flag);
201+
app.get('/flag/scripts/:username/:namespace?/:scriptname/:unflag?', script.flag);
207202
app.get('/flag/libs/:username/:scriptname/:unflag?', script.lib(script.flag));
208203
app.get(listRegex('\/flagged(?:\/([^\/]+?))?', 'user|script'), moderation.flagged);
209204
app.get(listRegex('\/graveyard(?:\/([^\/]+?))?', ''), moderation.graveyard);
@@ -216,13 +211,20 @@ app_route('/api/group/search/:term/:addTerm?').get(group.search);
216211

217212
// Discussion routes
218213
app_route('/forum').get(discussion.categoryListPage);
219-
app.get(listRegex('\/(corner|garage|discuss)', ''), discussion.list);
220-
app.get(listRegex('\/(corner|garage|discuss)\/([^\/]+?)', ''), discussion.show);
221-
app.get('/post/:category(corner|garage|discuss)', discussion.newTopic);
222-
app.post('/post/:category(corner|garage|discuss)', discussion.createTopic);
223-
app.post('/:category(corner|garage|discuss)/:topic', discussion.createComment);
224-
225-
// Search routes
214+
app_route('/forum/:category(announcements|corner|garage|discuss)').get(discussion.list);
215+
app_route('/forum/:category(announcements|corner|garage|discuss)/new').get(discussion.newTopic).post(discussion.createTopic);
216+
app_route('/forum/:category(announcements|corner|garage|discuss)/:topic').get(discussion.show).post(discussion.createComment);
217+
218+
// Discussion routes: Legacy
219+
// app_route('/:category(announcements|corner|garage|discuss)').get(function(req, res, next) { res.redirect(util.format('/forum/%s', req.route.params.category)); });
220+
// 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)) });
221+
app.get(listRegex('\/(announcements|corner|garage|discuss)', ''), discussion.list);
222+
app.get(listRegex('\/(announcements|corner|garage|discuss)\/([^\/]+?)', ''), discussion.show);
223+
app.get('/post/:category(announcements|corner|garage|discuss)', discussion.newTopic);
224+
app.post('/post/:category(announcements|corner|garage|discuss)', discussion.createTopic);
225+
app.post('/:category(announcements|corner|garage|discuss)/:topic', discussion.createComment);
226+
227+
// Search routes: Legacy
226228
app.post('/search', function(req, res) {
227229
var search = encodeURIComponent(req.body.search.replace(/^\s+|\s+$/g, ''));
228230
res.redirect('/search/' + search + '/' + req.body.type + 'list');

controllers/discussion.js

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,15 @@ var modelParser = require('../libs/modelParser');
88
var modelQuery = require('../libs/modelQuery');
99
var cleanFilename = require('../libs/helpers').cleanFilename;
1010
var execQueryTask = require('../libs/tasks').execQueryTask;
11+
var statusCodePage = require('../libs/templateHelpers').statusCodePage;
1112

1213
var categories = [
14+
{
15+
slug: 'announcements',
16+
name: 'Announcements',
17+
description: 'UserScripts News (OpenUserJS, GreaseMonkey, etc)',
18+
roleReqToPostTopic: 3 // Moderator
19+
},
1320
{
1421
slug: 'garage',
1522
name: 'The Garage',
@@ -26,6 +33,7 @@ var categories = [
2633
description: 'Off-topic discussion about anything related to user scripts or OpenUserJS.org'
2734
},
2835
];
36+
exports.categories = categories;
2937

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

123131
// Category
124132
category = options.category = modelParser.parseCategory(category);
133+
options.canPostTopicToCategory = category.canUserPostTopic(authedUser);
125134

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

290+
if (!category.canUserPostTopic(authedUser)) {
291+
return statusCodePage(req, res, next, {
292+
statusCode: 403,
293+
statusMessage: 'You cannot post a topic to this category',
294+
});
295+
}
296+
281297
//
282298
options.category = category;
283299

@@ -368,14 +384,35 @@ exports.postTopic = postTopic;
368384

369385
// post route to create a new topic
370386
exports.createTopic = function(req, res, next) {
371-
var user = req.session.user;
372-
var category = req.route.params.category;
387+
var authedUser = req.session.user;
388+
389+
if (!authedUser)
390+
return res.redirect('/login');
391+
392+
var categorySlug = req.route.params.category;
373393
var topic = req.body['discussion-topic'];
374394
var content = req.body['comment-content'];
375395

376-
if (!user) { return next(); }
396+
var category = _.findWhere(categories, { slug: categorySlug });
397+
if (!category)
398+
return next();
399+
400+
//
401+
var options = {};
402+
403+
// Session
404+
authedUser = options.authedUser = modelParser.parseUser(authedUser);
405+
options.isMod = authedUser && authedUser.isMod;
406+
options.isAdmin = authedUser && authedUser.isAdmin;
407+
408+
if (!category.canUserPostTopic(authedUser)) {
409+
return statusCodePage(req, res, next, {
410+
statusCode: 403,
411+
statusMessage: 'You cannot post a topic to this category',
412+
});
413+
}
377414

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

381418
res.redirect(encodeURI(discussion.path

controllers/group.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ exports.view = function(req, res, next) {
245245
scriptListQuery.find({ _id: { $in: group._scriptIds } });
246246

247247
// scriptListQuery: isLib=false
248-
scriptListQuery.find({ isLib: false });
248+
scriptListQuery.find({ isLib: { $ne: true } });
249249

250250
// scriptListQuery: Defaults
251251
modelQuery.applyScriptListQueryDefaults(scriptListQuery, options, req);

controllers/index.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
var async = require('async');
22
var _ = require('underscore');
33

4+
var Discussion = require('../models/discussion').Discussion;
45
var Group = require('../models/group').Group;
56
var User = require('../models/user').User;
67
var Script = require('../models/script').Script;
78
var Strategy = require('../models/strategy').Strategy;
89

910
var strategies = require('./strategies.json');
11+
var discussionLib = require('./discussion');
1012
var modelsList = require('../libs/modelsList');
1113
var modelParser = require('../libs/modelParser');
1214
var modelQuery = require('../libs/modelQuery');
@@ -59,6 +61,17 @@ exports.home = function(req, res) {
5961
.sort('-rating')
6062
.limit(25);
6163

64+
// Announcements
65+
options.announcementsCategory = _.findWhere(discussionLib.categories, {slug: 'announcements'});
66+
options.announcementsCategory = modelParser.parseCategory(options.announcementsCategory);
67+
68+
// announcementsDiscussionListQuery
69+
var announcementsDiscussionListQuery = Discussion.find();
70+
announcementsDiscussionListQuery
71+
.and({category: options.announcementsCategory.slug})
72+
.sort('-created')
73+
.limit(5);
74+
6275
//--- Tasks
6376

6477
// Pagination
@@ -70,6 +83,9 @@ exports.home = function(req, res) {
7083
// popularGroupListQuery
7184
tasks.push(execQueryTask(popularGroupListQuery, options, 'popularGroupList'));
7285

86+
// announcementsDiscussionListQuery
87+
tasks.push(execQueryTask(announcementsDiscussionListQuery, options, 'announcementsDiscussionList'));
88+
7389
//---
7490
function preRender() {
7591
// scriptList
@@ -78,6 +94,9 @@ exports.home = function(req, res) {
7894
// popularGroupList
7995
options.popularGroupList = _.map(options.popularGroupList, modelParser.parseGroup);
8096

97+
// announcementsDiscussionList
98+
options.announcementsDiscussionList = _.map(options.announcementsDiscussionList, modelParser.parseDiscussion);
99+
81100
// Pagination
82101
options.paginationRendered = pagination.renderDefault(req);
83102

controllers/issue.js

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ exports.list = function(req, res, next) {
1717
var authedUser = req.session.user;
1818

1919
var type = req.route.params.type;
20-
var username = req.route.params.username.toLowerCase();
21-
var namespace = req.route.params.namespace;
20+
var username = req.route.params.username;
2221
var scriptname = req.route.params.scriptname;
2322
var open = req.route.params.open !== 'closed';
2423

25-
var installNameSlug = username + '/' + (namespace ? namespace + '/' : '') + scriptname;
24+
var installNameSlug = username + '/' + scriptname;
2625

2726
Script.findOne({
28-
installName: installNameSlug + (type === 'libs' ? '.js' : '.user.js')
29-
}, function(err, scriptData) {
27+
installName: scriptStorage.caseInsensitive(
28+
installNameSlug + (type === 'libs' ? '.js' : '.user.js'))
29+
}, function (err, scriptData) {
3030
if (err || !scriptData) { return next(); }
3131

3232
//
@@ -112,16 +112,16 @@ exports.view = function(req, res, next) {
112112
var authedUser = req.session.user;
113113

114114
var type = req.route.params.type;
115-
var username = req.route.params.username.toLowerCase();
116-
var namespace = req.route.params.namespace;
115+
var username = req.route.params.username;
117116
var scriptname = req.route.params.scriptname;
118117
var topic = req.route.params.topic;
119118

120-
var installNameSlug = username + '/' + (namespace ? namespace + '/' : '') + scriptname;
119+
var installNameSlug = username + '/' + scriptname;
121120

122121
Script.findOne({
123-
installName: installNameSlug + (type === 'libs' ? '.js' : '.user.js')
124-
}, function(err, scriptData) {
122+
installName: scriptStorage.caseInsensitive(
123+
installNameSlug + (type === 'libs' ? '.js' : '.user.js'))
124+
}, function (err, scriptData) {
125125
if (err || !scriptData) { return next(); }
126126

127127
//
@@ -219,8 +219,9 @@ exports.open = function(req, res, next) {
219219
var installNameSlug = scriptStorage.getInstallName(req);
220220

221221
Script.findOne({
222-
installName: installNameSlug + (type === 'libs' ? '.js' : '.user.js')
223-
}, function(err, scriptData) {
222+
installName: scriptStorage.caseInsensitive(
223+
installNameSlug + (type === 'libs' ? '.js' : '.user.js'))
224+
}, function (err, scriptData) {
224225
if (err || !scriptData) { return next(); }
225226

226227
//
@@ -286,11 +287,9 @@ exports.comment = function(req, res, next) {
286287

287288
if (!user) { return res.redirect('/login'); }
288289

289-
Script.findOne({
290-
installName: installName
291-
+ (type === 'libs' ? '.js' : '.user.js')
292-
}, function(err, script) {
293-
var content = req.body['comment-content'];
290+
Script.findOne({ installName: scriptStorage.caseInsensitive(installName
291+
+ (type === 'libs' ? '.js' : '.user.js')) }, function (err, script) {
292+
var content = req.body['comment-content'];
294293

295294
if (err || !script) { return next(); }
296295

@@ -318,11 +317,10 @@ exports.changeStatus = function(req, res, next) {
318317

319318
if (!user) { return res.redirect('/login'); }
320319

321-
Script.findOne({
322-
installName: installName
323-
+ (type === 'libs' ? '.js' : '.user.js')
324-
}, function(err, script) {
320+
Script.findOne({ installName: scriptStorage.caseInsensitive(installName
321+
+ (type === 'libs' ? '.js' : '.user.js')) }, function (err, script) {
325322

323+
if (err || !script) { return next(); }
326324
if (err || !script) { return next(); }
327325

328326
discussionLib.findDiscussion(category, topic, function(issue) {

controllers/script.js

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ exports.lib = function(controller) {
2626
};
2727

2828
// Display which scripts use a library hosted on the site
29-
exports.useLib = function(req, res, next) {
30-
var installName = req.route.params.shift().toLowerCase() + '/'
29+
/*exports.useLib = function (req, res, next) {
30+
var installName = req.route.params.shift() + '/'
3131
+ req.route.params.shift();
3232
var user = req.session.user;
3333
var options = { username: user ? user.name : '' };
@@ -44,7 +44,7 @@ exports.useLib = function(req, res, next) {
4444
res.render('group', options);
4545
});
4646
});
47-
};
47+
};*/
4848

4949
var getScriptPageTasks = function(options) {
5050
var tasks = [];
@@ -56,7 +56,8 @@ var getScriptPageTasks = function(options) {
5656
//--- Tasks
5757

5858
// Show the number of open issues
59-
var scriptOpenIssueCountQuery = Discussion.find({ category: script.issuesCategorySlug, open: { $ne: false } });
59+
var scriptOpenIssueCountQuery = Discussion.find({ category: scriptStorage
60+
.caseInsensitive(script.issuesCategorySlug), open: {$ne: false} });
6061
tasks.push(countTask(scriptOpenIssueCountQuery, options, 'issueCount'));
6162

6263
// Show collaborators of the script
@@ -270,7 +271,8 @@ exports.view = function(req, res, next) {
270271
var isLib = req.route.params.isLib;
271272

272273
Script.findOne({
273-
installName: installNameSlug + (isLib ? '.js' : '.user.js')
274+
installName: scriptStorage
275+
.caseInsensitive(installNameSlug + (isLib ? '.js' : '.user.js'))
274276
}, function(err, scriptData) {
275277
if (err || !scriptData) { return next(); }
276278

@@ -332,7 +334,8 @@ exports.edit = function(req, res, next) {
332334
var isLib = req.route.params.isLib;
333335

334336
Script.findOne({
335-
installName: installNameSlug + (isLib ? '.js' : '.user.js')
337+
installName: scriptStorage
338+
.caseInsensitive(installNameSlug + (isLib ? '.js' : '.user.js'))
336339
}, function(err, scriptData) {
337340
if (err || !scriptData) { return next(); }
338341

@@ -446,7 +449,7 @@ exports.vote = function(req, res, next) {
446449
return res.redirect(url);
447450
}
448451

449-
Script.findOne({ installName: installName },
452+
Script.findOne({ installName: scriptStorage.caseInsensitive(installName) },
450453
function(err, script) {
451454
if (err || !script) { return res.redirect(url); }
452455

@@ -510,7 +513,8 @@ exports.flag = function(req, res, next) {
510513
var installName = scriptStorage.getInstallName(req);
511514
var unflag = req.route.params.unflag;
512515

513-
Script.findOne({ installName: installName + (isLib ? '.js' : '.user.js') },
516+
Script.findOne({ installName: scriptStorage
517+
.caseInsensitive(installName + (isLib ? '.js' : '.user.js')) },
514518
function(err, script) {
515519
var fn = flagLib[unflag && unflag === 'unflag' ? 'unflag' : 'flag'];
516520
if (err || !script) { return next(); }

0 commit comments

Comments
 (0)