Ctrl K
ComunidadGuías…

server/src/app.module.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
import { ScheduleModule } from '@nestjs/schedule';
import { ThrottlerModule } from '@nestjs/throttler';
import { LoggerModule } from 'nestjs-pino';

import {
  appConfig,
  audiolessEpubConfig,
  audioToolsConfig,
  authConfig,
  bookRequestConfig,
  coverSlotsConfig,
  dbConfig,
  djvuConfig,
  emailConfig,
  fileWriteConfig,
  migrationConfig,
  oidcRuntimeConfig,
  readAloudConfig,
  storageConfig,
} from './config/config';
import { validateEnv } from './config/env.validation';
import { loggerConfig } from './common/logger.config';
import { CommonModule } from './common/common.module';
import { LibraryScopeModule } from './common/library-scope/library-scope.module';
import { SeriesIdentityModule } from './common/series-identity.module';
import { AuditInterceptor } from './common/interceptors/audit.interceptor';
import { MergedBookAliasInterceptor } from './common/interceptors/merged-book-alias.interceptor';
import { GLOBAL_GUARDS } from './common/guards/global-guards';
import { DbModule } from './db/db.module';
import { AnnotationModule } from './modules/annotation/annotation.module';
import { DashboardModule } from './modules/dashboard/dashboard.module';
import { HealthModule } from './modules/health/health.module';
import { AppSettingsModule } from './modules/app-settings/app-settings.module';
import { CollectionModule } from './modules/collection/collection.module';
import { AuthModule } from './modules/auth/auth.module';
import { CbzModule } from './modules/reader/cbz/cbz.module';
import { DjvuModule } from './modules/reader/djvu/djvu.module';
import { BookmarkModule } from './modules/bookmark/bookmark.module';
import { BookJournalModule } from './modules/book-journal/book-journal.module';
import { NotebookModule } from './modules/notebook/notebook.module';
import { BookModule } from './modules/book/book.module';
import { BookAliasModule } from './modules/book-alias/book-alias.module';
import { CatalogModule } from './modules/catalog/catalog.module';
import { CoverModule } from './modules/cover/cover.module';
import { KoboModule } from './modules/kobo/kobo.module';
import { LibraryModule } from './modules/library/library.module';
import { SmartScopeModule } from './modules/smart-scope/smart-scope.module';
import { OpdsModule } from './modules/opds/opds.module';
import { PathModule } from './modules/path/path.module';
import { MetadataFetchModule } from './modules/metadata-fetch/metadata-fetch.module';
import { MetadataPreferencesModule } from './modules/metadata-preferences/metadata-preferences.module';
import { MetadataHttpProviderModule } from './modules/metadata-http-provider/metadata-http-provider.module';
import { MetadataModule } from './modules/metadata/metadata.module';
import { NarratorModule } from './modules/narrator/narrator.module';
import { ReaderPreferencesModule } from './modules/reader-preferences/reader-preferences.module';
import { RecommendationModule } from './modules/recommendation/recommendation.module';
import { UserPreferencesModule } from './modules/user-preferences/user-preferences.module';
import { ScannerModule } from './modules/scanner/scanner.module';
import { SeedModule } from './modules/seed/seed.module';
import { EmailModule } from './modules/email/email.module';
import { EpubModule } from './modules/reader/epub/epub.module';
import { BookDockModule } from './modules/book-dock/book-dock.module';
import { BookRequestModule } from './modules/book-request/book-request.module';
import { BrowseCountsModule } from './modules/browse-counts/browse-counts.module';
import { UploadModule } from './modules/upload/upload.module';
import { UserModule } from './modules/user/user.module';
import { AuthorsModule } from './modules/authors/authors.module';
import { BookMetadataFetchModule } from './modules/book-metadata-fetch/book-metadata-fetch.module';
import { MetadataScoreModule } from './modules/metadata-score/metadata-score.module';
import { StatisticsModule } from './modules/statistics/statistics.module';
import { UserStatisticsModule } from './modules/user-statistics/user-statistics.module';
import { ReadingHistoryModule } from './modules/reading-history/reading-history.module';
import { ReadingSessionModule } from './modules/reading-session/reading-session.module';
import { ReadingStateModule } from './modules/reading-state/reading-state.module';
import { UserBookStatusModule } from './modules/user-book-status/user-book-status.module';
import { AuditModule } from './modules/audit/audit.module';
import { MigrationModule } from './modules/migration/migration.module';
import { NotificationModule } from './modules/notification/notification.module';
import { SeriesModule } from './modules/series/series.module';
import { EntityManagerModule } from './modules/entity-manager/entity-manager.module';
import { FontModule } from './modules/font/font.module';
import { ServerFontModule } from './modules/server-font/server-font.module';
import { KoreaderModule } from './modules/koreader/koreader.module';
import { AppInfoModule } from './modules/app-info/app-info.module';
import { ReleaseNotesModule } from './modules/release-notes/release-notes.module';
import { AchievementModule } from './modules/achievement/achievement.module';
import { HardcoverModule } from './modules/hardcover/hardcover.module';
import { ReadwiseModule } from './modules/readwise/readwise.module';
import { StorygraphModule } from './modules/storygraph/storygraph.module';
import { CustomMetadataModule } from './modules/custom-metadata/custom-metadata.module';
import { CustomIconModule } from './modules/custom-icon/custom-icon.module';
import { AccountActivityModule } from './modules/account-activity/account-activity.module';
import { SharedReadingInsightsModule } from './modules/shared-reading-insights/shared-reading-insights.module';
import { BookDuplicatesModule } from './modules/book-duplicates/book-duplicates.module';
import { MaintenanceModule } from './modules/maintenance/maintenance.module';
import { BookLinkModule } from './modules/book-link/book-link.module';
import { BookMergeModule } from './modules/book-merge/book-merge.module';
import { BookMoveModule } from './modules/book-move/book-move.module';
import { AudiobookModule } from './modules/audiobook/audiobook.module';
import { ChapterEditorModule } from './modules/chapter-editor/chapter-editor.module';
import { ChapterHealthModule } from './modules/chapter-health/chapter-health.module';
import { TtsModule } from './modules/tts/tts.module';
import { SearchModule } from './modules/search/search.module';
import { WatchDownloadModule } from './modules/watch-download/watch-download.module';
import { AppAttestModule } from './modules/app-attest/app-attest.module';
import { ReadAloudModule } from './modules/read-aloud/read-aloud.module';
import { PageLocatorModule } from './modules/page-locator/page-locator.module';
import { YearReviewModule } from './modules/year-review/year-review.module';
import { VisualMatchModule } from './modules/visual-match/visual-match.module';
import { StoryEditsModule } from './modules/story-edits/story-edits.module';

