/* 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 photo created_at updated_at last_seen created_ip last_ip", project: "_id name slug user_id privacy created_at updated_at", }, defaults: { user: { _id: "", username: "", displayName: "", created_at: "", updated_at: "", created_ip: "", last_ip: "", }, }, middleware: { ensureUsers: function(req, res, next){ var limit = Math.max( Number(req.params.limit) || 50, 200 ) var offset = Number(req.params.offset) || 0 var sort switch (req.params.sort) { case 'date': sort = {'created_at': -1} break case 'last_seen': sort = {'last_seen': -1} break case 'username': default: sort = {'username': 1} break } User.find({}) .select(staff.fields.user) .sort(sort) .skip(offset) .limit(limit) .exec(function (err, users) { res.locals.users = users.map(staff.helpers.user) next() }) }, ensureRecentUsers: function(req, res, next){ var dreq = { params: { sort: 'last_seen', limit: 20, offset: 0 } } staff.middleware.ensureUsers(dreq, res, next) }, ensureProjects: function(req, res, next){ var offset = Number(req.params.offset) || 0 var sort switch (req.params.sort) { case 'date': sort = {'created_at': -1} break default: sort = {'slug': 1} break } Project.find({}) .select(staff.fields.project) .sort(sort) .skip(offset) .limit(50) .exec(function (err, projects) { res.locals.projects = projects.map(staff.helpers.project) next() }) }, ensureRecentProjects: function(req, res, next){ var dreq = { params: { sort: 'created_at', limit: 20, offset: 0 } } staff.middleware.ensureProjects(dreq, res, next) }, ensureProjectsUsers: function(req, res, next){ if (! res.locals.projects || ! res.locals.projects.length) { return next() } var dedupe = {}, user_ids res.locals.projects.forEach(function(project){ dedupe[ project.user_id ] = dedupe[ project.user_id ] || [] dedupe[ project.user_id ].push(project) }) user_ids = _.keys(dedupe) User.find({ _id: user_ids }) .select(staff.fields.user) .exec(function (err, users) { users.forEach(function(user){ dedupe[user._id].forEach(function(project){ project.user = 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){ User.count({}, function(err, count){ res.locals.userCount = count || 0 next() }) }, ensureProjectsCount: function(req, res, 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({ _id: res.locals.project.user_id }, staff.fields.user, function(err, user){ res.locals.projectUser = staff.helpers.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.last_seen = moment( user.last_seen || user.updated_at || user.created_at ).fromNow() user.created_ip = util.num2ip( user.created_ip ) user.last_ip = util.num2ip( user.last_ip ) return user }, project: function(project){ project = project.toObject() project.date = moment( project.updated_at || project.created_at ).format("M/DD/YYYY H:MM") project.user = {} return project } }, route: function(app){ app.get('/staff', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensureRecentUsers, 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.middleware.ensureProjectsCount, staff.middleware.ensureProjects, staff.middleware.ensureProjectsUsers, staff.projects.index ); app.get('/staff/projects/:slug', middleware.ensureAuthenticated, middleware.ensureIsStaff, middleware.ensureProject, staff.middleware.ensureProject, staff.middleware.ensureProjectUser, staff.middleware.ensureProjectCollaborators, staff.projects.show ); app.put('/staff/users/:username/bless', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.users.bless ); }, index: function(req, res){ res.render('staff/index') }, // /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', { profileJSON: util.escape( JSON.stringify( res.locals.profile ) ) }) } else { res.render('staff/users/show_404') } }, bless: function(req, res){ res.locals.profile.isStaff = req.body.isStaff res.locals.profile.save(function(){ res.redirect("/staff") }) }, }, // /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', { projectJSON: util.escape( JSON.stringify( res.locals.project ) ), projectUserJSON: util.escape( JSON.stringify( res.locals.projectUser ) ), collaboratorsJSON: util.escape( JSON.stringify( res.locals.collaborators ) ) }) } else { res.render('staff/projects/show_404') } }, }, }