Path: blob/main/components/gitpod-db/src/container-module.ts
2497 views
/**1* Copyright (c) 2020 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { ContainerModule } from "inversify";78import { WorkspaceDB } from "./workspace-db";9import { TypeORMWorkspaceDBImpl } from "./typeorm/workspace-db-impl";10import { TypeORMUserDBImpl } from "./typeorm/user-db-impl";11import { UserDB } from "./user-db";12import { Config } from "./config";13import { TypeORM } from "./typeorm/typeorm";14import { encryptionModule } from "@gitpod/gitpod-protocol/lib/encryption/container-module";15import { KeyProviderImpl, KeyProviderConfig } from "@gitpod/gitpod-protocol/lib/encryption/key-provider";16import { DBWithTracing, bindDbWithTracing, TracedWorkspaceDB, TracedUserDB, TracedOneTimeSecretDB } from "./traced-db";17import { OneTimeSecretDB } from "./one-time-secret-db";18import { TypeORMAppInstallationDBImpl } from "./typeorm/app-installation-db-impl";19import { AppInstallationDB } from "./app-installation-db";20import { TypeORMOneTimeSecretDBImpl } from "./typeorm/one-time-secret-db-impl";21import { GitpodTableDescriptionProvider, TableDescriptionProvider } from "./tables";22import { PeriodicDbDeleter } from "./periodic-deleter";23import { CodeSyncResourceDB } from "./typeorm/code-sync-resource-db";2425import { WorkspaceClusterDBImpl } from "./typeorm/workspace-cluster-db-impl";26import { WorkspaceClusterDB } from "./workspace-cluster-db";27import { AuthCodeRepositoryDB } from "./typeorm/auth-code-repository-db";28import { AuthProviderEntryDB } from "./auth-provider-entry-db";29import { AuthProviderEntryDBImpl } from "./typeorm/auth-provider-entry-db-impl";30import { EmailDomainFilterDB } from "./email-domain-filter-db";31import { EmailDomainFilterDBImpl } from "./typeorm/email-domain-filter-db-impl";32import { TeamDB } from "./team-db";33import { TeamDBImpl } from "./typeorm/team-db-impl";34import { ProjectDB } from "./project-db";35import { ProjectDBImpl } from "./typeorm/project-db-impl";36import { PersonalAccessTokenDB } from "./personal-access-token-db";37import { TypeORMBlockedRepositoryDBImpl } from "./typeorm/blocked-repository-db-impl";38import { BlockedRepositoryDB } from "./blocked-repository-db";39import { WebhookEventDB } from "./webhook-event-db";40import { WebhookEventDBImpl } from "./typeorm/webhook-event-db-impl";41import { PersonalAccessTokenDBImpl } from "./typeorm/personal-access-token-db-impl";42import { LinkedInProfileDBImpl } from "./typeorm/linked-in-profile-db-impl";43import { LinkedInProfileDB } from "./linked-in-profile-db";44import { DataCache, DataCacheNoop } from "./data-cache";45import { TracingManager } from "@gitpod/gitpod-protocol/lib/util/tracing";46import { EncryptionService, GlobalEncryptionService } from "@gitpod/gitpod-protocol/lib/encryption/encryption-service";47import { AuditLogDB } from "./audit-log-db";48import { AuditLogDBImpl } from "./typeorm/audit-log-db-impl";4950// THE DB container module that contains all DB implementations51export const dbContainerModule = (cacheClass = DataCacheNoop) =>52new ContainerModule((bind, unbind, isBound, rebind, unbindAsync, onActivation, onDeactivation) => {53bind(Config).toSelf().inSingletonScope();54bind(TypeORM)55.toSelf()56.inSingletonScope()57.onActivation((ctx, orm) => {58// HACK we need to initialize the global encryption service.59GlobalEncryptionService.encryptionService = ctx.container.get(EncryptionService);60return orm;61});62bind(DBWithTracing).toSelf().inSingletonScope();63bind(TracingManager).toSelf().inSingletonScope();64bind(DataCache).to(cacheClass).inSingletonScope();6566bind(TypeORMBlockedRepositoryDBImpl).toSelf().inSingletonScope();67bind(BlockedRepositoryDB).toService(TypeORMBlockedRepositoryDBImpl);6869bind(TypeORMUserDBImpl).toSelf().inSingletonScope();70bind(UserDB).toService(TypeORMUserDBImpl);71bindDbWithTracing(TracedUserDB, bind, UserDB).inSingletonScope();7273bind(AuthProviderEntryDB).to(AuthProviderEntryDBImpl).inSingletonScope();7475bind(TypeORMWorkspaceDBImpl).toSelf().inSingletonScope();76bind(WorkspaceDB).toService(TypeORMWorkspaceDBImpl);77bindDbWithTracing(TracedWorkspaceDB, bind, WorkspaceDB).inSingletonScope();7879bind(TypeORMAppInstallationDBImpl).toSelf().inSingletonScope();80bind(AppInstallationDB).toService(TypeORMAppInstallationDBImpl);8182bind(TypeORMOneTimeSecretDBImpl).toSelf().inSingletonScope();83bind(OneTimeSecretDB).toService(TypeORMOneTimeSecretDBImpl);84bindDbWithTracing(TracedOneTimeSecretDB, bind, OneTimeSecretDB).inSingletonScope();8586encryptionModule(bind, unbind, isBound, rebind, unbindAsync, onActivation, onDeactivation);87bind(KeyProviderConfig)88.toDynamicValue((ctx) => {89const config = ctx.container.get<Config>(Config);90return {91keys: KeyProviderImpl.loadKeyConfigFromJsonString(config.dbEncryptionKeys),92};93})94.inSingletonScope();9596bind(GitpodTableDescriptionProvider).toSelf().inSingletonScope();97bind(TableDescriptionProvider).toService(GitpodTableDescriptionProvider);98bind(PeriodicDbDeleter).toSelf().inSingletonScope();99100bind(CodeSyncResourceDB).toSelf().inSingletonScope();101102bind(WorkspaceClusterDB).to(WorkspaceClusterDBImpl).inSingletonScope();103104bind(AuthCodeRepositoryDB).toSelf().inSingletonScope();105106bind(TeamDBImpl).toSelf().inSingletonScope();107bind(TeamDB).toService(TeamDBImpl);108bind(ProjectDBImpl).toSelf().inSingletonScope();109bind(ProjectDB).toService(ProjectDBImpl);110bind(WebhookEventDBImpl).toSelf().inSingletonScope();111bind(WebhookEventDB).toService(WebhookEventDBImpl);112113bind(PersonalAccessTokenDBImpl).toSelf().inSingletonScope();114bind(PersonalAccessTokenDB).toService(PersonalAccessTokenDBImpl);115116bind(AuditLogDBImpl).toSelf().inSingletonScope();117bind(AuditLogDB).toService(AuditLogDBImpl);118119// com concerns120bind(EmailDomainFilterDB).to(EmailDomainFilterDBImpl).inSingletonScope();121bind(LinkedInProfileDBImpl).toSelf().inSingletonScope();122bind(LinkedInProfileDB).toService(LinkedInProfileDBImpl);123});124125126