@Module({
  imports: [
    LoggerModule.forRoot(loggerConfig),
    ConfigModule.forRoot({
      isGlobal: true,
      validate: validateEnv,
      load: [
        appConfig,
        dbConfig,
        authConfig,
        storageConfig,
        coverSlotsConfig,
        fileWriteConfig,
        emailConfig,
        migrationConfig,
        bookRequestConfig,
        oidcRuntimeConfig,
        audiolessEpubConfig,
        djvuConfig,
        readAloudConfig,
        audioToolsConfig,
      ],
    }),
    ScheduleModule.forRoot(),
    ThrottlerModule.forRoot({
      skipIf: () => process.env.NODE_ENV === 'test',
      throttlers: [
        {
          name: 'default',
          ttl: 60_000,
          limit: 120,
        },
      ],
    }),
    DbModule,
    SeriesIdentityModule,
    CommonModule,
    LibraryScopeModule,
    SeedModule,
    AuthModule,
    AppSettingsModule,
    UserModule,
    AuthorsModule,
    BookMetadataFetchModule,
    LibraryModule,
    PathModule,
    BookAliasModule,
    BookModule,
    AudiobookModule,
    ChapterEditorModule,
    ChapterHealthModule,
    CatalogModule,
    CoverModule,
    CollectionModule,
    SmartScopeModule,
    ScannerModule,
    MetadataModule,
    NarratorModule,
    UploadModule,
    MetadataFetchModule,
    MetadataPreferencesModule,
    MetadataHttpProviderModule,
    CustomMetadataModule,
    CustomIconModule,
    RecommendationModule,
    KoboModule,
    OpdsModule,
    BookmarkModule,
    BookJournalModule,
    AnnotationModule,
    NotebookModule,
    DashboardModule,
    HealthModule,
    CbzModule,
    DjvuModule,
    ReaderPreferencesModule,
    UserPreferencesModule,
    EpubModule,
    BookDockModule,
    BookRequestModule,
    EmailModule,
    MetadataScoreModule,
    StatisticsModule,
    UserStatisticsModule,
    ReadingHistoryModule,
    ReadingSessionModule,
    ReadingStateModule,
    UserBookStatusModule,
    AuditModule,
    MigrationModule,
    NotificationModule,
    SeriesModule,
    EntityManagerModule,
    FontModule,
    ServerFontModule,
    KoreaderModule,
    AppInfoModule,
    ReleaseNotesModule,
    AchievementModule,
    HardcoverModule,
    ReadwiseModule,
    StorygraphModule,
    AccountActivityModule,
    SharedReadingInsightsModule,
    BookDuplicatesModule,
    MaintenanceModule,
    BookMoveModule,
    BookMergeModule,
    BookLinkModule,
    BrowseCountsModule,
    TtsModule,
    SearchModule,
    WatchDownloadModule,
    AppAttestModule,
    ReadAloudModule,
    PageLocatorModule,
    YearReviewModule,
    VisualMatchModule,
    StoryEditsModule,
  ],
  providers: [
    // Before the audit interceptor, so an audited route records the book the request now lands on.
    { provide: APP_INTERCEPTOR, useClass: MergedBookAliasInterceptor },
    { provide: APP_INTERCEPTOR, useClass: AuditInterceptor },
    ...GLOBAL_GUARDS.map((useClass) => ({ provide: APP_GUARD, useClass })),
  ],
})
export class AppModule {}