958b846401
For some reason, loading /fetch runs the fetch page, but then ends up rendering the / page instead. Can't figure it out, but this solves it for now so let's go with it till we come up with a proper solution :P
131 lines
2.8 KiB
JavaScript
131 lines
2.8 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: true,
|
|
watch: true,
|
|
metaInfo: {
|
|
title: 'Seance',
|
|
},
|
|
extractCSS: true,
|
|
cssOutputPath: '/css/styles.css',
|
|
publicPath: 'public',
|
|
compilerConfig: {
|
|
// custom webpack config
|
|
},
|
|
compilerConfigCallback: function(webpackConfig) {
|
|
// change the merged webpackconfig if you like
|
|
return webpackConfig;
|
|
},
|
|
|
|
}
|
|
|
|
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}`)
|
|
})
|