console/packages/services/api/src/create.ts
2024-02-06 12:10:19 +01:00

289 lines
8.1 KiB
TypeScript

import { createApplication, Scope } from 'graphql-modules';
import { AwsClient } from '@hive/cdn-script/aws';
import { activityModule } from './modules/activity';
import { adminModule } from './modules/admin';
import { alertsModule } from './modules/alerts';
import { WEBHOOKS_CONFIG, WebhooksConfig } from './modules/alerts/providers/tokens';
import { authModule } from './modules/auth';
import { billingModule } from './modules/billing';
import { BILLING_CONFIG, BillingConfig } from './modules/billing/providers/tokens';
import { cdnModule } from './modules/cdn';
import { CDN_CONFIG, CDNConfig } from './modules/cdn/providers/tokens';
import { collectionModule } from './modules/collection';
import { feedbackModule } from './modules/feedback';
import { FEEDBACK_SLACK_CHANNEL, FEEDBACK_SLACK_TOKEN } from './modules/feedback/providers/tokens';
import { integrationsModule } from './modules/integrations';
import {
GITHUB_APP_CONFIG,
GitHubApplicationConfig,
} from './modules/integrations/providers/github-integration-manager';
import { labModule } from './modules/lab';
import { oidcIntegrationsModule } from './modules/oidc-integrations';
import { OIDC_INTEGRATIONS_ENABLED } from './modules/oidc-integrations/providers/tokens';
import { operationsModule } from './modules/operations';
import { CLICKHOUSE_CONFIG, ClickHouseConfig } from './modules/operations/providers/tokens';
import { organizationModule } from './modules/organization';
import { schemaPolicyModule } from './modules/policy';
import {
SCHEMA_POLICY_SERVICE_CONFIG,
SchemaPolicyServiceConfig,
} from './modules/policy/providers/tokens';
import { projectModule } from './modules/project';
import { rateLimitModule } from './modules/rate-limit';
import {
RATE_LIMIT_SERVICE_CONFIG,
RateLimitServiceConfig,
} from './modules/rate-limit/providers/tokens';
import { schemaModule } from './modules/schema';
import { ArtifactStorageWriter } from './modules/schema/providers/artifact-storage-writer';
import { provideSchemaModuleConfig, SchemaModuleConfig } from './modules/schema/providers/config';
import {
SCHEMA_SERVICE_CONFIG,
SchemaServiceConfig,
} from './modules/schema/providers/orchestrators/tokens';
import { sharedModule } from './modules/shared';
import { CryptoProvider, encryptionSecretProvider } from './modules/shared/providers/crypto';
import { DistributedCache } from './modules/shared/providers/distributed-cache';
import { Emails, EMAILS_ENDPOINT } from './modules/shared/providers/emails';
import { HttpClient } from './modules/shared/providers/http-client';
import { IdTranslator } from './modules/shared/providers/id-translator';
import { Logger } from './modules/shared/providers/logger';
import { Mutex } from './modules/shared/providers/mutex';
import { PG_POOL_CONFIG } from './modules/shared/providers/pg-pool';
import { REDIS_CONFIG, RedisConfig, RedisProvider } from './modules/shared/providers/redis';
import { S3_CONFIG, type S3Config } from './modules/shared/providers/s3-config';
import { Storage } from './modules/shared/providers/storage';
import { WEB_APP_URL } from './modules/shared/providers/tokens';
import { supportModule } from './modules/support';
import { provideSupportConfig, SupportConfig } from './modules/support/providers/config';
import { targetModule } from './modules/target';
import { tokenModule } from './modules/token';
import { TOKENS_CONFIG, TokensConfig } from './modules/token/providers/tokens';
import { usageEstimationModule } from './modules/usage-estimation';
import {
USAGE_ESTIMATION_SERVICE_CONFIG,
UsageEstimationServiceConfig,
} from './modules/usage-estimation/providers/tokens';
const modules = [
sharedModule,
authModule,
organizationModule,
projectModule,
targetModule,
schemaModule,
activityModule,
operationsModule,
tokenModule,
labModule,
integrationsModule,
alertsModule,
feedbackModule,
cdnModule,
adminModule,
usageEstimationModule,
rateLimitModule,
billingModule,
oidcIntegrationsModule,
schemaPolicyModule,
collectionModule,
];
export function createRegistry({
app,
tokens,
webhooks,
schemaService,
usageEstimationService,
rateLimitService,
schemaPolicyService,
logger,
storage,
clickHouse,
redis,
githubApp,
cdn,
s3,
encryptionSecret,
feedback,
billing,
schemaConfig,
supportConfig,
emailsEndpoint,
organizationOIDC,
}: {
logger: Logger;
storage: Storage;
clickHouse: ClickHouseConfig;
redis: RedisConfig;
tokens: TokensConfig;
webhooks: WebhooksConfig;
schemaService: SchemaServiceConfig;
usageEstimationService: UsageEstimationServiceConfig;
rateLimitService: RateLimitServiceConfig;
schemaPolicyService: SchemaPolicyServiceConfig;
githubApp: GitHubApplicationConfig | null;
cdn: CDNConfig | null;
s3: {
bucketName: string;
endpoint: string;
accessKeyId: string;
secretAccessKeyId: string;
sessionToken?: string;
};
encryptionSecret: string;
feedback: {
token: string;
channel: string;
};
app: {
baseUrl: string;
} | null;
billing: BillingConfig;
schemaConfig: SchemaModuleConfig;
supportConfig: SupportConfig | null;
emailsEndpoint?: string;
organizationOIDC: boolean;
}) {
const s3Config: S3Config = {
client: new AwsClient({
accessKeyId: s3.accessKeyId,
secretAccessKey: s3.secretAccessKeyId,
sessionToken: s3.sessionToken,
service: 's3',
}),
bucket: s3.bucketName,
endpoint: s3.endpoint,
};
const artifactStorageWriter = new ArtifactStorageWriter(s3Config, logger);
const providers = [
HttpClient,
IdTranslator,
RedisProvider,
Mutex,
DistributedCache,
CryptoProvider,
Emails,
{
provide: ArtifactStorageWriter,
useValue: artifactStorageWriter,
},
{
provide: Logger,
useValue: logger,
scope: Scope.Singleton,
},
{
provide: Storage,
useValue: storage,
scope: Scope.Singleton,
},
{
provide: CLICKHOUSE_CONFIG,
useValue: clickHouse,
scope: Scope.Singleton,
},
{
provide: TOKENS_CONFIG,
useValue: tokens,
scope: Scope.Singleton,
},
{
provide: BILLING_CONFIG,
useValue: billing,
scope: Scope.Singleton,
},
{
provide: WEBHOOKS_CONFIG,
useValue: webhooks,
scope: Scope.Singleton,
},
{
provide: SCHEMA_SERVICE_CONFIG,
useValue: schemaService,
scope: Scope.Singleton,
},
{
provide: USAGE_ESTIMATION_SERVICE_CONFIG,
useValue: usageEstimationService,
scope: Scope.Singleton,
},
{
provide: RATE_LIMIT_SERVICE_CONFIG,
useValue: rateLimitService,
scope: Scope.Singleton,
},
{
provide: SCHEMA_POLICY_SERVICE_CONFIG,
useValue: schemaPolicyService,
scope: Scope.Singleton,
},
{
provide: REDIS_CONFIG,
useValue: redis,
scope: Scope.Singleton,
},
{
provide: GITHUB_APP_CONFIG,
useValue: githubApp,
scope: Scope.Singleton,
},
{
provide: CDN_CONFIG,
useValue: cdn,
scope: Scope.Singleton,
},
{
provide: S3_CONFIG,
useValue: s3Config,
scope: Scope.Singleton,
},
{
provide: FEEDBACK_SLACK_CHANNEL,
useValue: feedback.channel,
scope: Scope.Singleton,
},
{
provide: FEEDBACK_SLACK_TOKEN,
useValue: feedback.token,
scope: Scope.Singleton,
},
{
provide: OIDC_INTEGRATIONS_ENABLED,
useValue: organizationOIDC,
scope: Scope.Singleton,
},
{
provide: WEB_APP_URL,
useValue: app?.baseUrl.replace(/\/$/, '') ?? 'http://localhost:3000',
scope: Scope.Singleton,
},
{
provide: PG_POOL_CONFIG,
scope: Scope.Singleton,
useValue: storage.pool,
},
encryptionSecretProvider(encryptionSecret),
provideSchemaModuleConfig(schemaConfig),
];
if (emailsEndpoint) {
providers.push({
provide: EMAILS_ENDPOINT,
useValue: emailsEndpoint,
scope: Scope.Singleton,
});
modules.push(supportModule);
}
if (supportConfig) {
providers.push(provideSupportConfig(supportConfig));
}
return createApplication({
modules,
providers,
});
}