diff options
Diffstat (limited to 'server/lib/views')
| -rw-r--r-- | server/lib/views/index.js | 154 | ||||
| -rw-r--r-- | server/lib/views/staff.js | 246 |
2 files changed, 400 insertions, 0 deletions
diff --git a/server/lib/views/index.js b/server/lib/views/index.js new file mode 100644 index 0000000..99be956 --- /dev/null +++ b/server/lib/views/index.js @@ -0,0 +1,154 @@ +/* jshint node: true */ + +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'), + _ = require('lodash'), + moment = require('moment'); + +marked.setOptions({ + renderer: new marked.Renderer(), + gfm: true, + sanitize: true, + smartLists: true, + smartypants: true, +}); + +var views = {} + +views.staff = require('./staff') + +views.editor_new = function (req, res) { + if (! req.user) { + res.redirect('/') + } + else { + res.render('editor') + } +} + +views.editor = function (req, res) { + if (! req.project) { + res.redirect('/') + } + else if (req.isOwner || req.isCollaborator) { + res.render('editor') + } + else { + views.reader(req, res) + } +} + +views.reader = function (req, res) { + if (! req.project) { + res.redirect('/') + } + User.findOne({ _id: req.project.user_id }, function(err, user) { + if (err || ! user) { + console.error(err) + res.redirect('/') + return + } + res.render('reader', { + name: util.sanitize(req.project.name), + description: util.sanitize(req.project.description), + date: moment(req.project.updated_at).format("M/DD/YYYY"), + author: user.displayName, + authorlink: "/profile/" + user.username, + canEdit: req.isOwner || req.isCollaborator, + editlink: "/project/" + req.project.slug + "/edit", + noui: !! (req.query.noui === '1'), + }) + }) +} + +views.builder = function (req, res) { + res.render('builder') +} + +views.modal = function (req, res) { + res.render('modal'); +}; + +views.home = function (req, res) { + if (req.user) { + Project.find({ privacy: false }) + .sort('-created_at') + .limit(20) + .exec(function(err, projects){ + res.render('home', { projects: projects || [] }) + }) + } + else { + res.send("<html></html>") + } +} + +views.docs = function (req, res){ + var name = req.params.name || "index" + + if (name === "new") { + res.render('docs', { + doc: { name: "new" }, + content: null, + isNew: true + }) + return + } + + Documentation.findOne({ name: name }, function(err, doc) { + if (err || ! doc) { + return res.render('docs', { + doc: { name: util.sanitize(name) }, + content: null, + isNew: true + }) + } + res.render('docs', { + doc: doc, + content: marked(doc.body), + isNew: false + }) + }) +} + +views.profile = function (req, res) { + var username = req.params.username || (req.user && req.user.username) + if (username) { + User.findOne({ username: username }, function (err, user) { + user ? next(user) : done(err, {}, []) + }) + } + else { + done() + } + + function next(user){ + var criteria = { user_id: user._id } + if ( ! (req.user && req.user._id && req.user._id == user._id) ) { + criteria.privacy = false + } + Project.find(criteria, function(err, projects){ + projects = projects.map(function(project){ + project = project.toObject() + project.date = moment(project.updated_at).format("M/DD/YYYY") + return project + }) + done(err, user, projects) + }) + } + + function done(err, user, projects){ + if (! user) { return res.redirect('/') } + res.render('profile', { + profile: user, + projects: projects || [], + }) + } +} + +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 |
