Initial Commit

This commit is contained in:
2018-09-13 21:15:47 +02:00
commit 09f406cba7
84 changed files with 6920 additions and 0 deletions
+46
View File
@@ -0,0 +1,46 @@
const express = require("express")
const passport = require("../middleware/passport")
const router = express.Router()
function saveReferer(req, res, next) {
req.session.loginReferrer = req.get("Referer")
req.session.save()
next()
}
// Perform the login, after login Auth0 will redirect to callback
router.get("/login", saveReferer, passport.authenticate("auth0", {scope: "openid username profile"}), (req, res) => {
res.redirect("/")
})
router.get("/callback", passport.authenticate("auth0", { failureRedirect: "/auth/login" }), (req, res) => {
if (req.user == null) {
throw new Error("user null");
}
res.redirect(req.session.loginReferrer || "/");
})
router.get("/user", (req, res) => {
if (req.user == null) {
return res.status(401).json({error: {message: "Unauthorized"}})
}
const name = req.user._json.name
// TODO: Grab data from rpdata-api user database
res.json({data: {
name
}})
})
router.get("/logout", saveReferer, (req, res) => {
req.logout()
res.redirect(req.session.loginReferrer || "/");
})
module.exports = router
+56
View File
@@ -0,0 +1,56 @@
const express = require("express")
const jwt = require("jsonwebtoken")
const config = require("../config")
const { query } = require("../rpdata/client")
const router = express.Router()
router.post("/", (req, res) => {
if (!req.header("Content-Type").startsWith("application/json")) {
res.status(400).json({errors: [{message: "Incorrect input type, expected application/json"}]})
return
}
const user = res.locals.user
const permissions = (req.header("X-Permissions") || "").split(",").filter(t => t != "" && t != "undefined" && t != "null")
let authorization = req.header("Authorization")
if (authorization == "null") {
authorization = ""
}
if (!authorization && permissions.length > 0 && user.loggedIn) {
authorization = `Bearer ${generateToken(user.name, permissions)}`
}
fetch(config.graphqlEndpoint, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": authorization,
},
body: JSON.stringify(req.body),
credentials: "include",
}).then(fetchRes => {
res.setHeader("Content-Type", fetchRes.headers.get("Content-Type"))
res.status(fetchRes.status)
return fetchRes.json()
}).then(json => {
res.json(json)
}).catch(err => {
res.status(500).text(err)
return null
})
})
/**
* @param {string} user
* @param {string[]} permissions
*/
function generateToken(user, permissions) {
return jwt.sign({user, permissions, exp: Math.floor((Date.now() / 1000) + 1200)}, config.backend.secret, {header: {kid: config.backend.kid}})
}
module.exports = router
+19
View File
@@ -0,0 +1,19 @@
const express = require("express")
const router = express.Router()
const {logHeaderApi} = require("../../rpdata/api/LogHeader")
const listTemplate = require("../../marko/page/logs/list.marko")
router.get("/", async(req, res) => {
try {
res.markoAsync(listTemplate, {
logs: logHeaderApi.list({limit: 0}),
selected: {index: true},
})
} catch(err) {
console.error(err)
}
})
module.exports = router
+13
View File
@@ -0,0 +1,13 @@
const express = require("express")
const router = express.Router()
const {storyApi} = require("../../rpdata/api/Story")
const viewTemplate = require("../../marko/page/story-content/view.marko")
module.exports = async(req, res, next) => {
res.markoAsync(viewTemplate, {
story: storyApi.find(req.params.id),
selected: {index: true},
})
}
+22
View File
@@ -0,0 +1,22 @@
const express = require("express")
const router = express.Router()
const common = require("./common")
const {storyApi} = require("../../rpdata/api/Story")
const {Tag} = require("../../rpdata/api/Tag")
const listTemplate = require("../../marko/page/story/list.marko")
router.get("/:category", common, async(req, res) => {
try {
res.markoAsync(listTemplate, {
stories: storyApi.list({category: req.params.category}),
selected: {category: req.params.category},
})
} catch(err) {
console.error(err)
}
})
module.exports = router
+24
View File
@@ -0,0 +1,24 @@
const express = require("express")
const router = express.Router()
const common = require("./common")
const {storyApi} = require("../../rpdata/api/Story")
const {Tag} = require("../../rpdata/api/Tag")
const listTemplate = require("../../marko/page/story/list.marko")
router.get("/:tagkind/:tagname", common, async(req, res) => {
try {
const tag = new Tag(req.params.tagkind, req.params.tagname)
res.markoAsync(listTemplate, {
stories: storyApi.list({tags: tag}),
menuTags: [tag],
selected: {tag: `${tag.kind}:${tag.name}`},
})
} catch(err) {
console.error(err)
}
})
module.exports = router
+7
View File
@@ -0,0 +1,7 @@
const {storyApi} = require("../../rpdata/api/Story")
module.exports = (req, res, next) => {
res.locals.categories = storyApi.categories()
next()
}
+20
View File
@@ -0,0 +1,20 @@
const express = require("express")
const router = express.Router()
const common = require("./common")
const {storyApi} = require("../../rpdata/api/Story")
const listTemplate = require("../../marko/page/story/list.marko")
router.get("/", common, (req, res) => {
try {
res.markoAsync(listTemplate, {
stories: storyApi.list(),
selected: {index: true},
})
} catch(err) {
console.error(err)
}
})
module.exports = router
+20
View File
@@ -0,0 +1,20 @@
const express = require("express")
const router = express.Router()
const common = require("./common")
const {tagApi} = require("../../rpdata/api/Tag")
const tagListTemplate = require("../../marko/page/story/tag-list.marko")
router.get("/", common, (req, res) => {
try {
res.markoAsync(tagListTemplate, {
tags: tagApi.list(),
selected: {tags: true},
})
} catch(err) {
console.error(err)
}
})
module.exports = router