const express = require('express') const bodyParser = require('body-parser') const { vueRenderer } = require('@doweb/vuexpress') const slugify = require('underscore.string/slugify') const fs = require('fs') const app = express() // ALlow URLencoded API app.use(bodyParser.urlencoded({ extended: false })) // Allow JSON API app.use(bodyParser('json')) // Enable static files app.use(express.static('public')) app.use(express.static('static')) // Set up VueXpress let options = { views: './views', cache: false, watch: process.env.NODE_ENVIRONMENT == 'dev', metaInfo: { title: 'Seance', }, extractCSS: true, cssOutputPath: '/css/styles.css', publicPath: 'public', } const renderer = vueRenderer(options) app.use(renderer) // Views app.get('/', (req, res) => { res.render('index', { baseUrl: req.hostname.startsWith('localhost') ? req.protocol + '://' + req.headers.host : '//' + req.hostname, // auto choose http or https }) }) app.get('/fetch/', (req, res) => { res.redirect('/') }) app.post('/fetch/', (req, res) => { var json var post try { json = JSON.parse(req.body.data) } catch (err) { console.log(err) } if (json) { post = json.payload.value console.log(post) // set author post.author = post.displayAuthor // If the author's not available, get it from somewhere else // function courtesy mediumexporter let authors = [] if (json.payload.references && json.payload.references.User) { Object.keys(json.payload.references.User).forEach(k => { let u = json.payload.references.User[k] authors.push({ name: u.name, username: u.username, userId: u.userId }) }) post.authors = authors if (!post.author) { post.author = authors[0].name } } // set featured image if (post.virtuals.previewImage) { post.featuredImage = 'https://cdn-images-1.medium.com/max/800/' + post.virtuals.previewImage.imageId } // set ID if (!post.slug) { post.slug = slugify(post.title) } // save to disk fs.writeFileSync(`${post.slug}.json`, JSON.stringify(json), 'utf-8') } // render the final post res.render('fetch-medium', { post: { title: post.title, subtitle: post.content.subtitle, author: post.author, featuredImage: post.featuredImage, mediumUrl: post.mediumUrl, } }) }) app.get('/api/', (req, res) => { res.json({ status: 'success', message: 'Welcome to the Seance API :)', }) }) const port = process.env.PORT || 4000 app.listen(port, () => { console.log(`Listening on ${port}`) })