@paroicms/server
Version:
The ParoiCMS server
96 lines • 5.45 kB
JavaScript
import { ApolloServer } from "@apollo/server";
import { expressMiddleware } from "@as-integrations/express5";
import { ApiError } from "@paroicms/public-server-lib";
import express from "express";
import { GraphQLError } from "graphql";
import multer from "multer";
import { downloadBackupController } from "../admin-backend/backup/backup.controller.js";
import { loginController } from "../admin-backend/login/login.controller.js";
import { uploadMediaController } from "../admin-backend/media/media-upload.controller.js";
import { platformLogger } from "../context.js";
import { getPaSiteContext } from "../express/http-helpers.js";
import { mergeReqHandlers, reqHandlerToExpressMiddleware, wrapRouteController, } from "../express/route-handler-wrapper.js";
import { federateResolvers, typeDefs } from "../graphql/apollo-server-init.js";
import { createComplexityPlugin } from "../graphql/complexity-plugin.js";
import { disableApolloStudioPlugin } from "../graphql/disable-apollo-studio-plugin.js";
import { createErrorConverterPlugin } from "../graphql/error-converter-plugin.js";
import { protectedAccessController } from "../protected-site/protected-access.controller.js";
import { protectedSiteReqHandler } from "../protected-site/protected-site.req-handler.js";
import { checkPasswordResetController, setAccountPasswordController, } from "../public-api/password-reset/password-reset.controller.js";
import { healthCheckController } from "../public-api/public-api-controller.js";
import { favicon16x16Controller, robotsTxtController, } from "../rendered-site/common-routes.controller.js";
import { feedReqHandler } from "../rendered-site/feed/feed.req-handler.js";
import { serveCacheImageController, serveFilecontroller, } from "../rendered-site/media-serve/media-serve.controller.js";
import { previewReqHandler } from "../rendered-site/preview.req-handler.js";
import { siteRouterReqHandler } from "../rendered-site/site-router.req-handler.js";
import { mergeExpressMiddlewares } from "./express-utils.js";
import { toPaHttpContext } from "./pa-http-context.js";
import { pluginPublicApiReqHandler } from "./public-api.req-handler.js";
import { adminUiFilesReqHandler, adminUiPluginsReqHandler, renderedPageAssetsReqHandler, } from "./static-files.req-handler.js";
import { staticFilesReqHandler, unprotectedStaticFilesReqHandler, } from "./static-site-files.req-handler.js";
export async function createAdminUiGraphqlMiddleware() {
const developmentMode = process.env.NODE_ENV === "development";
const apolloServer = new ApolloServer({
typeDefs,
resolvers: federateResolvers(),
plugins: [
createComplexityPlugin(),
createErrorConverterPlugin(),
...(developmentMode ? [] : [disableApolloStudioPlugin()]),
],
introspection: developmentMode,
formatError(formattedError, error) {
if (error instanceof GraphQLError && (!error.cause || error.cause instanceof ApiError)) {
return formattedError;
}
platformLogger.error("Unexpected graphql error", formattedError, error);
return {
message: "Internal Server Error",
code: "INTERNAL_SERVER_ERROR",
};
},
});
await apolloServer.start();
return expressMiddleware(apolloServer, {
context: async ({ req, res }) => ({
siteContext: getPaSiteContext(req),
httpContext: toPaHttpContext(req, res),
}),
});
}
export function createMinimalSiteMiddleware() {
const router = express.Router();
const upload = multer();
router.post("/adm/backend/upload", upload.single("file"), wrapRouteController(uploadMediaController));
router.get("/adm/backend/backup/:backupName", wrapRouteController(downloadBackupController));
router.get("/api/v1/healthcheck", wrapRouteController(healthCheckController));
router.post("/api/v1/login", wrapRouteController(loginController, { allowMigration: true }));
router.post("/api/v1/set-account-password", wrapRouteController(setAccountPasswordController));
router.post("/api/v1/check-password-reset", wrapRouteController(checkPasswordResetController));
router.post("/api/v1/protected-access", wrapRouteController(protectedAccessController));
router.get("/robots.txt", wrapRouteController(robotsTxtController));
router.get("/favicon.ico", wrapRouteController(favicon16x16Controller));
return mergeExpressMiddlewares([
reqHandlerToExpressMiddleware(mergeReqHandlers([unprotectedStaticFilesReqHandler, adminUiPluginsReqHandler])),
router,
reqHandlerToExpressMiddleware(adminUiFilesReqHandler, { allowMigration: true }),
]);
}
export function createRenderedSiteMiddleware() {
const router = express.Router();
router.get("/medias/:mediaId/file/:nameAndExt", wrapRouteController(serveFilecontroller));
router.get("/medias/:mediaId/cache/:resourceVersion/:nameAndExt", wrapRouteController(serveCacheImageController));
return mergeExpressMiddlewares([
reqHandlerToExpressMiddleware(mergeReqHandlers([
protectedSiteReqHandler,
staticFilesReqHandler,
pluginPublicApiReqHandler,
renderedPageAssetsReqHandler,
feedReqHandler,
previewReqHandler,
siteRouterReqHandler,
])),
router,
]);
}
//# sourceMappingURL=site-middleware.js.map