import Book from '../../data/Book'; import Auth from '../../data/Auth'; import Settings, { SETTINGS_FILE } from '../../data/Settings'; import * as DataEvent from '../../../src/com/events/DataEvent'; import Render from '../../data/Render'; const express = require('express'); const router = express.Router(); const multer = require('multer'); const fs = require('fs-extra'); const moment = require('moment'); const book = new Book(); const auth = new Auth(); const settings = new Settings(); const render = new Render(); const _ = require('lodash'); const uploadPath = './public/assets/images/blog/' + moment().format('YYYY') + '/' + moment().format('MM'); var storage = multer.diskStorage({ destination: function (req, file, cb) { fs.ensureDir(uploadPath, () => { // dir has now been created, including the directory it is to be placed in cb(null, uploadPath); }); }, filename: function (req, file, cb) { var splice = file.originalname.split(':'); cb(null, splice[0]); } }); var feature_upload = multer({ storage: storage }).array('feature_image'); var post_upload = multer({ storage: storage }).array('post_image'); /** * Retrieves a page of a published entries * @public */ router.get('/published/:pageNum?', (req, res) => { //console.log('PAGE NUM', req.params.pageNum); let pageNum = req.params.pageNum; if (pageNum === null || pageNum === '' || !pageNum) pageNum = 1; let pages = []; book.getPage().then(result => { result.sort((a, b) => parseFloat(b.metadata.id) - parseFloat(a.metadata.id)); let displayed = _.filter(result, page => { return ( page.metadata.deleted === false && page.metadata.published === true && page.metadata.layout != 'index' ); }); var pageLimit = 6; var count = Math.ceil(displayed.length / pageLimit); if (pageNum > count || isNaN(pageNum)) res.json({ type: DataEvent.REQUEST_LAME, message: "That page doesn't exist, champ." }); var rangeIndex = pageNum * pageLimit - pageLimit; let meta = []; for (let index = 0; index < pageLimit; index++) { const page = displayed[index + rangeIndex]; try { if ( page.metadata.id != null && page.metadata.deleted === false && page.metadata.published === true ) { let entry = page.metadata; entry.content = page.content; //console.log('ENTRY', entry); pages.push({ page: entry, displayDate: moment(page.metadata.created).fromNow() }); } } catch (e) { //console.log("NO POST", e) } } meta.push({ currentPage: pageNum, totalPages: count }); let data = { pages: pages, meta: meta }; res.json({ type: DataEvent.REQUEST_GOOD, message: 'This is Page ' + pageNum + ' of ' + count, data: data }); }); }); /** * Retrieves single entry * @public */ router.get('/single/:id', (req, res) => { let id = req.params.id; if (id === null || id === '') res.json({ type: DataEvent.REQUEST_LAME, message: " Nah, this isn't here." }); book.getPage(id) .then(page => { let entry = page.metadata; entry.content = page.content; res.json({ type: DataEvent.REQUEST_GOOD, message: 'Found it. Here you go.', data: entry }); }) .catch(err => { res.json({ type: DataEvent.REQUEST_LAME, message: "This doesn't seem to be here, homie.", err: err.message }); }); }); /** * Add/Update Page */ router.post('/write/:task?', feature_upload, (req, res) => { auth.authCheck(req) .then(() => { let body = _.mapValues(req.body); let feature = ''; let task = ''; req.params.task === 'new' ? (task = DataEvent.API_PAGE_CREATE) : (task = DataEvent.API_PAGE_WRITE); if (req.files.length > 0) { var path = req.files[0].path; //console.log('NEW FEATURE URL', path); feature = '/' + path.substring(7, path.length); } else { var url = body.feature_image; //switch this to the new feature path edit if (url != null || url != undefined || url != '') { let chunks = url.split('/'); let strip = chunks[0] + '/' + chunks[1] + chunks[2]; feature = url.substr(strip.length + 1, url.length); } else { feature = ''; } } body.feature = feature; body.deleted = false; //if title changes, get rid of a pages with old title if (body.current_title !== body.slug) { let path = moment(body.created).format('YYYY') + '/' + moment(body.created).format('MM'); //remove html page fs.unlink('public/' + path + '/' + body.current_title + '.html') .then() .catch(() => { //console.log('HTML ERROR', err); }); //remove markdown fs.unlink('content/pages/' + path + '/' + body.current_title + '.md') .then() .catch(() => { //console.log('MD ERROR', err); }); } book.editPage(body, body.page_uuid, task, req.session.user) .then(result => { if (result.type === DataEvent.PAGE_ADDED) { settings.updatePageIndex(); } //load all page data and render if render on save flag is set in settings file getBookData() .then(result => { if (result.settings.global.renderOnSave === 'true') { render .publishAll( result.pages, result.settings.global.theme, req.session.user.handle ) .then(response => { res.json({ type: response.type, message: response.message }); }) .catch(err => { res.json({ type: DataEvent.PAGES_NOT_RENDERED, message: 'Uh oh. Pages not rendered, sport', error: err }); }); } else { //console.log('DONT RENDER PAGES'); } }) .catch(() => { //console.log(); }); res.json(result); }) .catch(err => { res.json(err); }); }) .catch(err => { res.json(err); }); }); /** * Soft deletes Page */ router.post('/delete', (req, res) => { auth.authCheck(req) .then(() => { book.editPage([], req.body.id, DataEvent.API_PAGE_DELETE, req.session.user) .then(result => { //remove item from menu in settings res.json(result); }) .catch(err => { res.json(err); }); }) .catch(err => { res.json(err); }); }); /** * Uploads image from a Page content */ router.post('/add-post-image', post_upload, function (req, res) { //console.log(req.body); var image = req.files[0].path; return res.json({ type: DataEvent.POST_IMAGE_ADDED, message: 'Added Image', url: '/' + image.substr(7, image.length) }); }); module.exports = router; function getBookData() { return new Promise((resolve, reject) => { let getSettings = settings.load(SETTINGS_FILE); let getBook = book.getPage(); Promise.all([getSettings, getBook]) .then(result => { const [settings, pages] = result; let data = { settings: settings, pages: pages }; resolve(data); }) .catch(err => { reject(err); }); }); }