summaryrefslogtreecommitdiff
path: root/server/lib/views
diff options
context:
space:
mode:
Diffstat (limited to 'server/lib/views')
-rw-r--r--server/lib/views/index.js154
-rw-r--r--server/lib/views/staff.js246
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