sharyn
Version:
Combines all the other packages under one.
60 lines (54 loc) • 1.67 kB
Flow
// @flow
// flow-disable-next-line
import { IS_LOCAL_ENV_TYPE, NO_SSR } from '@sharyn/env'
// flow-disable-next-line
import { graphqlCall, findMatch } from '@sharyn/shared'
const getSsrData = async (ctx: Object, allRoutes: Object[]) => {
let data
const { user } = ctx.session
if (!NO_SSR) {
const { match, route } = findMatch(allRoutes, ctx.req.url, !!user)
if (match) {
const { cookie } = ctx.req.headers
const urlBase = `http${IS_LOCAL_ENV_TYPE ? '' : 's'}://${ctx.request.host}`
if (ctx.request.method === 'GET' && route.mainQuery) {
const { query, mapResp, mapUrlParams } = route.mainQuery
data = await graphqlCall({
urlBase,
query,
urlParams: match.params,
mapUrlParams,
mapResp,
cookie,
})
}
if (ctx.request.method === 'POST' && route.mainMutation) {
const { query, mapFields, mapUrlParams, mapResp, successRedirect } = route.mainMutation
data =
(await graphqlCall({
urlBase,
query,
urlParams: match.params,
mapUrlParams,
fields: ctx.request.body,
mapFields,
mapResp,
cookie,
})) ?? {}
data.previousFields = ctx.request.body
if (!data.errors && !data.invalidFields && successRedirect) {
ctx.redirect(
successRedirect instanceof Function
? successRedirect(data, ctx.request.body)
: successRedirect,
)
return {}
}
}
} else {
ctx.status = 404
}
}
return data
}
export default getSsrData