Skip to content

Commit

Permalink
Merge pull request #770 from Martii/Issue-643
Browse files Browse the repository at this point in the history
Issue 643

Auto-merge
  • Loading branch information
Martii committed Oct 18, 2015
2 parents 349f8d0 + 15c7c54 commit 89e2321
Show file tree
Hide file tree
Showing 14 changed files with 298 additions and 24 deletions.
10 changes: 8 additions & 2 deletions controllers/_template.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,19 @@ var isDev = require('../libs/debug').isDev;
var isDbg = require('../libs/debug').isDbg;

//

//--- Dependency inclusions
var async = require('async');
var _ = require('underscore');
var pageMetadata = require('../libs/templateHelpers').pageMetadata;

//--- Models
//--- Model inclusions
var Group = require('../models/group').Group;

//--- Library inclusions
var pageMetadata = require('../libs/templateHelpers').pageMetadata;

//--- Configuration inclusions

//--- Local

// Parse a mongoose model and add generated fields (eg: urls, formatted dates)
Expand Down
69 changes: 69 additions & 0 deletions controllers/flag.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
'use strict';

// Define some pseudo module globals
var isPro = require('../libs/debug').isPro;
var isDev = require('../libs/debug').isDev;
var isDbg = require('../libs/debug').isDbg;

//

//--- Dependency inclusions
var async = require('async');

//--- Model inclusions
var Flag = require('../models/flag').Flag;
var User = require('../models/user').User;

//--- Library inclusions
var flagLib = require('../libs/flag');

//--- Configuration inclusions

//---
exports.getFlaggedListForContent = function (aModelName, aOptions, aCallback) {

var content = aModelName.toLowerCase();
var contentList = aOptions[content + 'List'] || [aOptions[content]];

async.forEachOf(contentList, function (aContent, aContentKey, aEachOuterCallback) {

// NOTE: Directly use indexed parent identifier allowing set of the dynamic, virtual, field
// So basically do not use `aContent` anywhere in this function

// Always ensure a snapshot copy!
if (contentList[aContentKey].toObject) {
contentList[aContentKey] = contentList[aContentKey].toObject({
virtuals: true
});
}

// Ensure reset
contentList[aContentKey].flaggedList = [];

// Find any flags
Flag.find({
model: aModelName,
_contentId: contentList[aContentKey]._id

}, function (aErr, aFlagList) {
if (aErr || !aFlagList || aFlagList.length === 0) {
aEachOuterCallback();
return;
}

aOptions.hasFlagged = true;

async.forEachOfSeries(aFlagList, function (aFlag, aFlagKey, aEachInnerCallback) {
User.findOne({ _id: aFlag._userId }, function (aErr, aUser) {
contentList[aContentKey].flaggedList.push({
name: aUser.name,
reason: aFlagList[aFlagKey].reason,
since: aFlagList[aFlagKey]._since
});
aEachInnerCallback();
});
}, aEachOuterCallback);
});

}, aCallback);
}
22 changes: 20 additions & 2 deletions controllers/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ var Strategy = require('../models/strategy').Strategy;

var strategies = require('./strategies.json');
var discussionLib = require('./discussion');
var getFlaggedListForContent = require('./flag').getFlaggedListForContent;
var modelParser = require('../libs/modelParser');
var modelQuery = require('../libs/modelQuery');
var execQueryTask = require('../libs/tasks').execQueryTask;
Expand Down Expand Up @@ -147,8 +148,25 @@ exports.home = function (aReq, aRes) {
}
}
}
function render() { aRes.render('pages/scriptListPage', options); }
function asyncComplete() { preRender(); render(); }
function render() {
aRes.render('pages/scriptListPage', options);
}
function asyncComplete() {

async.parallel([
function (aCallback) {
if (!options.isFlagged || !options.isAdmin) { // NOTE: Watchpoint
aCallback();
return;
}
getFlaggedListForContent('Script', options, aCallback);
}
], function (aErr) {
preRender();
render();
});

}
async.parallel(tasks, asyncComplete);
};

