Working on replacing scattered post model with a cohesive one and mongodb support ( #6 ), some of this will also support issue #7 as well, but right now the admin page is broken and post generating is broken.
This commit is contained in:
parent
8fafc77cae
commit
a3fa59e226
12 changed files with 132 additions and 209 deletions
151
app.js
151
app.js
|
@ -8,15 +8,13 @@ var multer = require('multer');
|
|||
var fs = require('fs');
|
||||
var markdown = require( "markdown" ).markdown;
|
||||
|
||||
|
||||
// Get connected to our database
|
||||
var MongoClient = require('mongodb').MongoClient
|
||||
|
||||
Post = require('./post.js');
|
||||
User = require('./user.js');
|
||||
var helper = require('./helper.js');
|
||||
Category = require('./category.js');
|
||||
var database = require('./db.js');
|
||||
var genPosts = require('./genPosts.js');
|
||||
var genStatic = require('./genStatic.js');
|
||||
var genPhotos = require('./genPhotos.js');
|
||||
|
||||
|
@ -102,28 +100,21 @@ app.get('/admin/post/list/:start?',
|
|||
} else {
|
||||
var start = 0;
|
||||
}
|
||||
database.listPosts(count, start, function(posts){
|
||||
for (post in posts) {
|
||||
var date = new Date(posts[post].postDate);
|
||||
posts[post].dateString = date.getFullYear() + '-' +
|
||||
("0" + (date.getMonth()+1)).slice(-2) + '-' +
|
||||
("0" + date.getDate()).slice(-2);
|
||||
}
|
||||
Post.getPosts(count, start, function(err, posts){
|
||||
res.render('admin-post-list', {posts, user: req.user});
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
app.get('/admin/post/view/:id?',
|
||||
app.get('/admin/post/view/:uuid?',
|
||||
function (req, res, next) {
|
||||
if (req.params.id) {
|
||||
database.getPostById(req.params.id, function(row) {
|
||||
if (req.params.uuid) {
|
||||
Post.getByUUID(req.params.uuid, function(err, post) {
|
||||
res.render('admin-post-view', {
|
||||
successNotice: req.flash('successNotice'),
|
||||
failureNotice: req.flash('failureNotice'),
|
||||
date: helper.epochToShortDateString(row.postDate),
|
||||
post: row,
|
||||
content: markdown.toHTML(row.markdown),
|
||||
post: post,
|
||||
content: markdown.toHTML(post.get("markdown")),
|
||||
user: req.user
|
||||
})
|
||||
})
|
||||
|
@ -136,104 +127,92 @@ app.get('/admin/post/view/:id?',
|
|||
|
||||
app.get('/admin/post/new',
|
||||
function(req, res, next) {
|
||||
database.listCategories(function(rows){
|
||||
res.render('admin-post-new', { categories: rows, user: req.user });
|
||||
Category.getCategories(null, null, function (err, categories) {
|
||||
res.render('admin-post-new', { categories: categories, user: req.user });
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.post('/admin/post/new',
|
||||
function(req, res, next) {
|
||||
var title = req.body.title;
|
||||
var post = new Post();
|
||||
post.set("title", req.body.title);
|
||||
if (req.body.slug != "") {
|
||||
var slug = req.body.slug;
|
||||
post.set("slug", req.body.slug);
|
||||
} else {
|
||||
var slug = helper.makeSlug(title);
|
||||
post.set("slug", post.makeSlug());
|
||||
}
|
||||
var markdown = req.body.markdown;
|
||||
if (req.body.postDate != "") {
|
||||
var postDate = helper.dateToEpoch(new Date(req.body.postDate));
|
||||
} else {
|
||||
var postDate = helper.dateToEpoch(new Date());
|
||||
post.set("postDate", new Date(req.body.postDate));
|
||||
post.set("updatedDate", new Date(req.body.postDate));
|
||||
}
|
||||
var updatedDate = postDate;
|
||||
var createDate = helper.dateToEpoch(new Date());
|
||||
var categoryName = req.body.category;
|
||||
var tags = helper.parseTags(req.body.tags);
|
||||
post.tagPost(req.body.tags);
|
||||
post.set("markdown", req.body.markdown);
|
||||
|
||||
database.createPost(title, slug, markdown, postDate, updatedDate, createDate, function(err, row) {
|
||||
database.setPostCategory(row.id, categoryName, function(category) {
|
||||
database.tagPost(row.id, tags);
|
||||
Category.getByName(req.body.category, function (err, category) {
|
||||
post.set("category", category.get("uuid"));
|
||||
console.log(post);
|
||||
post.save(function (err) {
|
||||
if (!err) {
|
||||
req.flash('successNotice', 'Post created.');
|
||||
res.redirect('/admin/post/edit/'+row.id);
|
||||
res.redirect('/admin/post/edit/'+post.get("uuid"));
|
||||
}
|
||||
else {
|
||||
req.flash('failureNotice', 'Post creation failed');
|
||||
res.redirect('/admin/post/new/');
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
app.get('/admin/post/edit/:id',
|
||||
app.get('/admin/post/edit/:uuid',
|
||||
function(req, res, next) {
|
||||
var id = req.params.id;
|
||||
async.parallel({
|
||||
categories: function(callback) {
|
||||
database.listCategories(function(categories) {
|
||||
callback(null, categories);
|
||||
})
|
||||
},
|
||||
postCategory: function(callback) {
|
||||
database.getPostCategory(id, function(category) {
|
||||
callback(null, category);
|
||||
})
|
||||
},
|
||||
postTags: function(callback) {
|
||||
database.getPostTagsAsString(id, function(tagString) {
|
||||
callback(null, tagString);
|
||||
})
|
||||
},
|
||||
post: function(callback) {
|
||||
database.getPostById(id, function(post) {
|
||||
callback(null, post);
|
||||
})
|
||||
}
|
||||
},
|
||||
function(err, results) {
|
||||
if (results.postCategory) {
|
||||
var categoryName = results.postCategory.name;
|
||||
} else {
|
||||
var categoryName = null;
|
||||
Post.getByUUID(req.params.uuid, function(err, post) {
|
||||
Category.getByUUID(post.get("category"), function(err, category) {
|
||||
Category.getCategories(null, null, function(err, categories) {
|
||||
var tags = ""
|
||||
for (i=0; i<post.get("tags").length; i++) {
|
||||
tags += post.get("tags")[i].name + " ";
|
||||
}
|
||||
res.render('admin-post-edit', {
|
||||
successNotice: req.flash('successNotice'),
|
||||
failureNotice: req.flash('failureNotice'),
|
||||
categories: results.categories,
|
||||
postCategory: categoryName,
|
||||
post: results.post,
|
||||
postTags: results.postTags,
|
||||
formattedDate: helper.epochToDateString(results.post.postDate),
|
||||
categories: categories,
|
||||
category: category,
|
||||
post: post,
|
||||
postTags: tags,
|
||||
user: req.user
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
app.post('/admin/post/edit/:id',
|
||||
app.post('/admin/post/edit/:uuid',
|
||||
function(req, res, next) {
|
||||
var id = req.params.id;
|
||||
var title = req.body.title;
|
||||
var slug = req.body.slug;
|
||||
var markdown = req.body.markdown;
|
||||
var postDate = helper.dateToEpoch(new Date(req.body.postDate));
|
||||
var categoryName = req.body.category;
|
||||
var tags = helper.parseTags(req.body.tags);
|
||||
console.log('Post '+id+' update request received');
|
||||
database.tagPost(id, tags);
|
||||
database.updatePost(id, title, slug, markdown, postDate, function(err, row) {
|
||||
database.setPostCategory(id, categoryName, function(err) {
|
||||
req.flash('successNotice', 'Post updated.');
|
||||
res.redirect('/admin/post/edit/'+id);
|
||||
Post.getByUUID(req.params.uuid, function(err, post) {
|
||||
post.set("title", req.body.title);
|
||||
post.set("slug", req.body.slug);
|
||||
post.set("markdown", req.body.markdown);
|
||||
post.set("postDate", new Date(req.body.postDate));
|
||||
post.tagPost(req.body.tags);
|
||||
Category.getByName(req.body.category, function(err, category) {
|
||||
post.set("category", category.get("uuid"));
|
||||
post.save(function(err) {
|
||||
if (!err) {
|
||||
req.flash("successNotice", "Post updated.");
|
||||
res.redirect("/admin/post/edit/"+post.get("uuid"));
|
||||
}
|
||||
else {
|
||||
req.flash("failureNotice", "Post failed to update.");
|
||||
res.redirect("/admin/post/edit/"+post.get("uuid"));
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
app.get('/admin/post/regenerate/:id?',
|
||||
|
@ -430,7 +409,7 @@ app.get('/admin',
|
|||
});
|
||||
},
|
||||
posts: function(callback) {
|
||||
database.countPosts(function(count) {
|
||||
Post.countPosts(function(err, count) {
|
||||
callback(null, count);
|
||||
});
|
||||
},
|
||||
|
|
21
db.js
21
db.js
|
@ -2,7 +2,6 @@ var sqlite = require('sqlite3').verbose();
|
|||
var async = require('async');
|
||||
|
||||
var config = require('./config.js').config;
|
||||
var helper = require('./helper.js');
|
||||
|
||||
var db = new sqlite.Database(config.dbPath);
|
||||
|
||||
|
@ -34,14 +33,6 @@ exports.getLastUploadDate = function(cb) {
|
|||
});
|
||||
}
|
||||
|
||||
// Function to get a count of current posts
|
||||
// Returns count of posts
|
||||
exports.countPosts = function(cb) {
|
||||
db.get('SELECT count(id) as count FROM posts;', function(err, count) {
|
||||
cb(count.count);
|
||||
});
|
||||
}
|
||||
|
||||
// Function to get a count of current galleries
|
||||
// Returns count of galleries
|
||||
exports.countGalleries = function(cb) {
|
||||
|
@ -82,18 +73,6 @@ exports.listCategories = function(cb) {
|
|||
});
|
||||
}
|
||||
|
||||
// Function to get a list of posts of a certain count and starting at an offset
|
||||
// Returns a list of post objects
|
||||
exports.listPosts = function(count, start, cb) {
|
||||
db.all('SELECT * FROM posts WHERE deleted = 0 \
|
||||
ORDER BY postDate DESC, title ASC \
|
||||
LIMIT '+count+' OFFSET '+start+';',
|
||||
function(err, posts) {
|
||||
console.log(err);
|
||||
cb(posts);
|
||||
});
|
||||
}
|
||||
|
||||
// Function to get a list of photos of a certain count and starting at an offset
|
||||
// Returns a list of photo objects
|
||||
exports.listPhotos = function(count, start, cb) {
|
||||
|
|
|
@ -7,7 +7,6 @@ var jade = require('jade');
|
|||
|
||||
var config = require('./config.js').config;
|
||||
var db = require('./db.js');
|
||||
var helper = require('./helper.js');
|
||||
|
||||
var generatePhotoSizesById = function generatePhotoSizesById(id, cb) {
|
||||
db.getPhotoById(id, function (photo) {
|
||||
|
|
|
@ -4,7 +4,6 @@ var jade = require('jade');
|
|||
var markdown = require( "markdown" ).markdown;
|
||||
var async = require('async');
|
||||
|
||||
var helper = require('./helper.js');
|
||||
var db = require('./db.js');
|
||||
|
||||
// Generate all archive pages associated with a particular post ID
|
||||
|
|
61
helper.js
61
helper.js
|
@ -1,61 +0,0 @@
|
|||
// Helper functions
|
||||
var crypto = require('crypto');
|
||||
|
||||
// sha256 hex-hashes password with supplied salt.
|
||||
// Returns hex-hash string
|
||||
exports.hashPassword = function(password, salt) {
|
||||
var hash = crypto.createHash('sha256');
|
||||
hash.update(password);
|
||||
hash.update(salt);
|
||||
return hash.digest('hex');
|
||||
}
|
||||
|
||||
// Convert date() to epoch
|
||||
exports.dateToEpoch = function(date) {
|
||||
return Math.floor(date);
|
||||
};
|
||||
|
||||
// Convert epoch (in seconds) to date string
|
||||
exports.epochToDateString = function(epoch) {
|
||||
var date = new Date(epoch);
|
||||
return date.toLocaleString();
|
||||
};
|
||||
|
||||
// Convert epoch to an ISO formatted date.
|
||||
exports.epochToShortDateString = function(epoch) {
|
||||
var date = new Date(epoch);
|
||||
return date.toISOString().slice(0,10);
|
||||
}
|
||||
|
||||
// Build a slug from a title string
|
||||
// Returns the slug as a string
|
||||
exports.makeSlug = function(str) {
|
||||
str = str.replace(/^\s+|\s+$/g, ''); // trim
|
||||
str = str.toLowerCase();
|
||||
str = str.trim();
|
||||
|
||||
// remove accents, swap ñ for n, etc
|
||||
var from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;&";
|
||||
var to = "aaaaeeeeiiiioooouuuunc-------";
|
||||
for (var i=0, l=from.length ; i<l ; i++) {
|
||||
str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i));
|
||||
}
|
||||
|
||||
str = str.replace(/[^a-z0-9 -]/g, '') // remove invalid chars
|
||||
.replace(/\s+/g, '-') // collapse whitespace and replace by -
|
||||
.replace(/-+/g, '-'); // collapse dashes
|
||||
|
||||
return str;
|
||||
};
|
||||
|
||||
// Parse a string of tags
|
||||
// Returns a list of tags
|
||||
exports.parseTags = function(str) {
|
||||
str = str.replace(/,/g,'');
|
||||
var list = str.split(" ");
|
||||
for (var i = 0, size = list.length; i < size; i++) {
|
||||
list[i] = list[i].trim();
|
||||
}
|
||||
console.log('tag parse '+list);
|
||||
return list
|
||||
}
|
|
@ -15,10 +15,12 @@
|
|||
"jade": "^1.11.0",
|
||||
"lodash": "^4.0.0",
|
||||
"markdown": "^0.5.0",
|
||||
"moment": "^2.11.1",
|
||||
"mongodb": "^2.1.4",
|
||||
"morgan": "^1.6.1",
|
||||
"multer": "^1.1.0",
|
||||
"ncp": "^2.0.0",
|
||||
"node-uuid": "^1.4.7",
|
||||
"passport": "^0.3.0",
|
||||
"passport-local": "^1.0.0",
|
||||
"serve-favicon": "^2.3.0",
|
||||
|
|
28
schemas.js
28
schemas.js
|
@ -1,9 +1,35 @@
|
|||
var uuid = require('node-uuid');
|
||||
|
||||
schemas = {
|
||||
user: {
|
||||
username: null,
|
||||
password: null,
|
||||
hash: null,
|
||||
email: null
|
||||
email: null,
|
||||
displayName: null
|
||||
},
|
||||
post: {
|
||||
uuid: uuid.v1(),
|
||||
title: null,
|
||||
slug: null,
|
||||
url: null,
|
||||
markdown: null,
|
||||
createdDate: new Date(),
|
||||
postDate: new Date(),
|
||||
updatedDate: new Date(),
|
||||
deleted: false,
|
||||
published: false,
|
||||
category: null,
|
||||
tags: [],
|
||||
lastGenerateDate: 0,
|
||||
lastUpload: 0
|
||||
},
|
||||
category: {
|
||||
uuid: uuid.v1(),
|
||||
name: null,
|
||||
slug: null,
|
||||
description: null,
|
||||
createdDate: new Date()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
2
user.js
2
user.js
|
@ -50,7 +50,7 @@ User.verify = function (username, password, callback) {
|
|||
console.log("Username "+username+" exists");
|
||||
console.log(username + "'s salt is " + doc.salt);
|
||||
var hash = hashPassword(password, doc.salt);
|
||||
console.log(username+"'s hashed password is "+hash);
|
||||
console.log(username+" is loging in with a hashed password of "+hash);
|
||||
db.collection("users").findOne({username: username, password: hash},
|
||||
function(err, doc) {
|
||||
callback(err, doc);
|
||||
|
|
|
@ -12,25 +12,25 @@ block content
|
|||
form(method="post", action="/admin/post/edit/#{post.id}")
|
||||
div(class="row page-header")
|
||||
div(class="input-group input-group-lg col-xs-10 col-xs-offset-1 col-md-10 col-md-offset-1")
|
||||
input(class="form-control", type="text", name="title", placeholder="Enter title", value="#{post.title}")
|
||||
input(class="form-control", type="text", name="title", placeholder="Enter title", value="#{post.get('title')}")
|
||||
div(class="input-group col-xs-10 col-xs-offset-1 col-md-10 col-md-offset-1")
|
||||
input(class="form-control", type="text", name="slug", placeholder="Enter slug (optional)", value="#{post.slug}")
|
||||
input(class="form-control", type="text", name="slug", placeholder="Enter slug (optional)", value="#{post.get('slug')}")
|
||||
div(class="row page-header")
|
||||
div(class="input-group col-xs-10 col-xs-offset-1 col-md-10 col-md-offset-1")
|
||||
div(class="input-group-btn")
|
||||
button(type="button", class="btn btn-primary dropdown-toggle", data-toggle="dropdown", aria-haspopup="true", aria-expanded="false") Category
|
||||
ul(class="dropdown-menu")
|
||||
each row in categories
|
||||
li: a(href="#", onClick="document.getElementById('category').value = '#{row.name}'") #{row.name}
|
||||
input(type="text", class="form-control", aria-label="Post category", name="category", id="category" value="#{categoryName}")
|
||||
li: a(href="#", onClick="document.getElementById('category').value = '#{row.data.name}'") #{row.get("name")}
|
||||
input(type="text", class="form-control", aria-label="Post category", name="category", id="category" value="#{category.get('name')}")
|
||||
div(class="input-group col-xs-10 col-xs-offset-1 col-md-10 col-md-offset-1")
|
||||
input(type="text", class="form-control", placeholder="Publish Date", name="postDate", value="#{formattedDate}")
|
||||
input(type="text", class="form-control", placeholder="Publish Date", name="postDate", value="#{post.get('postDate')}")
|
||||
div(class="input-group col-xs-10 col-xs-offset-1 col-md-10 col-md-offset-1")
|
||||
input(type="text", class="form-control", placeholder="Tags", name="tags" value="#{postTags}")
|
||||
div(class="row page-header")
|
||||
div(class="input-group col-xs-10 col-xs-offset-1 col-md-10 col-md-offset-1")
|
||||
textarea(class="form-control", rows="12", name="markdown")
|
||||
| #{post.markdown}
|
||||
| #{post.get("markdown")}
|
||||
div(class="row")
|
||||
div(class="input-group col-xs-10 col-xs-offset-1 col-md-10 col-md-offset-1")
|
||||
div(class="pull-left")
|
||||
|
|
|
@ -12,16 +12,16 @@ block content
|
|||
table(class="table table-striped")
|
||||
each post in posts
|
||||
tr
|
||||
td #{post.id}
|
||||
td: a(href="/admin/post/view/#{post.id}") #{post.title}
|
||||
td #{post.dateString}
|
||||
td #{post.get("uuid")}
|
||||
td: a(href="/admin/post/view/#{post.get('uuid')}") #{post.get("title")}
|
||||
td #{post.getShortDate()}
|
||||
td
|
||||
a(href="/admin/post/edit/#{post.id}") Edit
|
||||
a(href="/admin/post/edit/#{post.get('uuid')}") Edit
|
||||
| -
|
||||
a(href="/admin/post/delete/#{post.id}") Delete
|
||||
a(href="/admin/post/delete/#{post.get('uuid')}") Delete
|
||||
| -
|
||||
a(href="/admin/post/regenerate/#{post.id}") Regenerate
|
||||
a(href="/admin/post/regenerate/#{post.get('uuid')}") Regenerate
|
||||
| -
|
||||
a(href="/admin/post/publish/#{post.id}") Publish
|
||||
a(href="/admin/post/publish/#{post.get('uuid')}") Publish
|
||||
|
||||
|
||||
|
|
|
@ -20,8 +20,8 @@ block content
|
|||
div(class="input-group-btn")
|
||||
button(type="button", class="btn btn-primary dropdown-toggle", data-toggle="dropdown", aria-haspopup="true", aria-expanded="false") Category
|
||||
ul(class="dropdown-menu")
|
||||
each row in categories
|
||||
li: a(href="#", onClick="document.getElementById('category').value = '#{row.name}'") #{row.name}
|
||||
each doc in categories
|
||||
li: a(href="#", onClick="document.getElementById('category').value = '#{doc.data.name}'") #{doc.data.name}
|
||||
input(type="text", class="form-control", aria-label="Post category", name="category", id="category", value="Uncategorized")
|
||||
div(class="input-group col-xs-10 col-xs-offset-1 col-md-10 col-md-offset-1")
|
||||
input(type="text", class="form-control", placeholder="Publish Date", name="postDate")
|
||||
|
|
|
@ -9,12 +9,12 @@ block content
|
|||
include ./admin-messages.jade
|
||||
|
||||
div(class='page-header row')
|
||||
h3 #{post.title}
|
||||
h3 #{post.get('title')}
|
||||
|
||||
div(class='row')
|
||||
| #{date} --
|
||||
a(href="/admin/post/edit/#{post.id}") Edit
|
||||
| #{post.getShortDate()} --
|
||||
a(href="/admin/post/edit/#{post.get('uuid')}") Edit
|
||||
| -
|
||||
a(href="/admin/post/regenerate/#{post.id}") Regenerate
|
||||
a(href="/admin/post/regenerate/#{post.get('uuid')}") Regenerate
|
||||
|
||||
div(class='row') !{content}
|
||||
|
|
Loading…
Reference in a new issue