{"version":3,"file":"ContentApiControllerFactory.cjs","sources":["../../../../../packages/engine-http/src/content/ContentApiControllerFactory.ts"],"sourcesContent":["import { HttpController } from '../application'\nimport { ProjectContextResolver } from '../project-common'\nimport { HttpErrorResponse, HttpResponse } from '../common'\nimport { StageBySlugQuery } from '@contember/engine-system-api'\nimport { NotModifiedChecker } from './NotModifiedChecker'\nimport { ContentGraphQLContextFactory } from './ContentGraphQLContextFactory'\nimport { ContentQueryHandler, ContentQueryHandlerFactory } from './ContentQueryHandlerFactory'\nimport { GraphQLSchema } from 'graphql'\nimport { GraphQLKoaState } from '../graphql'\nimport { GraphQlSchemaFactory } from './GraphQlSchemaFactory'\n\nconst debugHeader = 'x-contember-debug'\n\nexport class ContentApiControllerFactory {\n\tconstructor(\n\t\tprivate readonly notModifiedChecker: NotModifiedChecker,\n\t\tprivate readonly contentGraphqlContextFactory: ContentGraphQLContextFactory,\n\t\tprivate readonly handlerFactory: ContentQueryHandlerFactory,\n\t\tprivate readonly projectContextResolver: ProjectContextResolver,\n\t\tprivate readonly graphQlSchemaFactory: GraphQlSchemaFactory,\n\t) {\n\t}\n\n\tcreate(): HttpController {\n\t\tconst handlerCache = new WeakMap<GraphQLSchema, ContentQueryHandler>()\n\t\treturn async context => {\n\t\t\tconst { params, timer, projectGroup, authResult, request, koa } = context\n\t\t\tif (!authResult) {\n\t\t\t\treturn new HttpErrorResponse(401, 'Authentication required')\n\t\t\t}\n\t\t\tconst { projectContainer, project } = await this.projectContextResolver.resolve(context)\n\n\t\t\tconst logger = context.logger.child({\n\t\t\t\tproject: project.slug,\n\t\t\t})\n\n\t\t\tconst systemDatabase = projectContainer.systemReadDatabaseContext\n\t\t\tconst stage = await systemDatabase.queryHandler.fetch(new StageBySlugQuery(params.stageSlug))\n\t\t\tif (!stage) {\n\t\t\t\treturn new HttpErrorResponse(404, `Stage ${params.stageSlug} NOT found`)\n\t\t\t}\n\t\t\tconst notModifiedRes = await this.notModifiedChecker.checkNotModified({\n\t\t\t\trequest: context.request,\n\t\t\t\tbody: context.body,\n\t\t\t\ttimer: context.timer,\n\t\t\t\tsystemDatabase,\n\t\t\t\tstageId: stage.id,\n\t\t\t})\n\t\t\tif (notModifiedRes?.isModified === false) {\n\t\t\t\treturn new HttpResponse(304)\n\t\t\t}\n\n\t\t\tconst schemaWithMeta = await projectContainer.contentSchemaResolver.getSchema({ db: systemDatabase, stage: stage.slug, normalize: true })\n\t\t\tconst schema = schemaWithMeta.schema\n\t\t\tconst { effective: memberships, fetched: fetchedMemberships } = await timer(\n\t\t\t\t'MembershipFetch',\n\t\t\t\t() => projectGroup.projectMembershipResolver.resolveMemberships({\n\t\t\t\t\trequest: koa,\n\t\t\t\t\tacl: schema.acl,\n\t\t\t\t\tprojectSlug: project.slug,\n\t\t\t\t\tidentity: {\n\t\t\t\t\t\tidentityId: authResult.identityId,\n\t\t\t\t\t\tpersonId: authResult.personId ?? undefined,\n\t\t\t\t\t\troles: authResult.roles,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t)\n\n\t\t\tlogger.debug('Memberships fetched', { memberships })\n\n\t\t\tconst debugHeaderValue = request.headers[debugHeader]\n\t\t\tif (Array.isArray(debugHeaderValue)) {\n\t\t\t\treturn new HttpErrorResponse(400, `Invalid format of ${debugHeader}`)\n\t\t\t}\n\t\t\tconst requestDebug = debugHeaderValue === '1' && fetchedMemberships.some(it => schema.acl.roles[it.role]?.debug)\n\t\t\tif (requestDebug) {\n\t\t\t\tcontext.requestDebugMode = true\n\t\t\t}\n\n\t\t\tconst projectRoles = memberships.map(it => it.role)\n\n\t\t\tconst { schema: graphQlSchema, permissions } = await timer(\n\t\t\t\t'GraphQLSchemaCreate',\n\t\t\t\t() => this.graphQlSchemaFactory.create(schema, {\n\t\t\t\t\tprojectRoles: projectRoles,\n\t\t\t\t}, project),\n\t\t\t)\n\n\n\t\t\tconst schemaDatabaseMetadata = await projectContainer.projectDatabaseMetadataResolver.resolveDatabaseMetadata(systemDatabase, schema, stage.schema)\n\n\t\t\tconst handler = await (async () => {\n\t\t\t\tconst existingHandler = handlerCache.get(graphQlSchema)\n\t\t\t\tif (existingHandler) {\n\t\t\t\t\treturn existingHandler\n\t\t\t\t}\n\t\t\t\tconst newHandler = await this.handlerFactory.create(graphQlSchema)\n\t\t\t\thandlerCache.set(graphQlSchema, newHandler)\n\t\t\t\treturn newHandler\n\t\t\t})()\n\n\t\t\tawait logger.scope(async logger => {\n\t\t\t\tlogger.debug('Content query processing started')\n\n\t\t\t\tawait timer('GraphQL', () => handler({\n\t\t\t\t\trequest: koa.request,\n\t\t\t\t\tresponse: koa.response,\n\t\t\t\t\tcreateContext: ({ operation }) => {\n\t\t\t\t\t\t(koa.state as GraphQLKoaState).graphql = {\n\t\t\t\t\t\t\toperationName: operation,\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst connection = operation === 'query' ? projectContainer.readConnection : projectContainer.connection\n\t\t\t\t\t\tconst contentDatabase = connection.createClient(stage.schema, { module: 'content' })\n\n\t\t\t\t\t\treturn this.contentGraphqlContextFactory.create({\n\t\t\t\t\t\t\tdb: contentDatabase,\n\t\t\t\t\t\t\tauthResult,\n\t\t\t\t\t\t\tmemberships,\n\t\t\t\t\t\t\tpermissions,\n\t\t\t\t\t\t\tschemaDatabaseMetadata,\n\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\tschemaMeta: { id: schemaWithMeta.meta.id },\n\t\t\t\t\t\t\ttimer,\n\t\t\t\t\t\t\trequestDebug,\n\t\t\t\t\t\t\tsystemSchema: projectContainer.systemDatabaseContextFactory.schemaName,\n\t\t\t\t\t\t\tstage,\n\t\t\t\t\t\t\tproject,\n\t\t\t\t\t\t})\n\t\t\t\t\t},\n\t\t\t\t}))\n\t\t\t\tlogger.debug('Content query finished')\n\t\t\t})\n\n\n\t\t\tnotModifiedRes?.setResponseHeader(context.response)\n\t\t}\n\t}\n}\n"],"names":["HttpErrorResponse","StageBySlugQuery","HttpResponse","logger"],"mappings":";;;;AAWA,MAAM,cAAc;AAEb,MAAM,4BAA4B;AAAA,EACxC,YACkB,oBACA,8BACA,gBACA,wBACA,sBAChB;AALgB,SAAA,qBAAA;AACA,SAAA,+BAAA;AACA,SAAA,iBAAA;AACA,SAAA,yBAAA;AACA,SAAA,uBAAA;AAAA,EAAA;AAAA,EAIlB,SAAyB;AAClB,UAAA,mCAAmB,QAA4C;AACrE,WAAO,OAAM,YAAW;AACvB,YAAM,EAAE,QAAQ,OAAO,cAAc,YAAY,SAAS,QAAQ;AAClE,UAAI,CAAC,YAAY;AACT,eAAA,IAAIA,aAAAA,kBAAkB,KAAK,yBAAyB;AAAA,MAAA;AAEtD,YAAA,EAAE,kBAAkB,QAAQ,IAAI,MAAM,KAAK,uBAAuB,QAAQ,OAAO;AAEjF,YAAA,SAAS,QAAQ,OAAO,MAAM;AAAA,QACnC,SAAS,QAAQ;AAAA,MAAA,CACjB;AAED,YAAM,iBAAiB,iBAAiB;AAClC,YAAA,QAAQ,MAAM,eAAe,aAAa,MAAM,IAAIC,gBAAA,iBAAiB,OAAO,SAAS,CAAC;AAC5F,UAAI,CAAC,OAAO;AACX,eAAO,IAAID,aAAkB,kBAAA,KAAK,SAAS,OAAO,SAAS,YAAY;AAAA,MAAA;AAExE,YAAM,iBAAiB,MAAM,KAAK,mBAAmB,iBAAiB;AAAA,QACrE,SAAS,QAAQ;AAAA,QACjB,MAAM,QAAQ;AAAA,QACd,OAAO,QAAQ;AAAA,QACf;AAAA,QACA,SAAS,MAAM;AAAA,MAAA,CACf;AACG,UAAA,gBAAgB,eAAe,OAAO;AAClC,eAAA,IAAIE,0BAAa,GAAG;AAAA,MAAA;AAG5B,YAAM,iBAAiB,MAAM,iBAAiB,sBAAsB,UAAU,EAAE,IAAI,gBAAgB,OAAO,MAAM,MAAM,WAAW,MAAM;AACxI,YAAM,SAAS,eAAe;AAC9B,YAAM,EAAE,WAAW,aAAa,SAAS,mBAAA,IAAuB,MAAM;AAAA,QACrE;AAAA,QACA,MAAM,aAAa,0BAA0B,mBAAmB;AAAA,UAC/D,SAAS;AAAA,UACT,KAAK,OAAO;AAAA,UACZ,aAAa,QAAQ;AAAA,UACrB,UAAU;AAAA,YACT,YAAY,WAAW;AAAA,YACvB,UAAU,WAAW,YAAY;AAAA,YACjC,OAAO,WAAW;AAAA,UAAA;AAAA,QAEnB,CAAA;AAAA,MACF;AAEA,aAAO,MAAM,uBAAuB,EAAE,YAAA,CAAa;AAE7C,YAAA,mBAAmB,QAAQ,QAAQ,WAAW;AAChD,UAAA,MAAM,QAAQ,gBAAgB,GAAG;AACpC,eAAO,IAAIF,aAAA,kBAAkB,KAAK,qBAAqB,WAAW,EAAE;AAAA,MAAA;AAErE,YAAM,eAAe,qBAAqB,OAAO,mBAAmB,KAAK,CAAA,OAAM,OAAO,IAAI,MAAM,GAAG,IAAI,GAAG,KAAK;AAC/G,UAAI,cAAc;AACjB,gBAAQ,mBAAmB;AAAA,MAAA;AAG5B,YAAM,eAAe,YAAY,IAAI,CAAA,OAAM,GAAG,IAAI;AAElD,YAAM,EAAE,QAAQ,eAAe,YAAA,IAAgB,MAAM;AAAA,QACpD;AAAA,QACA,MAAM,KAAK,qBAAqB,OAAO,QAAQ;AAAA,UAC9C;AAAA,QAAA,GACE,OAAO;AAAA,MACX;AAGM,YAAA,yBAAyB,MAAM,iBAAiB,gCAAgC,wBAAwB,gBAAgB,QAAQ,MAAM,MAAM;AAE5I,YAAA,UAAU,OAAO,YAAY;AAC5B,cAAA,kBAAkB,aAAa,IAAI,aAAa;AACtD,YAAI,iBAAiB;AACb,iBAAA;AAAA,QAAA;AAER,cAAM,aAAa,MAAM,KAAK,eAAe,OAAO,aAAa;AACpD,qBAAA,IAAI,eAAe,UAAU;AACnC,eAAA;AAAA,MAAA,GACL;AAEG,YAAA,OAAO,MAAM,OAAMG,YAAU;AAClCA,gBAAO,MAAM,kCAAkC;AAEzC,cAAA,MAAM,WAAW,MAAM,QAAQ;AAAA,UACpC,SAAS,IAAI;AAAA,UACb,UAAU,IAAI;AAAA,UACd,eAAe,CAAC,EAAE,gBAAgB;AAChC,gBAAI,MAA0B,UAAU;AAAA,cACxC,eAAe;AAAA,YAChB;AAEA,kBAAM,aAAa,cAAc,UAAU,iBAAiB,iBAAiB,iBAAiB;AACxF,kBAAA,kBAAkB,WAAW,aAAa,MAAM,QAAQ,EAAE,QAAQ,WAAW;AAE5E,mBAAA,KAAK,6BAA6B,OAAO;AAAA,cAC/C,IAAI;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY,EAAE,IAAI,eAAe,KAAK,GAAG;AAAA,cACzC;AAAA,cACA;AAAA,cACA,cAAc,iBAAiB,6BAA6B;AAAA,cAC5D;AAAA,cACA;AAAA,YAAA,CACA;AAAA,UAAA;AAAA,QACF,CACA,CAAC;AACFA,gBAAO,MAAM,wBAAwB;AAAA,MAAA,CACrC;AAGe,sBAAA,kBAAkB,QAAQ,QAAQ;AAAA,IACnD;AAAA,EAAA;AAEF;;"}