Expand Down
23 changes: 21 additions & 2 deletions controllers/script.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ var Group = require('../models/group').Group;
var Script = require('../models/script').Script;
var Vote = require('../models/vote').Vote;


var scriptStorage = require('./scriptStorage');
var addScriptToGroups = require('./group').addScriptToGroups;
var getFlaggedListForContent = require('./flag').getFlaggedListForContent;
var flagLib = require('../libs/flag');
var removeLib = require('../libs/remove');
var modelQuery = require('../libs/modelQuery');
Expand Down Expand Up @@ -319,8 +321,25 @@ exports.view = function (aReq, aRes, aNext) {
script.description, _.pluck(script.groups, 'name'));
}
}
function render() { aRes.render('pages/scriptPage', options); }
function asyncComplete() { preRender(); render(); }
function render() {
aRes.render('pages/scriptPage', options);
}
function asyncComplete() {

async.parallel([
function (aCallback) {
if (!options.isAdmin) { // NOTE: Watchpoint
aCallback();
return;
}
getFlaggedListForContent('Script', options, aCallback);
}
], function (aErr) {
preRender();
render();
});

}

//---
if (aErr || !aScriptData) {
Expand Down
78 changes: 69 additions & 9 deletions controllers/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,11 @@ var Strategy = require('../models/strategy').Strategy;
var User = require('../models/user').User;
var Discussion = require('../models/discussion').Discussion;

// TODO: Possible unneccessary directory traversal
var categories = require('../controllers/discussion').categories;

var getFlaggedListForContent = require('./flag').getFlaggedListForContent;

var userRoles = require('../models/userRoles.json');
var scriptStorage = require('./scriptStorage');
var modelParser = require('../libs/modelParser');
Expand Down Expand Up @@ -234,8 +237,29 @@ exports.userListPage = function (aReq, aRes, aNext) {
pageMetadata(options, ['Flagged Users', 'Moderation']);
}
}
function render() { aRes.render('pages/userListPage', options); }
function asyncComplete(err) { if (err) { return aNext(); } else { preRender(); render(); } }
function render() {
aRes.render('pages/userListPage', options);
}
function asyncComplete(aErr) {
if (aErr) {
aNext();
return;
}

async.parallel([
function (aCallback) {
if (!options.isFlagged || !options.isAdmin) { // NOTE: Watchpoint
aCallback();
return;
}
getFlaggedListForContent('User', options, aCallback);
}
], function (aErr) {
preRender();
render();
});

}
async.parallel(tasks, asyncComplete);
};

Expand Down Expand Up @@ -292,9 +316,27 @@ exports.view = function (aReq, aRes, aNext) {
tasks = tasks.concat(stats.getSummaryTasks(options));

//---
function preRender() { }
function render() { aRes.render('pages/userPage', options); }
function asyncComplete() { preRender(); render(); }
function preRender() {
}
function render() {
aRes.render('pages/userPage', options);
}
function asyncComplete() {

async.parallel([
function (aCallback) {
if (!options.isAdmin) { // NOTE: Watchpoint
aCallback();
return;
}
getFlaggedListForContent('User', options, aCallback);
}
], function (aErr) {
preRender();
render();
});

}
async.parallel(tasks, asyncComplete);
});
};
Expand Down Expand Up @@ -410,13 +452,14 @@ exports.userCommentListPage = function (aReq, aRes, aNext) {

exports.userScriptListPage = function (aReq, aRes, aNext) {
var authedUser = aReq.session.user;

var username = aReq.params.username;

User.findOne({
name: caseInsensitive(username)
}, function (aErr, aUserData) {
if (aErr || !aUserData) { return aNext(); }
if (aErr || !aUserData) {
return aNext();
}

//
var options = {};
Expand Down Expand Up @@ -497,8 +540,25 @@ exports.userScriptListPage = function (aReq, aRes, aNext) {
options.scriptListIsEmptyMessage = 'This user hasn\'t added any scripts yet.';
}
}
function render() { aRes.render('pages/userScriptListPage', options); }
function asyncComplete() { preRender(); render(); }
function render() {
aRes.render('pages/userScriptListPage', options);
}
function asyncComplete() {

async.parallel([
function (aCallback) {
if (!options.isFlagged || !options.isAdmin) { // NOTE: Watchpoint
aCallback();
return;
}
getFlaggedListForContent('Script', options, aCallback);
}
], function (aErr) {
preRender();
render();
});

}
async.parallel(tasks, asyncComplete);
});
};
Expand Down
19 changes: 19 additions & 0 deletions controllers/vote.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
'use strict';

