seance/server.js
Hippo ee362e8954 Change host protocol depending on website and localhost
If you're on localhost, your protocol (http vs https) takes
precedence. If not, the other website's takes precedence, because
otherwise you could end up being blocked by security
2020-05-10 23:03:14 +05:30

125 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: true,
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}`)
})