var User = require('../../schemas/User'), Project = require('../../schemas/Project'), Media = require('../../schemas/Media'), Collaborator = require('../../schemas/Collaborator'), Plan = require('../../schemas/Plan'), Subscription = require('../../schemas/Subscription'), Layout = require('../../schemas/Layout'), util = require('../../util'), fields = require('./fields'), helpers = require('./helpers'), defaults = require('./defaults'), _ = require('lodash'), moment = require('moment'); var middleware = module.exports = { ensureUsers: function(req, res, next){ var paginationInfo = res.locals.pagination = {} var criteria = req.criteria || {} var limit = paginationInfo.limit = Math.min( Number(req.query.limit) || 50, 200 ) var offset = paginationInfo.offset = Number(req.query.offset) || 0 var initial = util.sanitize(req.query.initial) var sort paginationInfo.sort = req.query.sort paginationInfo.sortOptions = ["date", "last_seen", "username"] switch (req.query.sort) { case 'date': sort = {'created_at': -1} break case 'last_seen': sort = {'last_seen': -1} break case 'username': default: sort = {'username': 1} paginationInfo.sort = "username" break } if (initial) { if (initial == "?") { criteria.username = new RegExp('^[^a-zA-Z]', "i") } else { criteria.username = new RegExp('^' + initial, "i") } } User.find(criteria) .select(fields.user) .sort(sort) .skip(offset) .limit(limit) .exec(function (err, users) { res.locals.users = users.map(helpers.user) if (! res.locals.users.length) { if (initial) { res.locals.opt.error = "No users found starting with " + initial.toUpperCase() + "" } else { res.locals.opt.error = "No users found" } } next() }) }, ensureRecentUsers: function(req, res, next){ var dreq = { query: { sort: 'last_seen', limit: 20, offset: 0 } } middleware.ensureUsers(dreq, res, next) }, ensureProjects: function(req, res, next){ var paginationInfo = res.locals.pagination = {} var criteria = req.criteria || {} var limit = paginationInfo.limit = Math.min( Number(req.query.limit) || 50, 200 ) var offset = paginationInfo.offset = Number(req.query.offset) || 0 var sort paginationInfo.sort = req.query.sort paginationInfo.sortOptions = ["date", "name"] switch (req.query.sort) { default: case 'date': sort = {'updated_at': -1} break case 'name': paginationInfo.sort = "name" sort = {'slug': 1} break } Project.find(criteria) .select(fields.project) .sort(sort) .skip(offset) .limit(limit) .exec(function (err, projects) { res.locals.projects = projects.map(helpers.project) next() }) }, ensureLayouts: function(req, res, next){ var paginationInfo = res.locals.pagination = {} var criteria = req.criteria || {} var limit = paginationInfo.limit = Math.min( Number(req.query.limit) || 50, 200 ) var offset = paginationInfo.offset = Number(req.query.offset) || 0 var sort paginationInfo.sort = req.query.sort paginationInfo.sortOptions = ["date", "name"] switch (req.query.sort) { default: case 'date': sort = {'updated_at': -1} break case 'name': paginationInfo.sort = "name" sort = {'slug': 1} break } Layout.find(criteria) .select(fields.layout) .sort(sort) .skip(offset) .limit(limit) .exec(function (err, layouts) { res.locals.layouts = layouts.map(helpers.layout) next() }) }, ensureMedia: function(req, res, next){ var paginationInfo = res.locals.pagination = {} var criteria = req.criteria || {} var limit = paginationInfo.limit = Math.min( Number(req.query.limit) || 50, 200 ) var offset = paginationInfo.offset = Number(req.query.offset) || 0 var sort paginationInfo.sort = req.query.sort paginationInfo.sortOptions = ["date"] switch (req.query.sort) { default: case 'date': paginationInfo.sort = "date" sort = {'created_at': -1} break } Media.find(criteria) // .select(fields.media) .sort(sort) .skip(offset) .limit(limit) .exec(function (err, media) { res.locals.media = media.map(helpers.media) next() }) }, ensureSubscriptions: function(req, res, next){ var paginationInfo = res.locals.pagination = {} var criteria = req.criteria || {} var limit = paginationInfo.limit = Math.min( Number(req.query.limit) || 50, 200 ) var offset = paginationInfo.offset = Number(req.query.offset) || 0 var sort paginationInfo.sort = req.query.sort paginationInfo.sortOptions = ["date", "name"] switch (req.query.sort) { case 'created': sort = {'created_at': -1} break default: case 'date': sort = {'updated_at': -1} break } Subscription.find(criteria) .select(fields.project) .sort(sort) .skip(offset) .limit(limit) .exec(function (err, subscriptions) { res.locals.subscriptions = subscriptions.map(helpers.subscription) next() }) }, ensurePlans: function(req, res, next){ Plan.find({}).sort({ 'level': -1 }).exec(function (err, plans) { res.locals.plans = (plans || []).map(helpers.plan) res.locals.plans.sort(function(a,b){ return a.monthly_price }) next() }) }, ensurePlan: function (req, res, next) { if (req.params.slug) { Plan.findOne({ slug: req.params.slug }, function(err, plan){ if (err || ! plan) { console.error(err) res.redirect("/staff/plans/") } else { req.plan = plan next() } }) } else { res.redirect("/staff/plans/") } }, ensureSubscription: function (req, res, next) { if (req.params.id) { Subscription.findOne({ _id: req.params.id }, function(err, subscription){ if (err || ! subscription) { console.error(err) res.redirect("/staff/subscriptions/") } else { req.subscription = subscription next() } }) } else { res.redirect("/staff/subscriptions/") } }, ensureRecentProjects: function(req, res, next){ var dreq = { params: { sort: 'created_at', limit: 20, offset: 0 } } middleware.ensureProjects(dreq, res, next) }, ensureProjectsUsers: function(req, res, next){ if (! res.locals.projects || ! res.locals.projects.length) { return next() } middleware.ensureObjectsUsers(res.locals.projects, next) }, ensureLayoutsUsers: function(req, res, next){ if (! res.locals.layouts || ! res.locals.layouts.length) { return next() } middleware.ensureObjectsUsers(res.locals.layouts, next) }, ensureSubscriptionsUsers: function(req, res, next){ if (! res.locals.subscriptions || ! res.locals.subscriptions.length) { return next() } middleware.ensureObjectsUsers(res.locals.subscriptions, next) }, ensureMediaUsers: function(req, res, next){ if (! res.locals.media || ! res.locals.media.length) { return next() } middleware.ensureObjectsUsers(res.locals.media, next) }, ensureSubscriptionUser: function(req, res, next){ if (! res.locals.subscription) { return next() } middleware.ensureObjectsUsers([ res.locals.subscription ], function(){ next() }) }, ensureMediaUser: function(req, res, next){ if (! res.locals.media) { return next() } middleware.ensureObjectsUsers([ res.locals.media ], function(){ res.locals.mediaUser = res.locals.media.User next() }) }, ensureObjectsUsers: function(objects, next){ if (! objects) { return next () } var dedupe = {}, user_ids objects.forEach(function(obj){ dedupe[ obj.user_id ] = dedupe[ obj.user_id ] || [] dedupe[ obj.user_id ].push(obj) }) user_ids = _.keys(dedupe) User.find({ _id: { $in: user_ids } }) .select(fields.user) .exec(function (err, users) { if (! users) { return next () } users.forEach(function(user){ dedupe[user._id].forEach(function(obj){ obj.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 = req.method == "GET" ? helpers.user(user) : user } else { res.locals.profile = null } next() }) } else { res.locals.profile = null next() } }, ensureSingleMedia: function(req, res, next){ var id = req.params.id if (id) { Media.findOne({ _id: id }, function (err, media) { if (media) { res.locals.media = req.method == "GET" ? helpers.media(media) : media } else { res.locals.media = null } next() }) } else { res.locals.media = 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() }) }, ensureLayoutsCount: function(req, res, next){ Layout.count({}, function(err, count){ res.locals.layoutCount = count || 0 next() }) }, ensureMediaCount: function(req, res, next){ Media.count({}, function(err, count){ res.locals.mediaCount = 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 }, fields.project, function(err, projects){ res.locals.projects = projects.map(helpers.project) next() }) }, ensureProfileMedia: function(req, res, next){ if (! res.locals.profile) { return next() } req.criteria = { user_id: res.locals.profile._id } middleware.ensureMedia(req, res, 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 }, fields.user, function(err, user){ res.locals.projectUser = helpers.user(user) || 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() }) }, ensureLayout: function(req, res, next){ res.locals.layout = req.layout next() }, ensureLayoutUser: function(req, res, next){ if (! res.locals.layout) { return next() } User.findOne({ _id: res.locals.layout.user_id }, fields.user, function(err, user){ res.locals.layoutUser = helpers.user(user) || defaults.user next() }) }, }