// Define some pseudo module globals
var isPro = require('../libs/debug').isPro;
var isDev = require('../libs/debug').isDev;
var isDbg = require('../libs/debug').isDbg;

//

//--- Dependency inclusions

//--- Model inclusions

//--- Library inclusions
var voteLib = require('../libs/vote');

//--- Configuration inclusions

//---
13 changes: 7 additions & 6 deletions libs/modelParser.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,12 @@ moment.locale('en-tiny', {
});

var parseDateProperty = function (aObj, aKey) {
var date = aObj[aKey];
if (date) {
aObj[aKey + 'ISOFormat'] = date.toISOString();
aObj[aKey + 'Humanized'] = moment(date).locale('en-tiny').calendar();
if (aObj[aKey]) {
var date = new Date(aObj[aKey]);
if (date) {
aObj[aKey + 'ISOFormat'] = date.toISOString();
aObj[aKey + 'Humanized'] = moment(date).locale('en-tiny').calendar();
}
}
};

Expand Down Expand Up @@ -243,10 +245,9 @@ var parseUser = function (aUserData) {
if (!aUserData) {
return;
}
// var user = aUserData.toObject ? aUserData.toObject() : aUserData;

// Intermediates
var user = aUserData;
var user = aUserData.toObject ? aUserData.toObject({ virtuals: true }) : aUserData;

// Role
user.isMod = user.role < 4;
Expand Down
8 changes: 8 additions & 0 deletions libs/vote.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
'use strict';

// Define some pseudo module globals
var isPro = require('../libs/debug').isPro;
var isDev = require('../libs/debug').isDev;
var isDbg = require('../libs/debug').isDbg;

//
5 changes: 5 additions & 0 deletions models/flag.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,15 @@ var Schema = mongoose.Schema;

var flagSchema = new Schema({
model: String,
reason: String,
_contentId: Schema.Types.ObjectId,
_userId: Schema.Types.ObjectId
});

flagSchema.virtual('_since').get(function () {
return this._id.getTimestamp();
});

var Flag = mongoose.model('Flag', flagSchema);

exports.Flag = Flag;
5 changes: 5 additions & 0 deletions public/css/common.css
Original file line number Diff line number Diff line change
Expand Up @@ -302,3 +302,8 @@ a.panel-heading {
.reason-automated {
opacity: 0.25;
}

ul.flaggedList {
list-style-type: none;
padding-left: 0;
}
17 changes: 17 additions & 0 deletions views/includes/scriptAdminToolsPanel.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,23 @@
</div>
</div>
<div class="panel-body">
{{#hasFlagged}}
<div class="form-horizontal">
<div class="form-group">
<label class="col-sm-4 control-label">Flagged</label>
<div class="col-sm-8">
<ul class="flaggedList">
{{#script.flaggedList}}
<li>
{{#name}}<span class="label label-info"><a href="/users/{{name}}">{{name}}</a></span>{{/name}}
<span title="{{since}}">{{#reason}}{{reason}}{{/reason}}{{^reason}}&hellip;{{/reason}}</span>
</li>
{{/script.flaggedList}}
</ul>
</div>
</div>
</div>
{{/hasFlagged}}
<a rel="nofollow" href="/admin/json?model=Script&id={{{script._id}}}" class="btn btn-link col-xs-12"><i class="fa fa-database"></i> Raw JSON Data</a>
</div>
</div>
Expand Down
Loading

0 comments on commit 89e2321

Please sign in to comment.