/* jshint node: true */ 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'), Blueprint = require('../../schemas/Blueprint'), config = require('../../../../config'), middleware = require('../../middleware'), util = require('../../util'), _ = require('lodash'), moment = require('moment'); var staff = module.exports = { fields: require('./fields'), defaults: require('./defaults'), middleware: require('./middleware'), helpers: require('./helpers'), route: function(app){ app.get('/staff', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensureRecentUsers, staff.middleware.ensureUsersCount, staff.middleware.ensureProjectsCount, staff.middleware.ensureMediaCount, staff.index ); // // users 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/users/:username/media', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensureProfile, staff.middleware.ensureProfileMedia, staff.middleware.ensureProfileMediaCount, staff.users.media ); app.put('/staff/users/:username/bless', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensureProfile, staff.users.bless ); app.put('/staff/users/:username/artist', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensureProfile, staff.users.make_artist ); if (app.get('env') === 'development') { app.get('/staff/authorize', middleware.ensureAuthenticated, staff.users.blessSelf ); } // // projects 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/projects/:slug/feature', middleware.ensureAuthenticated, middleware.ensureIsStaff, middleware.ensureProject, staff.middleware.ensureProject, staff.projects.feature ); // // layouts app.get('/staff/layouts', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensureLayoutsCount, staff.middleware.ensureLayouts, staff.middleware.ensureLayoutsUsers, staff.layouts.index ); app.get('/staff/layouts/:slug', middleware.ensureAuthenticated, middleware.ensureIsStaff, middleware.ensureLayout, staff.middleware.ensureLayout, staff.middleware.ensureLayoutUser, staff.layouts.show ); app.put('/staff/layouts/:slug/stock', middleware.ensureAuthenticated, middleware.ensureIsStaff, middleware.ensureLayout, staff.middleware.ensureLayout, staff.layouts.make_stock ); // // blueprints app.get('/staff/blueprints', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensureBlueprintsCount, staff.middleware.ensureBlueprints, staff.middleware.ensureBlueprintsUsers, staff.blueprints.index ); app.get('/staff/blueprints/:slug', middleware.ensureAuthenticated, middleware.ensureIsStaff, middleware.ensureBlueprint, staff.middleware.ensureBlueprint, staff.middleware.ensureBlueprintUser, staff.blueprints.show ); // // media app.get('/staff/media', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensureMediaCount, staff.middleware.ensureMedia, staff.middleware.ensureMediaUsers, staff.media.index ); app.get('/staff/media/:id', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensureSingleMedia, staff.middleware.ensureMediaUser, staff.media.show ); // // plans app.get('/staff/plans', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensurePlans, staff.plans.index ); app.get('/staff/plans/new', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.plans.new ); app.post('/staff/plans/new', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.plans.create ); app.get('/staff/plans/:slug', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensurePlan, staff.plans.edit ); app.post('/staff/plans/:slug', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensurePlan, staff.plans.update ); // // subscriptions app.get('/staff/subscriptions', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensureSubscriptions, staff.middleware.ensureSubscriptionsUsers, staff.subscriptions.index ); app.get('/staff/subscriptions/:id', middleware.ensureAuthenticated, middleware.ensureIsStaff, staff.middleware.ensureSubscription, staff.middleware.ensureSubscriptionUser, staff.subscriptions.show ); }, paginate: function(req, res){ var info = res.locals.pagination info.query = "sort=" + info.sort + "&limit=" + info.limit info.first_page = 0 info.last_page = Math.max(0, info.max - info.limit) info.sortOptions = info.sortOptions if (info.offset > 0) { info.prev_page = Math.max(0, info.offset - info.limit) } else { info.prev_page = -1 } if (info.count == info.limit && info.offset + info.limit < info.max) { info.next_page = info.offset + info.limit } else { info.next_page = -1 } }, index: function(req, res){ res.render('staff/index') }, // /staff/users/ // /staff/users/:username users: { index: function(req, res){ res.locals.pagination.count = res.locals.users.length res.locals.pagination.max = res.locals.userCount staff.paginate(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') } }, media: function(req, res){ if (res.locals.profile) { res.locals.pagination.count = res.locals.media.length res.locals.pagination.max = res.locals.profile.mediaCount staff.paginate(req, res) res.render('staff/users/media') } else { res.render('staff/users/show_404') } }, blessSelf: function(req, res){ req.user.isStaff = true req.user.save(function(err, user){ res.json({ state: user.isStaff }) }) }, bless: function(req, res){ res.locals.profile.isStaff = req.body.state == "true" res.locals.profile.save(function(err, user){ res.json({ state: user.isStaff }) }) }, make_artist: function(req, res){ res.locals.profile.isArtist = req.body.state == "true" res.locals.profile.save(function(err, user){ res.json({ state: user.isArtist }) }) }, }, // /staff/projects/ // /staff/projects/:slug projects: { index: function(req, res){ res.locals.pagination.count = res.locals.projects.length res.locals.pagination.max = res.locals.projectCount staff.paginate(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') } }, feature: function(req, res){ res.locals.project.featured = req.body.state == "true" res.locals.project.save(function(err, project){ res.json({ state: project.featured }) }) }, }, // /staff/layouts/ // /staff/layouts/:slug layouts: { index: function(req, res){ res.locals.pagination.count = res.locals.layouts.length res.locals.pagination.max = res.locals.layoutCount staff.paginate(req, res) res.render('staff/layouts/index') }, show: function(req, res){ if (res.locals.layout) { res.render('staff/layouts/show', { }) } else { res.render('staff/layouts/show_404') } }, make_stock: function(req, res){ res.locals.layout.is_stock = req.body.state == "true" res.locals.layout.save(function(err, layout){ res.json({ state: layout.is_stock }) }) }, }, // /staff/blueprints/ // /staff/blueprints/:slug blueprints: { index: function(req, res){ res.locals.pagination.count = res.locals.blueprints.length res.locals.pagination.max = res.locals.blueprintCount staff.paginate(req, res) res.render('staff/blueprints/index') }, show: function(req, res){ if (res.locals.blueprint) { res.render('staff/blueprints/show', { }) } else { res.render('staff/blueprints/show_404') } }, }, media: { index: function(req, res){ res.locals.pagination.count = res.locals.media.length res.locals.pagination.max = res.locals.mediaCount staff.paginate(req, res) res.render('staff/media/index') }, show: function(req, res){ if (res.locals.media) { res.render('staff/media/show', { mediaJSON: util.escape( JSON.stringify( res.locals.media ) ), mediaUserJSON: util.escape( JSON.stringify( res.locals.mediaUser ) ), }) } else { res.render('staff/media/show_404') } }, }, plans: { index: function(req, res){ res.locals.fields = staff.fields.plans.split(" ") res.locals.permissions = staff.fields.plans_permissions.split(" ") res.render('staff/plans/index') }, new: function(req, res){ res.locals.plan = new Plan () res.render('staff/plans/new') }, edit: function(req, res){ res.locals.plan = req.plan res.render('staff/plans/edit') }, create: function(req, res){ var plan = new Plan () var fields = staff.fields.plans.split(" ") var permissions = staff.fields.plans_permissions.split(" ") var data = util.cleanQuery(req.body) data.name = util.sanitize(data.name) data.slug = util.sanitize(data.slug.toLowerCase()) data.permissions = {} permissions.forEach(function(field){ data.permissions[field] = data["permissions_" + field].length == 2 }) new Plan (data).save(function(err, doc){ if (err || ! doc) { return res.json({ error: err }) } middleware.updatePlans() res.redirect("/staff/plans/") }) }, update: function(req, res){ var fields = staff.fields.plans.split(" ") var permissions = staff.fields.plans_permissions.split(" ") var data = util.cleanQuery(req.body) data.name = util.sanitize(data.name) data.slug = util.sanitize(data.slug.toLowerCase()) _.extend(req.plan, data) permissions.forEach(function(field){ req.plan.permissions[field] = data["permissions_" + field].length == 2 }) req.plan.save(function(err, doc){ if (err || ! doc) { return res.json({ error: err }) } middleware.updatePlans() res.redirect("/staff/plans/") }) }, }, subscriptions: { index: function(req, res){ res.locals.pagination.count = res.locals.subscriptions.length res.locals.pagination.max = res.locals.subscriptionCount staff.paginate(req, res) res.render('staff/subscriptions/index') }, show: function(req, res){ res.render('staff/subscriptions/show') }, }, }