ee362e8954
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
125 lines
2.6 KiB
JavaScript
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}`)
|
|
})
|