79 lines
2.1 KiB
TypeScript
79 lines
2.1 KiB
TypeScript
import * as Glue from "@hapi/glue";
|
|
import * as Metamigo from "@digiresilience/metamigo-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 "@digiresilience/metamigo-db";
|
|
import AppPlugin from "../app";
|
|
import type { IAppConfig } from "../config";
|
|
|
|
const build = async (config: IAppConfig): Promise<Glue.Manifest> => {
|
|
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;
|