diff options
| -rw-r--r-- | bower.json | 3 | ||||
| -rw-r--r-- | server/index.js | 6 | ||||
| -rw-r--r-- | server/lib/middleware.js | 2 | ||||
| -rw-r--r-- | server/lib/util.js | 1 | ||||
| -rw-r--r-- | server/lib/views/index.js (renamed from server/lib/views.js) | 28 | ||||
| -rw-r--r-- | server/lib/views/staff.js | 246 | ||||
| -rw-r--r-- | views/staff.ejs | 26 | ||||
| -rw-r--r-- | views/staff/_footer.ejs | 8 | ||||
| -rw-r--r-- | views/staff/_header.ejs | 12 | ||||
| -rw-r--r-- | views/staff/index.ejs | 10 | ||||
| -rw-r--r-- | views/staff/projects/index.ejs | 4 | ||||
| -rw-r--r-- | views/staff/projects/show.ejs | 2 | ||||
| -rw-r--r-- | views/staff/projects/show_404.ejs | 4 | ||||
| -rw-r--r-- | views/staff/users/index.ejs | 4 | ||||
| -rw-r--r-- | views/staff/users/show.ejs | 4 | ||||
| -rw-r--r-- | views/staff/users/show_404.ejs | 4 |
16 files changed, 313 insertions, 51 deletions
@@ -6,6 +6,7 @@ "jquery": "1.11.0", "momentjs": "~2.5.1", "lodash": "", - "fiber": "" + "fiber": "", + "jquery-jsonview": "1.2.0" } } diff --git a/server/index.js b/server/index.js index e946788..e80ddf2 100644 --- a/server/index.js +++ b/server/index.js @@ -97,7 +97,7 @@ site.route = function () { app.get('/profile', views.profile) app.get('/profile/edit', views.profile) - app.get('/profile/:name', views.profile) + app.get('/profile/:username', views.profile) app.get('/about', views.docs); app.get('/about/:name/edit', views.docs); @@ -106,9 +106,6 @@ site.route = function () { app.get('/api/profile', middleware.ensureAuthenticated, api.profile.show) app.put('/api/profile', middleware.ensureAuthenticated, api.profile.update) - app.get('/staff', middleware.ensureAuthenticated, middleware.ensureIsStaff, views.staff.index); - app.get('/staff/bless', middleware.ensureAuthenticated, views.staff.bless); - app.get('/api/docs', middleware.ensureAuthenticated, middleware.ensureIsStaff, api.docs.show) app.post('/api/docs/new', middleware.ensureAuthenticated, middleware.ensureIsStaff, api.docs.create) app.post('/api/docs/edit', middleware.ensureAuthenticated, middleware.ensureIsStaff, api.docs.update) @@ -148,6 +145,7 @@ site.route = function () { app.get('/test/*', middleware.ensureAuthenticated, middleware.ensureIsStaff, views.modal) + views.staff.route(app) } diff --git a/server/lib/middleware.js b/server/lib/middleware.js index 9d6236a..9790f8f 100644 --- a/server/lib/middleware.js +++ b/server/lib/middleware.js @@ -89,7 +89,7 @@ var middleware = { }) } }, - + } module.exports = middleware diff --git a/server/lib/util.js b/server/lib/util.js index 87e2d54..6d43750 100644 --- a/server/lib/util.js +++ b/server/lib/util.js @@ -46,6 +46,7 @@ util.ip2num = function(dot) { } util.num2ip = function(num) { + if (! num) return "" var d = num % 256; for (var i = 3; i > 0; i--) { num = Math.floor(num/256); diff --git a/server/lib/views.js b/server/lib/views/index.js index b3c1d18..99be956 100644 --- a/server/lib/views.js +++ b/server/lib/views/index.js @@ -1,12 +1,12 @@ /* jshint node: true */ -var User = require('./schemas/User'), - Project = require('./schemas/Project'), - Documentation = require('./schemas/Documentation'), - Collaborator = require('./schemas/Collaborator'), - config = require('../../config'), +var User = require('../schemas/User'), + Project = require('../schemas/Project'), + Documentation = require('../schemas/Documentation'), + Collaborator = require('../schemas/Collaborator'), + config = require('../../../config'), marked = require('marked'), - util = require('./util'), + util = require('../util'), _ = require('lodash'), moment = require('moment'); @@ -20,6 +20,8 @@ marked.setOptions({ var views = {} +views.staff = require('./staff') + views.editor_new = function (req, res) { if (! req.user) { res.redirect('/') @@ -115,7 +117,7 @@ views.docs = function (req, res){ } views.profile = function (req, res) { - var username = req.params[0] || (req.user && req.user.username) + var username = req.params.username || (req.user && req.user.username) if (username) { User.findOne({ username: username }, function (err, user) { user ? next(user) : done(err, {}, []) @@ -149,16 +151,4 @@ views.profile = function (req, res) { } } -views.staff = { - index: function(req, res){ - res.render('staff') - }, - bless: function(req, res){ - req.user.isStaff = true - req.user.save(function(){ - res.redirect("/staff") - }) - }, -} - module.exports = views diff --git a/server/lib/views/staff.js b/server/lib/views/staff.js new file mode 100644 index 0000000..5dde58d --- /dev/null +++ b/server/lib/views/staff.js @@ -0,0 +1,246 @@ +/* jshint node: true */ + +var User = require('../schemas/User'), + Project = require('../schemas/Project'), + Media = require('../schemas/Media'), + Collaborator = require('../schemas/Collaborator'), + config = require('../../../config'), + middleware = require('../middleware'), + util = require('../util'), + _ = require('lodash'), + moment = require('moment'); + + +var staff = module.exports = { + + fields: { + user: "_id username displayName created_at updated_at created_ip last_ip", + project: "_id name slug created_at updated_at", + }, + + defaults: { + user: { + _id: "", username: "", displayName: "", + created_at: "", updated_at: "", created_ip: "", last_ip: "", + }, + }, + + middleware: { + + ensureUsers: function(req, res, next){ + var offset = Number(req.params.offset) || 0 + var sort + switch (req.params.sort) { + case 'date': + sort = {'date': -1} + break + default: + sort = {'username': 1} + break + } + User.find({}) + .select(staff.fields.user) + .sort(sort) + .skip(offset) + .limit(50) + .exec(function (err, users) { + res.locals.users = users.map(staff.helpers.user) + next() + }) + }, + + ensureProfile: function(req, res, next){ + var username = req.params.username + if (username) { + User.findOne({ username: username }, function (err, user) { + if (user) { + res.locals.profile = staff.helpers.user(user) + } + else { + res.locals.profile = null + } + next() + }) + } + else { + res.locals.profile = null + next() + } + }, + + ensureUsersCount: function(req, res, next){ + if (! res.locals.profile) { return next() } + User.count({}, function(err, count){ + res.locals.userCount = count || 0 + next() + }) + }, + + ensureProjectsCount: function(req, res, next){ + if (! res.locals.profile) { return next() } + Project.count({}, function(err, count){ + res.locals.projectCount = count || 0 + next() + }) + }, + + ensureProfileProjectCount: function(req, res, next){ + if (! res.locals.profile) { return next() } + Project.count({ user_id: res.locals.profile._id}, function(err, count){ + res.locals.profile.projectCount = count || 0 + next() + }) + }, + + ensureProfileMediaCount: function(req, res, next){ + if (! res.locals.profile) { return next() } + Media.count({ user_id: res.locals.profile._id}, function(err, count){ + res.locals.profile.mediaCount = count || 0 + next() + }) + }, + + ensureProfileProjects: function(req, res, next){ + if (! res.locals.profile) { return next() } + Project.find({ user_id: res.locals.profile._id }, staff.fields.project, function(err, projects){ + res.locals.projects = projects.map(staff.helpers.project) + next() + }) + }, + + ensureProject: function(req, res, next){ + res.locals.project = req.project + next() + }, + + ensureProjectUser: function(req, res, next){ + if (! res.locals.project) { return next() } + User.findOne({ user_id: res.locals.project.user_id }, staff.fields.user, function(err, user){ + res.locals.project.user = user || staff.defaults.user + next() + }) + }, + + ensureProjectCollaborators: function(req, res, next){ + if (! res.locals.project) { + res.locals.collaborators = [] + return next() + } + Collaborator.find({ project_id: res.locals.project._id}, function(err, collaborators){ + res.locals.collaborators = collaborators || [] + next() + }) + }, + }, + + helpers: { + user: function(user){ + user = user.toObject() + user.created_ip = util.num2ip( user.created_ip ) + user.last_ip = util.num2ip( user.last_ip ) + return user + }, + + project: function(project){ + project = project.toObject() + return project + } + }, + + route: function(app){ + app.get('/staff', + middleware.ensureAuthenticated, + middleware.ensureIsStaff, + + staff.middleware.ensureUsersCount, + staff.middleware.ensureProjectsCount, + + staff.index + ); + app.get('/staff/users', + middleware.ensureAuthenticated, + middleware.ensureIsStaff, + + staff.middleware.ensureUsersCount, + staff.middleware.ensureUsers, + + staff.users.index + ); + app.get('/staff/users/:username', + middleware.ensureAuthenticated, + middleware.ensureIsStaff, + + staff.middleware.ensureProfile, + staff.middleware.ensureProfileProjectCount, + staff.middleware.ensureProfileMediaCount, + staff.middleware.ensureProfileProjects, + + staff.users.show + ); + app.get('/staff/projects', + middleware.ensureAuthenticated, + middleware.ensureIsStaff, + + staff.projects.index + ); + app.get('/staff/projects/:name', + middleware.ensureAuthenticated, + middleware.ensureIsStaff, + + middleware.ensureProject, + staff.middleware.ensureProject, + staff.middleware.ensureProjectUser, + staff.middleware.ensureProjectCollaborators, + + staff.projects.show + ); +// app.post('/staff/bless', +// middleware.ensureAuthenticated, +// views.staff.bless +// ); + }, + + index: function(req, res){ + res.render('staff/index') + }, + + bless: function(req, res){ + req.user.isStaff = true + req.user.save(function(){ + res.redirect("/staff") + }) + }, + + // /staff/users/ + // /staff/users/:username + users: { + index: function(req, res){ + res.render('staff/users/index') + }, + show: function(req, res){ + if (res.locals.profile) { + res.render('staff/users/show') + } + else { + res.render('staff/users/show_404') + } + }, + }, + + // /staff/projects/ + // /staff/projects/:name + projects: { + index: function(req, res){ + res.render('staff/projects/index') + }, + show: function(req, res){ + if (res.locals.project) { + res.render('staff/projects/show') + } + else { + res.render('staff/projects/show_404') + } + }, + }, + +}
\ No newline at end of file diff --git a/views/staff.ejs b/views/staff.ejs deleted file mode 100644 index 0db8ebc..0000000 --- a/views/staff.ejs +++ /dev/null @@ -1,26 +0,0 @@ -<!doctype html> -<html> -<head> - <title>vvalls</title> - [[ include partials/meta ]] -</head> -<body class="loading"> -<div class="rapper page"> - [[ include partials/header ]] - - <br clear="all"> - <h1>Staff Area</h1> - <!-- - - recent users - - rooms list - - projects list - --> - - [[ include partials/confirm-modal ]] - [[ include partials/footer ]] -</div> - - -</body> -[[ include partials/scripts ]] -</html> diff --git a/views/staff/_footer.ejs b/views/staff/_footer.ejs new file mode 100644 index 0000000..580828f --- /dev/null +++ b/views/staff/_footer.ejs @@ -0,0 +1,8 @@ + [[ include ../partials/confirm-modal ]] + [[ include ../partials/footer ]] +</div> + +</body> +[[ include ../partials/scripts ]] +<script type="text/javascript" src="/assets/javascripts/vendor/bower_components/jquery-jsonview/dist/jquery.jsonview.js"></script> +</html> diff --git a/views/staff/_header.ejs b/views/staff/_header.ejs new file mode 100644 index 0000000..9311948 --- /dev/null +++ b/views/staff/_header.ejs @@ -0,0 +1,12 @@ +<!doctype html> +<html> +<head> + <title>vvalls | staff</title> + [[ include ../partials/meta ]] + <link rel="stylesheet" href="/assets/javascripts/vendor/bower_components/jquery-jsonview/dist/jquery.jsonview.css"></script> +</head> +<body class="loading"> +<div class="rapper page"> + [[ include ../partials/header ]] + + <br clear="all"> diff --git a/views/staff/index.ejs b/views/staff/index.ejs new file mode 100644 index 0000000..fbe67a7 --- /dev/null +++ b/views/staff/index.ejs @@ -0,0 +1,10 @@ +[[ include _header ]] + + <h1>Staff Area</h1> + <!-- + - recent users + - rooms list + - projects list + --> + +[[ include _footer ]]
\ No newline at end of file diff --git a/views/staff/projects/index.ejs b/views/staff/projects/index.ejs new file mode 100644 index 0000000..a27a132 --- /dev/null +++ b/views/staff/projects/index.ejs @@ -0,0 +1,4 @@ +[[ include ../_header ]] + <h1>Projects</h1> + +[[ include ../_footer ]] diff --git a/views/staff/projects/show.ejs b/views/staff/projects/show.ejs new file mode 100644 index 0000000..01b5c76 --- /dev/null +++ b/views/staff/projects/show.ejs @@ -0,0 +1,2 @@ +[[ include ../_header ]] +[[ include ../_footer ]] diff --git a/views/staff/projects/show_404.ejs b/views/staff/projects/show_404.ejs new file mode 100644 index 0000000..e0cf0e2 --- /dev/null +++ b/views/staff/projects/show_404.ejs @@ -0,0 +1,4 @@ +[[ include ../_header ]] + <h1>Project not found</h1> + +[[ include ../_footer ]] diff --git a/views/staff/users/index.ejs b/views/staff/users/index.ejs new file mode 100644 index 0000000..62c0ae2 --- /dev/null +++ b/views/staff/users/index.ejs @@ -0,0 +1,4 @@ +[[ include ../_header ]] + <h1>Users</h1> + +[[ include ../_footer ]] diff --git a/views/staff/users/show.ejs b/views/staff/users/show.ejs new file mode 100644 index 0000000..b5e1a6c --- /dev/null +++ b/views/staff/users/show.ejs @@ -0,0 +1,4 @@ +[[ include ../_header ]] + <h1>User: [[ profile.username ]]</h1> + +[[ include ../_footer ]] diff --git a/views/staff/users/show_404.ejs b/views/staff/users/show_404.ejs new file mode 100644 index 0000000..c52e1e7 --- /dev/null +++ b/views/staff/users/show_404.ejs @@ -0,0 +1,4 @@ +[[ include ../_header ]] + <h1>User not found</h1> + +[[ include ../_footer ]] |
