seance/server.js
2020-05-10 23:08:37 +05:30

124 lines
2.6 KiB
JavaScript

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}`)
})