/
githubmirror
/
novu
Обзор
Документация
Войти
/
githubmirror
/
novu
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
next
apps/api/src/app.module.ts
242 строки
9 KB
Paweł Tymczuk
feat(dashboard,api-service,js,react,framework): novu copilot agent for slack fixes NV-8316 (#11973)
22 июл 2026, 14:06
Не верифицирован
22 июл 2026, 14:06
7d56d88
Код
Авторство
О чём код?
import { DynamicModule, Module, Provider } from '@nestjs/common'; import { ForwardReference } from '@nestjs/common/interfaces/modules/forward-reference.interface'; import { Type } from '@nestjs/common/interfaces/type.interface'; import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core'; import { ApiExcludeController } from '@nestjs/swagger'; import { cacheService, TracingModule } from '@novu/application-generic'; import { Client, NovuModule } from '@novu/framework/nest'; import { usageLimitsWorkflow, usageReportWorkflow } from '@novu/notifications'; import { isClerkEnabled } from '@novu/shared'; import { SentryModule } from '@sentry/nestjs/setup'; import packageJson from '../package.json'; import { ActivityModule } from './app/activity/activity.module'; import { AgentsModule } from './app/agents/agents.module'; import { AnalyticsModule } from './app/analytics/analytics.module'; import { AuthModule } from './app/auth/auth.module'; import { BlueprintModule } from './app/blueprint/blueprint.module'; import { BridgeModule } from './app/bridge/bridge.module'; import { ChangeModule } from './app/change/change.module'; import { ChannelConnectionsModule } from './app/channel-connections/channel-connections.module'; import { ChannelEndpointsModule } from './app/channel-endpoints/channel-endpoints.module'; import { CliAuthModule } from './app/cli-auth/cli-auth.module'; import { ConnectModule } from './app/connect/connect.module'; import { ContentTemplatesModule } from './app/content-templates/content-templates.module'; import { ContextsModule } from './app/contexts/contexts.module'; import { DomainsModule } from './app/domains/domains.module'; import { EnvironmentVariablesModule } from './app/environment-variables/environment-variables.module'; import { EnvironmentsModuleV1 } from './app/environments-v1/environments-v1.module'; import { EnvironmentsModule } from './app/environments-v2/environments.module'; import { EventsModule } from './app/events/events.module'; import { ExecutionDetailsModule } from './app/execution-details/execution-details.module'; import { FeedsModule } from './app/feeds/feeds.module'; import { HealthModule } from './app/health/health.module'; import { InboundParseModule } from './app/inbound-parse/inbound-parse.module'; import { InboxModule } from './app/inbox/inbox.module'; import { IntegrationModule } from './app/integrations/integrations.module'; import { InternalModule } from './app/internal/internal.module'; import { InvitesModule } from './app/invites/invites.module'; import { LayoutsV1Module } from './app/layouts-v1/layouts-v1.module'; import { LayoutsV2Module } from './app/layouts-v2/layouts.module'; import { MessagesModule } from './app/messages/messages.module'; import { NotificationGroupsModule } from './app/notification-groups/notification-groups.module'; import { NotificationModule } from './app/notifications/notification.module'; import { NovuContextModule } from './app/novu-context/novu-context.module'; import { OrganizationModule } from './app/organization/organization.module'; import { OutboundWebhooksModule } from './app/outbound-webhooks/outbound-webhooks.module'; import { PartnerIntegrationsModule } from './app/partner-integrations/partner-integrations.module'; import { PreferencesModule } from './app/preferences'; import { ApiRateLimitInterceptor } from './app/rate-limiting/guards'; import { RateLimitingModule } from './app/rate-limiting/rate-limiting.module'; import { AnalyticsLogsGuard } from './app/shared/framework/analytics-logs.guard'; import { AnalyticsLogsInterceptor } from './app/shared/framework/analytics-logs.interceptor'; import { IdempotencyInterceptor } from './app/shared/framework/idempotency.interceptor'; import { ProductFeatureInterceptor } from './app/shared/interceptors/product-feature.interceptor'; import { SharedModule } from './app/shared/shared.module'; import { StepResolversModule } from './app/step-resolvers/step-resolvers.module'; import { StorageModule } from './app/storage/storage.module'; import { SubscribersV1Module } from './app/subscribers/subscribersV1.module'; import { SubscribersModule } from './app/subscribers-v2/subscribers.module'; import { SupportModule } from './app/support/support.module'; import { TenantModule } from './app/tenant/tenant.module'; import { TestingModule } from './app/testing/testing.module'; import { TopicsV1Module } from './app/topics-v1/topics-v1.module'; import { TopicsV2Module } from './app/topics-v2/topics-v2.module'; import { UserModule } from './app/user/user.module'; import { WellKnownModule } from './app/well-known/well-known.module'; import { WidgetsModule } from './app/widgets/widgets.module'; import { WorkflowOverridesModule } from './app/workflow-overrides/workflow-overrides.module'; import { WorkflowModuleV1 } from './app/workflows-v1/workflow-v1.module'; import { WorkflowModule } from './app/workflows-v2/workflow.module'; const enterpriseImports = (): Array<Type | DynamicModule | Promise<DynamicModule> | ForwardReference> => { const modules: Array<Type | DynamicModule | Promise<DynamicModule> | ForwardReference> = []; if (process.env.NOVU_ENTERPRISE === 'true' || process.env.CI_EE_TEST === 'true') { if (require('@novu/ee-translation')?.EnterpriseTranslationModule) { modules.push(require('@novu/ee-translation')?.EnterpriseTranslationModule); modules.push(require('@novu/ee-translation')?.TranslationModule); } if (require('@novu/ee-billing')?.BillingModule) { modules.push(require('@novu/ee-billing')?.BillingModule.forRoot()); } if (require('@novu/ee-api')?.InboundWebhooksModule) { modules.push(require('@novu/ee-api')?.InboundWebhooksModule); } if (require('@novu/ee-ai')?.AiModule) { modules.push(require('@novu/ee-ai')?.AiModule); } // LLM Gateway controllers parked for this PR — keeping the code so we // can re-enable later by uncommenting this block. // if (require('@novu/ee-ai')?.LlmGatewayModule) { // modules.push(require('@novu/ee-ai')?.LlmGatewayModule); // } if (require('@novu/ee-api')?.ConversationsModule) { modules.push({ module: class ConversationsModuleHost {}, imports: [SharedModule, require('@novu/ee-api').ConversationsModule], }); } modules.push(SupportModule); modules.push(OutboundWebhooksModule.forRoot()); } return modules; }; const enterpriseQuotaThrottlerInterceptor = (process.env.NOVU_ENTERPRISE === 'true' || process.env.CI_EE_TEST === 'true') && require('@novu/ee-billing')?.QuotaThrottlerInterceptor ? [ { provide: APP_INTERCEPTOR, useClass: require('@novu/ee-billing')?.QuotaThrottlerInterceptor, }, ] : []; const baseModules: Array<Type | DynamicModule | Promise<DynamicModule> | ForwardReference> = [ AuthModule, InboundParseModule, SharedModule, HealthModule, EnvironmentsModuleV1, ExecutionDetailsModule, WorkflowModuleV1, EventsModule, WidgetsModule, InboxModule, NotificationModule, NotificationGroupsModule, ContentTemplatesModule, OrganizationModule, ActivityModule, AgentsModule, ConnectModule, NovuContextModule, DomainsModule.forRoot(), UserModule, IntegrationModule, InternalModule, ChangeModule, ContextsModule, SubscribersV1Module, SubscribersModule, FeedsModule, LayoutsV1Module, LayoutsV2Module, MessagesModule, TopicsV1Module, TopicsV2Module, BlueprintModule, TenantModule, EnvironmentVariablesModule, StorageModule, WorkflowOverridesModule, RateLimitingModule, TracingModule.register(packageJson.name, packageJson.version), BridgeModule, PreferencesModule, WorkflowModule, EnvironmentsModule, NovuModule, ChannelConnectionsModule, ChannelEndpointsModule, CliAuthModule, StepResolversModule, WellKnownModule, ]; const enterpriseModules = enterpriseImports(); if (!isClerkEnabled()) { const communityModules = [InvitesModule]; baseModules.push(...communityModules); } else if (process.env.IS_SELF_HOSTED !== 'true') { baseModules.push(PartnerIntegrationsModule); } const modules = baseModules.concat(enterpriseModules); const providers: Provider[] = [ { provide: APP_GUARD, useClass: AnalyticsLogsGuard, }, { provide: APP_INTERCEPTOR, useClass: ApiRateLimitInterceptor, }, { provide: APP_INTERCEPTOR, useClass: ProductFeatureInterceptor, }, ...enterpriseQuotaThrottlerInterceptor, { provide: APP_INTERCEPTOR, useClass: IdempotencyInterceptor, }, { provide: APP_INTERCEPTOR, useClass: AnalyticsLogsInterceptor, }, cacheService, ]; if (process.env.SENTRY_DSN) { modules.unshift(SentryModule.forRoot()); } if (process.env.SEGMENT_TOKEN) { modules.push(AnalyticsModule); } if (process.env.NODE_ENV === 'test') { modules.push(TestingModule); } modules.push( NovuModule.register({ apiPath: '/bridge/novu', client: new Client({ secretKey: process.env.NOVU_INTERNAL_SECRET_KEY, strictAuthentication: process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'dev' || process.env.NOVU_STRICT_AUTHENTICATION_ENABLED === 'true', }), controllerDecorators: [ApiExcludeController()], workflows: [usageLimitsWorkflow, usageReportWorkflow], }) ); @Module({ imports: modules, controllers: [], providers, }) export class AppModule {}