{"version":3,"file":"ProjectGroupContainer.cjs","sources":["../../../../../packages/engine-http/src/projectGroup/ProjectGroupContainer.ts"],"sourcesContent":["import { Builder } from '@contember/dic'\nimport { Connection } from '@contember/database'\nimport {\n\tProjectInitializer as ProjectInitializerInterface,\n\tProjectSchemaResolver as ProjectSchemaResolverInterface,\n\tTenantContainer,\n\tTenantContainerFactory,\n} from '@contember/engine-tenant-api'\nimport { TenantConfig } from '../config/config'\nimport {\n\tProjectContainerFactoryFactory,\n\tProjectContainerResolver,\n\tProjectInitializer,\n\tProjectInitializerProxy,\n\tProjectSchemaResolver,\n\tProjectSchemaResolverProxy,\n} from '../project'\nimport { SystemContainer, SystemContainerFactory } from '@contember/engine-system-api'\nimport { ProjectConfigResolver } from '../config/projectConfigResolver'\nimport { createSecretKey } from 'node:crypto'\nimport { Logger } from '@contember/logger'\nimport { TenantGraphQLHandler, TenantGraphQLHandlerFactory } from '../tenant'\nimport { SystemGraphQLHandler, SystemGraphQLHandlerFactory } from '../system'\nimport { Authenticator } from '../common'\nimport { ProjectMembershipFetcher, ProjectMembershipResolver } from '../content'\nimport { Providers } from '../providers'\nimport { CryptoWrapper } from '../utils/CryptoWrapper'\n\nexport interface ProjectGroupContainer {\n\tslug: string | undefined\n\n\tlogger: Logger\n\tauthenticator: Authenticator\n\tprojectMembershipResolver: ProjectMembershipResolver\n\n\tprojectContainerResolver: ProjectContainerResolver\n\tprojectSchemaResolver: ProjectSchemaResolverInterface\n\tprojectInitializer: ProjectInitializerInterface\n\n\ttenantContainer: TenantContainer\n\ttenantGraphQLHandler: TenantGraphQLHandler\n\n\tsystemContainer: SystemContainer\n\tsystemGraphQLHandler: SystemGraphQLHandler\n}\n\n\ninterface ProjectGroupContainerFactoryArgs\n{\n\tconfig: TenantConfig\n\tslug: string | undefined\n}\n\nexport class ProjectGroupContainerFactory {\n\tconstructor(\n\t\tprivate readonly debug: boolean,\n\t\tprivate readonly providers: Providers,\n\t\tprivate readonly systemContainerFactory: SystemContainerFactory,\n\t\tprivate readonly tenantContainerFactory: TenantContainerFactory,\n\t\tprivate readonly projectContainerFactoryFactory: ProjectContainerFactoryFactory,\n\t\tprivate readonly projectConfigResolver: ProjectConfigResolver,\n\t\tprivate readonly tenantGraphQLHandlerFactory: TenantGraphQLHandlerFactory,\n\t\tprivate readonly systemGraphQLHandlerFactory: SystemGraphQLHandlerFactory,\n\t\tprivate readonly logger: Logger,\n\t) {}\n\n\tpublic create({ config, slug }: ProjectGroupContainerFactoryArgs): ProjectGroupContainer {\n\t\treturn new Builder({})\n\t\t\t.addService('slug', () =>\n\t\t\t\tslug)\n\t\t\t.addService('logger', ({ slug }) =>\n\t\t\t\tthis.logger.child({ projectGroup: slug }))\n\t\t\t.addService('providers', () =>\n\t\t\t\tthis.providers)\n\t\t\t.addService('tenantDbCredentials', () =>\n\t\t\t\tconfig.db)\n\t\t\t.addService('tenantConnection', ({ tenantDbCredentials, logger }): Connection.ConnectionType =>\n\t\t\t\tConnection.create(tenantDbCredentials, err => logger.error(err)))\n\t\t\t.addService('tenantReadConnection', ({ tenantDbCredentials, logger, tenantConnection }) => {\n\t\t\t\tif (!tenantDbCredentials.read) {\n\t\t\t\t\treturn tenantConnection\n\t\t\t\t}\n\t\t\t\treturn Connection.create({\n\t\t\t\t\t...tenantDbCredentials,\n\t\t\t\t\t...tenantDbCredentials.read,\n\t\t\t\t\tpool: {\n\t\t\t\t\t\t...tenantDbCredentials.pool,\n\t\t\t\t\t\t...tenantDbCredentials.read.pool,\n\t\t\t\t\t},\n\t\t\t\t}, err => logger.error(err))\n\t\t\t})\n\t\t\t.addService('projectSchemaResolver', () =>\n\t\t\t\tnew ProjectSchemaResolverProxy())\n\t\t\t.addService('projectInitializer', () =>\n\t\t\t\tnew ProjectInitializerProxy())\n\t\t\t.addService('tenantContainer', ({ tenantConnection, tenantReadConnection, tenantDbCredentials, projectSchemaResolver, projectInitializer }) => {\n\t\t\t\tconst encryptionKey = config.secrets.encryptionKey\n\t\t\t\t\t? createSecretKey(Buffer.from(config.secrets.encryptionKey, 'hex'))\n\t\t\t\t\t: undefined\n\n\t\t\t\tconst cryptoWrapper = new CryptoWrapper(encryptionKey)\n\t\t\t\treturn this.tenantContainerFactory.create({\n\t\t\t\t\tconnection: tenantConnection,\n\t\t\t\t\treadConnection: tenantReadConnection,\n\t\t\t\t\tdbCredentials: tenantDbCredentials,\n\t\t\t\t\tmailOptions: config.mailer,\n\t\t\t\t\ttenantCredentials: config.credentials,\n\t\t\t\t\tprojectInitializer,\n\t\t\t\t\tprojectSchemaResolver,\n\t\t\t\t\tcryptoProviders: {\n\t\t\t\t\t\tdecrypt: cryptoWrapper.decrypt.bind(cryptoWrapper),\n\t\t\t\t\t\tencrypt: cryptoWrapper.encrypt.bind(cryptoWrapper),\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t})\n\t\t\t.addService('tenantDatabase', ({ tenantContainer }) =>\n\t\t\t\ttenantContainer.databaseContext)\n\t\t\t.addService('tenantReadDatabase', ({ tenantContainer }) =>\n\t\t\t\ttenantContainer.readDatabaseContext)\n\t\t\t.addService('identityFetcher', ({ tenantContainer: { identityFetcher } }) =>\n\t\t\t\tidentityFetcher)\n\t\t\t.addService('systemContainer', ({ identityFetcher }) =>\n\t\t\t\tthis.systemContainerFactory.create({ identityFetcher }))\n\t\t\t.addService('schemaProvider', ({ systemContainer }) =>\n\t\t\t\tsystemContainer.schemaProvider)\n\t\t\t.addService('projectContainerFactory', ({ schemaProvider, logger }) =>\n\t\t\t\tthis.projectContainerFactoryFactory.create(schemaProvider, logger))\n\t\t\t.addService('tenantProjectManager', ({ tenantContainer }) =>\n\t\t\t\ttenantContainer.projectManager)\n\t\t\t.addService('tenantProjectMemberManager', ({ tenantContainer }) =>\n\t\t\t\ttenantContainer.projectMemberManager)\n\t\t\t.addService('projectContainerResolver', ({ projectContainerFactory, tenantProjectManager, tenantReadDatabase }) =>\n\t\t\t\tnew ProjectContainerResolver(\n\t\t\t\t\tprojectContainerFactory,\n\t\t\t\t\tthis.projectConfigResolver,\n\t\t\t\t\ttenantProjectManager,\n\t\t\t\t\ttenantReadDatabase,\n\t\t\t\t\tconfig,\n\t\t\t\t))\n\n\t\t\t.setupService('projectSchemaResolver', (it, { projectContainerResolver }) => {\n\t\t\t\tit.setResolver(new ProjectSchemaResolver(projectContainerResolver))\n\t\t\t})\n\t\t\t.setupService('projectInitializer', (it, { projectContainerResolver }) => {\n\t\t\t\tit.setInitializer(new ProjectInitializer(projectContainerResolver))\n\t\t\t})\n\t\t\t.addService('tenantGraphQLHandler', ({ tenantContainer }) =>\n\t\t\t\tthis.tenantGraphQLHandlerFactory.create(tenantContainer.resolvers))\n\t\t\t.addService('systemGraphQLHandler', ({ systemContainer }) =>\n\t\t\t\tthis.systemGraphQLHandlerFactory.create(systemContainer.systemResolversFactory))\n\t\t\t.addService('authenticator', ({ tenantDatabase, tenantReadDatabase, tenantContainer }) =>\n\t\t\t\tnew Authenticator(tenantDatabase, tenantReadDatabase, tenantContainer.apiKeyManager))\n\t\t\t.addService('projectMembershipResolver', ({ tenantProjectMemberManager, tenantReadDatabase }) =>\n\t\t\t\tnew ProjectMembershipResolver(this.debug, new ProjectMembershipFetcher(tenantProjectMemberManager, tenantReadDatabase)))\n\t\t\t.build()\n\t\t\t.pick(\n\t\t\t\t'projectContainerResolver',\n\t\t\t\t'projectSchemaResolver',\n\t\t\t\t'projectInitializer',\n\t\t\t\t'systemContainer',\n\t\t\t\t'systemGraphQLHandler',\n\t\t\t\t'tenantContainer',\n\t\t\t\t'authenticator',\n\t\t\t\t'projectMembershipResolver',\n\t\t\t\t'tenantGraphQLHandler',\n\t\t\t\t'slug',\n\t\t\t\t'logger',\n\t\t\t)\n\t}\n}\n"],"names":["Builder","slug","Connection","ProjectSchemaResolverProxy","ProjectInitializerProxy","createSecretKey","CryptoWrapper","ProjectContainerResolver","ProjectSchemaResolver","ProjectInitializer","Authenticator","ProjectMembershipResolver","ProjectMembershipFetcher"],"mappings":"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"}