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, authConfig, bookRequestConfig, coverSlotsConfig, dbConfig, djvuConfig, emailConfig, fileWriteConfig, migrationConfig, oidcRuntimeConfig, podcastConfig, storageConfig, } from './config/config'; import { validateEnv } from './config/env.validation'; import { loggerConfig } from './common/logger.config'; import { CommonModule } from './common/common.module'; import { SeriesIdentityModule } from './common/series-identity.module'; import { AuditInterceptor } from './common/interceptors/audit.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 { 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 { 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 { 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 { BookMoveModule } from './modules/book-move/book-move.module'; import { AudiobookModule } from './modules/audiobook/audiobook.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 { PodcastModule } from './modules/podcast/podcast.module'; @Module({ imports: [ LoggerModule.forRoot(loggerConfig), ConfigModule.forRoot({ isGlobal: true, validate: validateEnv, load: [ appConfig, dbConfig, authConfig, storageConfig, coverSlotsConfig, fileWriteConfig, emailConfig, migrationConfig, bookRequestConfig, oidcRuntimeConfig, podcastConfig, audiolessEpubConfig, djvuConfig, ], }), ScheduleModule.forRoot(), ThrottlerModule.forRoot({ skipIf: () => process.env.NODE_ENV === 'test', throttlers: [ { name: 'default', ttl: 60_000, limit: 120, }, ], }), DbModule, SeriesIdentityModule, CommonModule, SeedModule, AuthModule, AppSettingsModule, UserModule, AuthorsModule, BookMetadataFetchModule, LibraryModule, PathModule, BookModule, AudiobookModule, CatalogModule, CoverModule, CollectionModule, SmartScopeModule, ScannerModule, MetadataModule, NarratorModule, UploadModule, MetadataFetchModule, MetadataPreferencesModule, CustomMetadataModule, CustomIconModule, RecommendationModule, KoboModule, OpdsModule, BookmarkModule, BookJournalModule, AnnotationModule, NotebookModule, DashboardModule, HealthModule, CbzModule, DjvuModule, ReaderPreferencesModule, UserPreferencesModule, EpubModule, BookDockModule, BookRequestModule, EmailModule, MetadataScoreModule, StatisticsModule, UserStatisticsModule, ReadingSessionModule, ReadingStateModule, UserBookStatusModule, AuditModule, MigrationModule, NotificationModule, SeriesModule, EntityManagerModule, FontModule, ServerFontModule, KoreaderModule, AppInfoModule, ReleaseNotesModule, AchievementModule, HardcoverModule, ReadwiseModule, StorygraphModule, AccountActivityModule, SharedReadingInsightsModule, BookDuplicatesModule, MaintenanceModule, BookMoveModule, BrowseCountsModule, TtsModule, SearchModule, WatchDownloadModule, PodcastModule, ], providers: [{ provide: APP_INTERCEPTOR, useClass: AuditInterceptor }, ...GLOBAL_GUARDS.map((useClass) => ({ provide: APP_GUARD, useClass }))], }) export class AppModule {}