postNew: async function(req, res, next) { req.assert('title', 'Title must be at least 6 characters long').len(6); req.assert('markdown', 'Post must be at least 16 characters long').len(16); let errors = req.validationErrors(); if (errors) { req.flash('errors', errors); return res.redirect('back'); } try { let post = new Post(); let imagesDir = App.getConfig('imagesDir'); let postData = { user_id: req.user.get('id'), title: req.body.title, category_id: req.body.category, meta_description: req.body.meta_description || req.body.title, markdown: req.body.markdown, published: !!req.body.published, featured: !!req.body.featured }; if (req.files && req.files.length) { postData.image_url = '/uploads/' + req.files[0].filename; Queue.publish('email', JSON.stringify({ type: 'minify', url: 'public/uploads/' + postData.image_url })); } let tags = processTags(req.body.tags); post = await post.save(postData, {context: {user_id: req.user.get('id')}, updateTags: tags}); if (post.get('published')) { xmlrpc.ping(post.toJSON()); TwitBot.tweet('post', { id: post.get('id'), title: post.get('title'), body: 'https://nodeza.co.za/blog/' + post.get('slug') }); } req.flash('success', { msg: 'Post successfully created.' }); res.redirect('/blog/edit/' + post.get('id')); } catch (error) { console.error(error); req.flash('error', {msg: 'Database error, post not saved.'}); res.redirect('back'); } },
getSettings: function (req, res) { res.render('posts/config', { title: 'Posts Config', description: 'Posts Config', page: 'globalconfig', blog: App.getConfig('blog') }); },
getBlogCategory: function (req, res, error) { let posts = new Posts(); let slug = req.params.slug; let page = parseInt(req.query.p, 10); let currentpage = page || 1; let settings = App.getConfig('blog'); if (currentpage < 1) { res.redirect('/blog/category/' + slug); } Category.forge({slug: slug}) .fetch({columns: ['id', 'name']}) .then(function (model) { let categoryName = model.get('name'); return posts.fetchBy('created_at', { limit: settings.postsPerPage, page: currentpage, andWhere: ['category_id', '=', model.get('id')], base:'/blog/category/' + slug }, { columns: ['slug', 'html', 'title', 'category_id', 'published_at'], withRelated: ['category'] }) .then(function (collection) { res.render('posts/posts', { title: 'Blog', pagination: posts.pages, posts: collection.toJSON(), description: 'Node.js tutorials, articles and news', page: 'blog', tag: '', category: categoryName, query: {} }); }) .catch(function (error) { req.flash('errors', {'msg': error.message}); next(error); }); }) .catch(function (error) { req.flash('errors', {'msg': error.message}); next(error); }); },
getRSS: function (req, res, next) { let config = App.getConfig('site'); let Posts = App.getCollection('Posts'); config.baseUrl = config.baseUrl || 'http://' + req.headers.host; let feed = new RSS({ title: config.siteName, description: config.description, feed_url: config.baseUrl + '/rss', site_url: config.baseUrl, language: 'en', author: config.siteName }); Posts.forge() .fetchBy('published_at', { page: 1, limit: config.rssLimit }, { columns: ['id', 'slug', 'title', 'user_id', 'meta_description', 'published_at'], withRelated: ['created_by'] }) .then(function (collection) { collection.forEach(function (post) { feed.item({ guid: post.get('id'), title: post.get('title'), description: post.get('meta_description'), url: config.baseUrl + '/blog/' + post.get('slug'), author: post.related('created_by').get('name'), date: post.get('published_at') }); }); res.end(feed.xml()); }) .catch(function (error) { next(error); }); },
getPost: function (req, res, next) { let slug = req.params.slug; let settings = App.getConfig('blog'); let opts = {slug: slug}; if (!req.isAuthenticated()) { opts.published = 1; } return Post.forge(opts) .fetch({ withRelated: ['created_by', 'tags', 'category'], require: true }) .then(function (post) { let author = post.related('created_by').getJSON(['slug', 'name', 'about']); author.gravatar = post.related('created_by').gravatar(48); res.render('posts/post', { page: 'blog', config: settings, gravatar: post.related('created_by').gravatar(48), title: post.get('title'), description: post.get('meta_description') || '', author: author, category: post.related('category').toJSON(), url: 'http://' + req.headers.host + '/blog/' + slug, keywords: _.map(post.related('tags').toJSON(), 'name'), post: post.toJSON() }); return post.viewed(); }) .catch(function (error) { req.flash('errors', {'msg': error.message}); next(error); }); },
getBlog: function (req, res, next) { let posts = new Posts(); let currentpage = req.query.p ? parseInt(req.query.p, 10) : 1; let settings = App.getConfig('blog'); res.locals._page = 'blog'; if (currentpage < 1) { res.redirect('/blog'); } posts.fetchBy('published_at', { page: currentpage, limit: settings.postsPerPage, where: ['published_at', '<', new Date()] }, { columns: ['slug', 'html', 'title', 'category_id', 'published_at','image_url'], withRelated: ['category'] }) .then(function (collection) { res.render('posts/posts', { title: settings.title || 'Blog', pagination: posts.pages, posts: collection.toJSON(), description: settings.description || 'Node.js tutorials, articles and news', page: 'blog', tag: '', category: '', query: {}, config: settings }); }) .catch(function (error) { req.flash('errors', {'msg': error.message}); next(error); }); },
getEvent: function (req, res, next) { let slug = req.params.slug; let event = new nodeEvent({slug: slug}); let settings = App.getConfig('events'); event.fetch() .then(function (event) { res.render('events/event', { config: settings, title: event.get('title'), parseDate: event.parseDate(), parseTime: event.parseTime(), myEvent: event.toJSON(), description: event.get('title'), page: 'events' }); return event.viewed(); }) .catch(function (error) { req.flash('errors', {'msg': error.message}); next(error); }); },
/* This file contains the program for creating an rss feed */ const App = require('widget-cms'); const RSS = require('rss'); const config = App.getConfig('site'); const Posts = App.getCollection('Posts'); /* Creates rss feed */ module.exports = function (req, res) { "use strict"; config.baseUrl = config.baseUrl || 'http://' + req.headers.host; let feed = new RSS({ title: config.siteName, description: config.description, feed_url: config.baseUrl + '/rss', site_url: config.baseUrl, language: 'en', author: config.siteName }); return Posts.forge() .fetchBy('published_at', { page: 1,
"use strict"; const GitHubStrategy = require('passport-github').Strategy; const LocalStrategy = require('passport-local').Strategy; const App = require('widget-cms'); const passport = App.passport; const User = App.getModel('User'); const Tokens = App.getCollection('Tokens'); const Token = App.getModel('Token'); const config = App.getConfig('github'); const githubConfig = App.getConfig('github'); passport.deserializeUser(async function(id, done) { try { let user = await User.forge({id: id}).fetch({withRelated: ['role', 'tokens','unreadmessages'],require: true}); done(false, user); } catch (error) { done(error); } }); passport.serializeUser(function(user, done) { done(null, user.get('id')); }); passport.use(new GitHubStrategy(githubConfig, async function (req, accessToken, refreshToken, profile, done) { console.log(profile);