diff options
| author | Jules Laplace <jules@okfoc.us> | 2016-10-28 18:06:46 -0400 |
|---|---|---|
| committer | Jules Laplace <jules@okfoc.us> | 2016-10-28 18:06:46 -0400 |
| commit | 9e7bacd46c1e5d0e1c24433690d421ab3f3a11f2 (patch) | |
| tree | 4d0cefa2780dfa4382f1ed2ea481b6aafbdbb15e /server/lib/views/index.js | |
| parent | 50da9e3e677f121f15e501bf062da6c45db255ad (diff) | |
| parent | cce1dea756717f1308c6b72f762b5ea5f5b43958 (diff) | |
merge
Diffstat (limited to 'server/lib/views/index.js')
| -rw-r--r-- | server/lib/views/index.js | 363 |
1 files changed, 246 insertions, 117 deletions
diff --git a/server/lib/views/index.js b/server/lib/views/index.js index 29b84d8..523f628 100644 --- a/server/lib/views/index.js +++ b/server/lib/views/index.js @@ -4,6 +4,7 @@ var User = require('../schemas/User'), Project = require('../schemas/Project'), Documentation = require('../schemas/Documentation'), Collaborator = require('../schemas/Collaborator'), + Plan = require('../schemas/Plan'), config = require('../../../config'), marked = require('marked'), util = require('../util'), @@ -11,145 +12,273 @@ var User = require('../schemas/User'), moment = require('moment'); marked.setOptions({ - renderer: new marked.Renderer(), - gfm: true, - sanitize: true, - smartLists: true, - smartypants: true, + renderer: new marked.Renderer(), + gfm: true, + sanitize: true, + smartLists: true, + smartypants: true, }); -var views = {} +var views = module.exports = { -views.staff = require('./staff') + staff: require('./staff'), -views.editor_new = function (req, res) { - if (! req.user) { - res.redirect('/') - } - else { - res.render('editor') - } -} + editor_new: function (req, res) { + if (! req.user) { + res.redirect('/') + } + else { + res.locals.opt.editing = true + res.render('editor') + } + }, -views.editor = function (req, res) { - if (! req.project) { - res.redirect('/') - } - else if (req.isOwner || req.isCollaborator || req.isStaff) { - res.render('editor') - } - else { - views.reader(req, res) - } -} + editor: function (req, res) { + if (! req.project) { + res.redirect('/') + } + else if (req.user && (req.isOwner || req.isCollaborator || req.isStaff)) { + res.locals.opt.editing = true + res.render('editor', { + ogUrl: "http://vvalls.com/project/" + req.project.slug + "/", + }) + } + else { + res.redirect("/project/" + req.project.slug + "/") + } + }, -views.reader = function (req, res) { - if (! req.project) { - res.redirect('/') - return - } - User.findOne({ _id: req.project.user_id }, function(err, user) { - if (err || ! user) { - console.error(err) + reader: function (req, res) { + if (! req.project) { 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'), + User.findOne({ _id: req.project.user_id }, function(err, user) { + if (err || ! user) { + console.error(err) + res.redirect('/') + return + } + var ogImage + if (req.project.media.length && req.project.media[0].media.type == "image") { + ogImage = req.project.media[0].media.url + } + 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, + authorpic: user.photo, + canEdit: req.isOwner || req.isCollaborator, + editlink: "/project/" + req.project.slug + "/edit", + noui: !! (req.query.noui === '1'), + ogTitle: req.project.name, + ogUrl: "http://vvalls.com/project/" + req.project.slug + "/", + ogImage: ogImage, + }) }) - }) -} + }, -views.builder = function (req, res) { - res.render('builder') -} + builder: function (req, res) { + res.render('builder') + }, -views.modal = function (req, res) { - res.render('modal'); -}; + blueprint: function (req, res) { + res.render('blueprint') + }, -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>") - } -} + modal: function (req, res) { + res.render('modal'); + }, -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) }, + home: function (req, res) { + views_middleware.ensurePlans(req, res, function(err){ + views_middleware.fetchProjects({ featured: true }, null, null, function(err, projects){ + res.render('home', { + projects: projects || [], + }) + }) + }) + }, + + demoHome: function (req, res) { + views_middleware.ensurePlans(req, res, function(err){ + views_middleware.fetchProjects({ featured: true }, null, null, function(err, projects){ + res.render('home', { + projects: projects || [], + }) + }) + }) + }, + + partials: { + plans: function (req, res){ + views_middleware.ensurePlans(req, res, function(){ + res.render('about/_plans', { logged_in: res.locals.logged_in || false }) + }) + }, + }, + + docs: function (req, res){ + var name = req.params.name || "about" + + if (name == "howto") { + res.render('about/' + name) + return + } + if (name == "brochure" || name == "plans") { + // TODO: fetch plans + views_middleware.ensurePlans(req, res, function(){ + res.render('about/' + name) + }) + return + } + if (name == "about" || name == "index") { + res.render('about/' + name) + return + } + + if (name === "new") { + res.render('docs', { + doc: { name: "new" }, content: null, isNew: true }) + return } - 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, {}, []) + 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: util.htmlize(doc.body), + isNew: false + }) }) - } - 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 + }, + + profile: function (req, res) { + var username = req.params.username || (req.user && req.user.username) + var user, isOwnProfile = false + if (username) { + User.findOne({ username: username }, function (err, profileUser) { + if (profileUser) { + user = profileUser + isOwnProfile = (String(user._id) == (req.user && String(req.user._id))) + next() + } + else { + done(err, []) + } + }) + } + else { + done() } - 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 + + function next(){ + var criteria = { user_id: user._id } + if ( ! isOwnProfile ) { + criteria.privacy = false + } + views_middleware.fetchProjects(criteria, null, null, function(err, projects){ + views_middleware.fetchUserProjectCount(criteria, function(projectCount){ + done(err, projects, projectCount) + }) }) - done(err, user, projects) - }) - } + } + + function done(err, projects, projectCount){ + if (! user) { return res.redirect('/') } + res.render('profile', { + isOwnProfile: isOwnProfile, + profile: user, + projects: projects || [], + projectCount: projectCount, + ogTitle: "VValls: Profile of " + user.displayName, + ogUrl: "http://vvalls.com/profile/" + user.username + "/", + ogImage: user.photo, + }) + } + }, - function done(err, user, projects){ - if (! user) { return res.redirect('/') } - res.render('profile', { - profile: user, - projects: projects || [], - }) - } + projectsPaginate: function(req, res) { + var criteria = {} + var offset = Number(req.query.offset || 0) + var user_id, isOwnProfile + + if (req.query.home) { + criteria.featured = true + criteria.privacy = false + } + else if (req.query.user_id) { + user_id = req.query.user_id + isOwnProfile = (String(user_id) == (req.user && String(req.user._id))) + + criteria.user_id = user_id + if ( ! isOwnProfile ) { + criteria.privacy = false + } + } + else { + res.end("") + return + } + + views_middleware.fetchProjects(criteria, null, offset, function(err, projects){ + res.render('projects/list-projects', { + projects: projects || [] + }) + }) + }, + } -module.exports = views +var views_middleware = { + ensurePlans: function(req, res, next){ + Plan.find(function (err, plans) { + res.locals.plans = {} + plans.forEach(function(plan){ + res.locals.plans[ plan.slug ] = plan + "monthly_price yearly_price basic_layout_monthly_price basic_layout_yearly_price pro_layout_monthly_price pro_layout_yearly_price".split(" ").forEach(function(key){ + plan[key] = (plan[key]/100).toFixed(2)+"" + }) + }) + next() + }) + }, + + fetchProjects: function (criteria, limit, offset, next) { + limit = limit || 7 + offset = offset || 0 + Project.find(criteria) + .sort('-created_at') + .skip(offset) + .limit(limit) + .exec(function(err, projects){ + projects = projects.map(function(project){ + project = project.toObject() + project.date = moment(project.updated_at).format("M/D/YYYY") + if (! project.colors || project.colors.wall && project.colors.wall[0] == project.colors.wall[1] && project.colors.wall[1] == project.colors.wall[2] && project.colors.wall[2] > 238) { + project.color = [238,238,238] + } else { + project.color = project.colors.wall + } + return project + }) + next(err, projects) + }) + }, + fetchUserProjectCount: function(criteria, next){ + Project.count(criteria, function(err, count){ + next(count || 0) + }) + }, +} |
