import * as Glue from "@hapi/glue"; import * as Metamigo from "common"; import * as Blipp from "blipp"; import HapiBasic from "@hapi/basic"; import HapiJwt from "hapi-auth-jwt2"; import HapiPostgraphile from "hapi-postgraphile"; import { getPostGraphileOptions } from "db"; import AppPlugin from "../app"; import type { IAppConfig } from "../config"; const build = async (config: IAppConfig): Promise => { const { port, address } = config.server; const metamigoPlugins = Metamigo.defaultPlugins(config); return { server: { port, address, debug: false, // We use pino not the built-in hapi logger routes: { validate: { failAction: Metamigo.validatingFailAction, }, }, }, register: { plugins: [ // jwt plugin, required for our jwt auth plugin { plugin: HapiJwt }, // Blipp prints the nicely formatted list of endpoints at app boot { plugin: Blipp }, // load the metamigo base plugins ...metamigoPlugins, // basic authentication, required by hapi-nextauth { plugin: HapiBasic }, // load our main app { plugin: AppPlugin, options: { config, }, }, // load Postgraphile { plugin: HapiPostgraphile, options: { route: { path: "/graphql", options: { auth: { strategies: ["nextauth-jwt"], mode: "optional", }, }, }, pgConfig: config.postgraphile.authConnection, schemaName: "app_public", schemaOptions: { ...getPostGraphileOptions(), jwtAudiences: [config.nextAuth.audience], jwtSecret: "", // unauthenticated users will hit the database with this role pgDefaultRole: "app_anonymous", }, }, }, ], }, }; }; const Manifest = { build, }; export default Manifest;