expressling
Version:
Expressling
251 lines (246 loc) • 7.73 kB
JavaScript
// # Pages
var form = require('express-form')
, filter = form.filter
, field = form.field
, validate = form.validate
, _ = require('underscore')
, admins = ['super_admin', 'admin'];
// Check for handle param
function checkHandle(req, res, next) {
if(!req.param('handle')) {
req.flash('error', 'Invalid page handle');
res.redirect('/');
} else {
next();
}
}
module.exports = function(app, db) {
// ## Schemas
var Users = db.model('Users')
, Pages = db.model('Pages')
, access = Users.access;
// ## Routes
var routes = {
index: function(req, res, next) {
// Paginate the results and check for page and limit params
var page = (req.param('page')) ? req.param('page') : 0
, limit = (req.param('limit')) ? req.param('limit') : 10;
// Load the pages ordered by date created
Pages
.find({})
.asc('title')
//.skip(page * limit)
//.limit(limit)
.run(function(err, pages) {
if(_.isEmpty(pages)) {
// Flash message
req.flash('notice', 'No pages exist');
res.render('pages', {
title: 'Pages'
});
} else {
// Render the view with pages
res.render('pages', {
title: 'Pages'
, pages: pages
, currentPage: page
, pageLimit: limit
});
}
});
}
, new: function(req, res, next) {
// Render the view with form to create a new page
res.render('pages/new', { title: 'Create Page', layout: false });
}
, create: function(req, res, next) {
// Check that form is valid
if (!req.form.isValid) {
res.render('pages/new', {
title: 'Create Page'
, form: req.form
, layout: false
});
} else {
// Create the new page
Pages.create(req.form, function(err, page) {
if (err) {
// err, null
if (/duplicate key/.test(err)) {
req.flash('error', 'Page already exists with the same title and/or handle');
} else {
req.flash('error', err);
}
res.render('pages/new', {
title: 'Create Page'
, form: req.form
, layout: false
});
} else if (page) {
// null, page
req.flash('success', 'Page was successfully created');
res.redirect('/pages');
} else {
// null, null
req.flash('error', 'An unknown error occured, try again');
res.redirect('/pages/new');
}
});
}
}
, show: function(req, res, next) {
// Load the specific page
Pages.findOne({ handle: req.param('handle') }, function(err, page) {
if (err) {
// err, null
// Redirect to index of pages
req.flash('error', 'No page found with that handle');
res.redirect('/');
} else if (page) {
// null, page
// Render view to show the page
res.render('pages/show', {
title: page.title
, meta: page.meta
, page: page
});
} else {
// null, null
req.flash('error', 'An unknown error occured, try again');
res.redirect('/');
}
});
}
, edit: function(req, res, next) {
// Load the specific page
Pages.findOne({ handle: req.param('handle') }, function(err, page) {
if (err) {
// err, null
req.flash('error', 'No page found with that handle');
res.redirect('/');
} else if (page) {
// null, page
// Render view to edit the page
res.render('pages/edit', {
title: 'Edit Page'
, form: page
, layout: false
});
} else {
// null, null
req.flash('error', 'An unknown error occured, try again');
res.redirect('/pages');
}
});
}
, update: function(req, res, next) {
// Check that form is valid
if (!req.form.isValid) {
res.render('pages/edit/' + req.param('handle'), {
title: 'Edit Page'
, form: req.form
});
} else {
// Load the specific page
Pages.findOne({ handle: req.param('handle') }, function(err, page) {
if (err) {
// err, null
req.flash('error', 'No page found with that handle');
res.redirect('/pages');
} else if (page) {
// null, page
// Save the page
page.title = req.form.title;
page.handle = req.form.page_handle;
page.meta = req.form.meta;
page.content = req.form.content;
page.save(function(err) {
if(err) {
res.render('/pages/edit/' + req.param('handle'), {
title: 'Edit Page'
, form: req.form
});
} else {
req.flash('success', 'Successfully updated page');
res.redirect('/page/' + page.handle);
}
});
} else {
// null, null
req.flash('error', 'An unknown error occured, try again');
res.redirect('/pages');
}
});
}
}
, delete: function(req, res, next) {
// Load the specific page
Pages.findOne({ handle: req.param('handle') }, function(err, page) {
if (err) {
// err, null
req.flash('error', 'No page found with that handle');
res.redirect('/pages');
} else if (page) {
// null, page
// Remove the page
page.remove(function(err) {
if(err) {
req.flash('error', 'Page was not removed');
} else {
req.flash('success', 'Successfully removed page');
}
res.redirect('/pages');
});
} else {
// null, null
req.flash('error', 'An unknown error occured, try again');
res.redirect('/pages');
}
});
}
};
// ## Index
app.get('/pages', access(admins), routes.index);
// ## New
app.get('/pages/new', access(admins), routes.new);
// ## Create
app.post(
'/pages'
, access(admins)
, form(
filter("title")
, validate("title").required()
, filter("handle")
, validate("handle").required()
, filter("meta")
, filter("content")
)
, routes.create
);
// ## Show
app.get('/page/:handle', checkHandle, routes.show);
// ## Edit
app.get(
'/pages/edit/:handle'
, access(admins)
, checkHandle
, routes.edit);
// ## Update
app.post(
'/pages/update/:handle'
, access(admins)
, checkHandle
, form(
filter("title")
, validate("title").required()
, filter("page_handle")
, validate("page_handle").required()
, filter("meta")
, filter("content")
)
, routes.update);
// ## Delete
app.post('/pages/delete/:handle', access(admins), checkHandle, routes.delete);
// ## Paginated Index
app.get('/pages/:page/:limit', access(admins), routes.index);
};