diff --git a/package.json b/package.json index 5827bd95..b7c127ed 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,6 @@ "mongoose-lean-virtuals": "0.9.0", "mongoose-paginate-v2": "1.6.3", "nanoid": "3.3.1", - "nestjs-typegoose": "7.1.38", "node-machine-id": "1.1.12", "node-pty": "0.10.1", "nodemailer": "6.7.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d686532a..163cb528 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,7 +93,6 @@ specifiers: mongoose-lean-virtuals: 0.9.0 mongoose-paginate-v2: 1.6.3 nanoid: 3.3.1 - nestjs-typegoose: 7.1.38 node-machine-id: 1.1.12 node-pty: 0.10.1 nodemailer: 6.7.2 @@ -175,7 +174,6 @@ dependencies: mongoose-lean-virtuals: 0.9.0_mongoose@6.2.4 mongoose-paginate-v2: 1.6.3 nanoid: 3.3.1 - nestjs-typegoose: 7.1.38_994d630353f973f7e3436c85feb8c0e9 node-machine-id: 1.1.12 node-pty: 0.10.1 nodemailer: 6.7.2 @@ -4788,10 +4786,6 @@ packages: resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} engines: {node: '>= 0.4'} - /is-class/0.0.9: - resolution: {integrity: sha512-kUfRnejcRC9YLgblxoJ76dp9gZ3vMKTrDS5I6z2UVMOsHHSImNKCJocjQTkZr38PwiSZ9LVklaHEENaVYeFTXg==} - dev: false - /is-core-module/2.8.1: resolution: {integrity: sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==} dependencies: @@ -6285,23 +6279,6 @@ packages: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /nestjs-typegoose/7.1.38_994d630353f973f7e3436c85feb8c0e9: - resolution: {integrity: sha512-hYgDliG2IS5CJkzRsTbbfwZk+IP0jEyCaxcRqqXvxZaP5miiH9UvGm3K0hg8X5DuVkmsgTzW3+MxOXmcLm9BOA==} - engines: {node: '>=8.10.0'} - peerDependencies: - '@nestjs/common': ^6.10.1 || ^7.0.0 - '@nestjs/core': ^6.10.1 || ^7.0.0 - '@typegoose/typegoose': ^6.2.1 || ^7.0.0 - mongoose: ^5.10.6 - dependencies: - '@nestjs/common': 8.4.1_add13df2cdecb4b62cd3f7664ea82e18 - '@nestjs/core': 8.4.1_b4e0a43386936f36c413921c49aca7e6 - '@typegoose/typegoose': 9.7.0_mongoose@6.2.4 - is-class: 0.0.9 - mongoose: 6.2.4 - reflect-metadata: 0.1.13 - dev: false - /new-find-package-json/1.1.0: resolution: {integrity: sha512-KOH3BNZcTKPzEkaJgG2iSUaurxKmefqRKmCOYH+8xqJytNIgjqU4J88BHfK+gy/UlEzlhccLyuJDJAcCgexSwA==} engines: {node: '>=12.22.0'} diff --git a/src/app.controller.ts b/src/app.controller.ts index d03aaea8..e1be746b 100644 --- a/src/app.controller.ts +++ b/src/app.controller.ts @@ -7,7 +7,7 @@ import { UseInterceptors, } from '@nestjs/common' import { ApiTags } from '@nestjs/swagger' -import { InjectModel } from 'nestjs-typegoose' + import PKG from '../package.json' import { Auth } from './common/decorator/auth.decorator' import { HttpCache } from './common/decorator/cache.decorator' @@ -17,6 +17,7 @@ import { RedisKeys } from './constants/cache.constant' import { OptionModel } from './modules/configs/configs.model' import { CacheService } from './processors/cache/cache.service' import { getRedisKey } from './utils/redis.util' +import { InjectModel } from '~/transformers/model.transformer' @Controller() @ApiTags('Root') export class AppController { diff --git a/src/common/interceptors/analyze.interceptor.ts b/src/common/interceptors/analyze.interceptor.ts index dd08c94c..1b92dce7 100644 --- a/src/common/interceptors/analyze.interceptor.ts +++ b/src/common/interceptors/analyze.interceptor.ts @@ -13,9 +13,9 @@ import { } from '@nestjs/common' import { ReturnModelType } from '@typegoose/typegoose' import isbot from 'isbot' -import { InjectModel } from 'nestjs-typegoose' import { Observable } from 'rxjs' import UAParser from 'ua-parser-js' +import { InjectModel } from '~/transformers/model.transformer' import { RedisKeys } from '~/constants/cache.constant' import { AnalyzeModel } from '~/modules/analyze/analyze.model' import { OptionModel } from '~/modules/configs/configs.model' diff --git a/src/constants/system.constant.ts b/src/constants/system.constant.ts index ad6e9075..930c8ee9 100644 --- a/src/constants/system.constant.ts +++ b/src/constants/system.constant.ts @@ -5,3 +5,7 @@ export const RESPONSE_PASSTHROUGH_METADATA = '__responsePassthrough__' // @nestjs/schedule export { SCHEDULE_CRON_OPTIONS } from '@nestjs/schedule/dist/schedule.constants' + +export const DB_CONNECTION_TOKEN = '__db_connection_token__' + +export const DB_MODEL_TOKEN_SUFFIX = '__db_model_token_suffix__' diff --git a/src/modules/analyze/analyze.service.ts b/src/modules/analyze/analyze.service.ts index 086b0c91..e25544fa 100644 --- a/src/modules/analyze/analyze.service.ts +++ b/src/modules/analyze/analyze.service.ts @@ -3,9 +3,9 @@ import { ReturnModelType } from '@typegoose/typegoose' import dayjs from 'dayjs' import { merge } from 'lodash' import { PipelineStage } from 'mongoose' -import { InjectModel } from 'nestjs-typegoose' import { OptionModel } from '../configs/configs.model' import { AnalyzeModel } from './analyze.model' +import { InjectModel } from '~/transformers/model.transformer' import { RedisKeys } from '~/constants/cache.constant' import { CacheService } from '~/processors/cache/cache.service' import { getRedisKey } from '~/utils/redis.util' diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts index 860ff6fb..6942aa51 100644 --- a/src/modules/auth/auth.service.ts +++ b/src/modules/auth/auth.service.ts @@ -4,9 +4,9 @@ import { DocumentType, ReturnModelType } from '@typegoose/typegoose' import dayjs from 'dayjs' import { isDate, omit } from 'lodash' import { customAlphabet } from 'nanoid/async' -import { InjectModel } from 'nestjs-typegoose' import { TokenDto } from './auth.controller' import { JwtPayload } from './interfaces/jwt-payload.interface' +import { InjectModel } from '~/transformers/model.transformer' import { TokenModel, UserModel as User, diff --git a/src/modules/category/category.service.ts b/src/modules/category/category.service.ts index c2f0de36..b01bf14e 100644 --- a/src/modules/category/category.service.ts +++ b/src/modules/category/category.service.ts @@ -2,10 +2,10 @@ import { Inject, Injectable, forwardRef } from '@nestjs/common' import { DocumentType, ReturnModelType } from '@typegoose/typegoose' import { omit } from 'lodash' import { FilterQuery } from 'mongoose' -import { InjectModel } from 'nestjs-typegoose' import { PostModel } from '../post/post.model' import { PostService } from '../post/post.service' import { CategoryModel, CategoryType } from './category.model' +import { InjectModel } from '~/transformers/model.transformer' import { CannotFindException } from '~/common/exceptions/cant-find.exception' @Injectable() diff --git a/src/modules/comment/comment.service.ts b/src/modules/comment/comment.service.ts index f1905177..9c0c27d5 100644 --- a/src/modules/comment/comment.service.ts +++ b/src/modules/comment/comment.service.ts @@ -3,11 +3,11 @@ import { BadRequestException, Injectable, Logger } from '@nestjs/common' import { DocumentType } from '@typegoose/typegoose' import { BeAnObject } from '@typegoose/typegoose/lib/types' import { LeanDocument, Types } from 'mongoose' -import { InjectModel } from 'nestjs-typegoose' import { ConfigsService } from '../configs/configs.service' import { UserService } from '../user/user.service' import BlockedKeywords from './block-keywords.json' import { CommentModel, CommentRefTypes } from './comment.model' +import { InjectModel } from '~/transformers/model.transformer' import { CannotFindException } from '~/common/exceptions/cant-find.exception' import { DatabaseService } from '~/processors/database/database.service' import { diff --git a/src/modules/configs/configs.service.ts b/src/modules/configs/configs.service.ts index 3ed8b7b3..a5fc729d 100644 --- a/src/modules/configs/configs.service.ts +++ b/src/modules/configs/configs.service.ts @@ -13,7 +13,6 @@ import { ClassConstructor, plainToInstance } from 'class-transformer' import { ValidatorOptions, validateSync } from 'class-validator' import { cloneDeep, mergeWith } from 'lodash' import { LeanDocument } from 'mongoose' -import { InjectModel } from 'nestjs-typegoose' import * as optionDtos from '../configs/configs.dto' import { UserModel } from '../user/user.model' import { UserService } from '../user/user.service' @@ -24,6 +23,7 @@ import { } from './configs.dto' import { IConfig, IConfigKeys } from './configs.interface' import { OptionModel } from './configs.model' +import { InjectModel } from '~/transformers/model.transformer' import { RedisKeys } from '~/constants/cache.constant' import { EventBusEvents } from '~/constants/event.constant' import { CacheService } from '~/processors/cache/cache.service' diff --git a/src/modules/link/link.service.ts b/src/modules/link/link.service.ts index 4a029548..f048c37b 100644 --- a/src/modules/link/link.service.ts +++ b/src/modules/link/link.service.ts @@ -1,7 +1,7 @@ import { BadRequestException, Injectable, Logger } from '@nestjs/common' -import { InjectModel } from 'nestjs-typegoose' import { ConfigsService } from '../configs/configs.service' import { LinkModel, LinkState, LinkType } from './link.model' +import { InjectModel } from '~/transformers/model.transformer' import { isDev } from '~/global/env.global' import { AdminEventsGateway } from '~/processors/gateway/admin/events.gateway' import { EventTypes } from '~/processors/gateway/events.types' diff --git a/src/modules/markdown/markdown.service.ts b/src/modules/markdown/markdown.service.ts index 3498c9a5..a5e22158 100644 --- a/src/modules/markdown/markdown.service.ts +++ b/src/modules/markdown/markdown.service.ts @@ -5,7 +5,6 @@ import JSZip from 'jszip' import { omit } from 'lodash' import { marked } from 'marked' import { Types } from 'mongoose' -import { InjectModel } from 'nestjs-typegoose' import xss from 'xss' import { CategoryModel } from '../category/category.model' import { NoteModel } from '../note/note.model' @@ -13,6 +12,7 @@ import { PageModel } from '../page/page.model' import { PostModel } from '../post/post.model' import { DatatypeDto } from './markdown.dto' import { MarkdownYAMLProperty } from './markdown.interface' +import { InjectModel } from '~/transformers/model.transformer' import { AssetService } from '~/processors/helper/helper.asset.service' import { DatabaseService } from '~/processors/database/database.service' @Injectable() diff --git a/src/modules/note/note.service.ts b/src/modules/note/note.service.ts index 0d71b0c5..026f1115 100644 --- a/src/modules/note/note.service.ts +++ b/src/modules/note/note.service.ts @@ -3,8 +3,8 @@ import { EventEmitter2 } from '@nestjs/event-emitter' import { DocumentType } from '@typegoose/typegoose' import { isDefined, isMongoId } from 'class-validator' import { FilterQuery } from 'mongoose' -import { InjectModel } from 'nestjs-typegoose' import { NoteModel } from './note.model' +import { InjectModel } from '~/transformers/model.transformer' import { CannotFindException } from '~/common/exceptions/cant-find.exception' import { EventBusEvents } from '~/constants/event.constant' import { EventTypes } from '~/processors/gateway/events.types' diff --git a/src/modules/page/page.service.ts b/src/modules/page/page.service.ts index 7ffdaa6e..053ae68a 100644 --- a/src/modules/page/page.service.ts +++ b/src/modules/page/page.service.ts @@ -1,8 +1,8 @@ import { Injectable } from '@nestjs/common' import { isDefined } from 'class-validator' import { omit } from 'lodash' -import { InjectModel } from 'nestjs-typegoose' import { PageModel } from './page.model' +import { InjectModel } from '~/transformers/model.transformer' import { EventTypes } from '~/processors/gateway/events.types' import { WebEventsGateway } from '~/processors/gateway/web/events.gateway' import { ImageService } from '~/processors/helper/helper.image.service' diff --git a/src/modules/post/post.service.ts b/src/modules/post/post.service.ts index f8dd6100..1d71a0cd 100644 --- a/src/modules/post/post.service.ts +++ b/src/modules/post/post.service.ts @@ -8,10 +8,10 @@ import { EventEmitter2 } from '@nestjs/event-emitter' import { isDefined } from 'class-validator' import { omit } from 'lodash' import { FilterQuery, PaginateOptions } from 'mongoose' -import { InjectModel } from 'nestjs-typegoose' import { CategoryService } from '../category/category.service' import { CommentModel } from '../comment/comment.model' import { PostModel } from './post.model' +import { InjectModel } from '~/transformers/model.transformer' import { EventBusEvents } from '~/constants/event.constant' import { EventTypes } from '~/processors/gateway/events.types' import { WebEventsGateway } from '~/processors/gateway/web/events.gateway' diff --git a/src/modules/recently/recently.service.ts b/src/modules/recently/recently.service.ts index 5511b153..88bdb7bc 100644 --- a/src/modules/recently/recently.service.ts +++ b/src/modules/recently/recently.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common' -import { InjectModel } from 'nestjs-typegoose' import { RecentlyModel } from './recently.model' +import { InjectModel } from '~/transformers/model.transformer' import { EventTypes } from '~/processors/gateway/events.types' import { WebEventsGateway } from '~/processors/gateway/web/events.gateway' diff --git a/src/modules/say/say.service.ts b/src/modules/say/say.service.ts index 0d1b0991..de463e4f 100644 --- a/src/modules/say/say.service.ts +++ b/src/modules/say/say.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common' -import { InjectModel } from 'nestjs-typegoose' import { SayModel } from './say.model' +import { InjectModel } from '~/transformers/model.transformer' @Injectable() export class SayService { diff --git a/src/modules/serverless/serverless.service.ts b/src/modules/serverless/serverless.service.ts index ba17c18c..6bb0e07e 100644 --- a/src/modules/serverless/serverless.service.ts +++ b/src/modules/serverless/serverless.service.ts @@ -11,13 +11,13 @@ import { import { Interval } from '@nestjs/schedule' import { isURL } from 'class-validator' import { cloneDeep } from 'lodash' -import { InjectModel } from 'nestjs-typegoose' import PKG from '../../../package.json' import { SnippetModel } from '../snippet/snippet.model' import { FunctionContextRequest, FunctionContextResponse, } from './function.types' +import { InjectModel } from '~/transformers/model.transformer' import { RedisKeys } from '~/constants/cache.constant' import { DATA_DIR, NODE_REQUIRE_PATH } from '~/constants/path.constant' import { CacheService } from '~/processors/cache/cache.service' diff --git a/src/modules/snippet/snippet.service.ts b/src/modules/snippet/snippet.service.ts index c434a8ed..b7875040 100644 --- a/src/modules/snippet/snippet.service.ts +++ b/src/modules/snippet/snippet.service.ts @@ -6,9 +6,9 @@ import { forwardRef, } from '@nestjs/common' import { load } from 'js-yaml' -import { InjectModel } from 'nestjs-typegoose' import { ServerlessService } from '../serverless/serverless.service' import { SnippetModel, SnippetType } from './snippet.model' +import { InjectModel } from '~/transformers/model.transformer' import { RedisKeys } from '~/constants/cache.constant' import { CacheService } from '~/processors/cache/cache.service' import { getRedisKey } from '~/utils' diff --git a/src/modules/user/user.service.ts b/src/modules/user/user.service.ts index d51d76b7..8bb2887a 100644 --- a/src/modules/user/user.service.ts +++ b/src/modules/user/user.service.ts @@ -8,9 +8,9 @@ import { import { ReturnModelType } from '@typegoose/typegoose' import { compareSync } from 'bcrypt' import { nanoid } from 'nanoid' -import { InjectModel } from 'nestjs-typegoose' import { AuthService } from '../auth/auth.service' import { UserDocument, UserModel } from './user.model' +import { InjectModel } from '~/transformers/model.transformer' import { RedisKeys } from '~/constants/cache.constant' import { CacheService } from '~/processors/cache/cache.service' import { getAvatar, sleep } from '~/utils' diff --git a/src/processors/database/database.module.ts b/src/processors/database/database.module.ts index 57f00e45..de927230 100644 --- a/src/processors/database/database.module.ts +++ b/src/processors/database/database.module.ts @@ -1,10 +1,9 @@ import { Global, Module } from '@nestjs/common' -import { TypegooseModule } from 'nestjs-typegoose' import { CategoryModel } from '../../modules/category/category.model' import { PostModel } from '../../modules/post/post.model' import { UserModel } from '../../modules/user/user.model' +import { databaseProvider } from './database.provider' import { DatabaseService } from './database.service' -import { MONGO_DB } from '~/app.config' import { AnalyzeModel } from '~/modules/analyze/analyze.model' import { CommentModel } from '~/modules/comment/comment.model' import { OptionModel } from '~/modules/configs/configs.model' @@ -15,8 +14,9 @@ import { ProjectModel } from '~/modules/project/project.model' import { RecentlyModel } from '~/modules/recently/recently.model' import { SayModel } from '~/modules/say/say.model' import { SnippetModel } from '~/modules/snippet/snippet.model' +import { getProviderByTypegooseClass } from '~/transformers/model.transformer' -const models = TypegooseModule.forFeature([ +const models = [ AnalyzeModel, CategoryModel, CommentModel, @@ -30,19 +30,10 @@ const models = TypegooseModule.forFeature([ SayModel, SnippetModel, UserModel, -]) +].map((model) => getProviderByTypegooseClass(model)) @Module({ - imports: [ - TypegooseModule.forRootAsync({ - useFactory: () => ({ - uri: MONGO_DB.uri, - autoIndex: true, - }), - }), - models, - ], - providers: [DatabaseService], - exports: [models, DatabaseService], + providers: [DatabaseService, databaseProvider, ...models], + exports: [DatabaseService, databaseProvider, ...models], }) @Global() export class DatabaseModule {} diff --git a/src/processors/database/database.provider.ts b/src/processors/database/database.provider.ts new file mode 100644 index 00000000..4b54faa1 --- /dev/null +++ b/src/processors/database/database.provider.ts @@ -0,0 +1,51 @@ +/** + * @copy https://github.com/surmon-china/nodepress/blob/main/src/processors/database/database.provider.ts + */ +import { mongoose } from '@typegoose/typegoose' +import { MONGO_DB } from '~/app.config' +import { DB_CONNECTION_TOKEN } from '~/constants/system.constant' + +export const databaseProvider = { + provide: DB_CONNECTION_TOKEN, + useFactory: async () => { + let reconnectionTask: NodeJS.Timeout | null = null + const RECONNECT_INTERVAL = 6000 + + const connection = () => { + return mongoose.connect(MONGO_DB.uri, {}) + } + const Badge = `[${chalk.yellow('MongoDB')}]` + + const color = (str: TemplateStringsArray, ...args: any[]) => { + return str.map((s) => chalk.green(s)).join('') + } + mongoose.connection.on('connecting', () => { + consola.info(Badge, color`connecting...`) + }) + + mongoose.connection.on('open', () => { + consola.info(Badge, color`readied!`) + if (reconnectionTask) { + clearTimeout(reconnectionTask) + reconnectionTask = null + } + }) + + mongoose.connection.on('disconnected', () => { + consola.error( + Badge, + chalk.red( + `disconnected! retry when after ${RECONNECT_INTERVAL / 1000}s`, + ), + ) + reconnectionTask = setTimeout(connection, RECONNECT_INTERVAL) + }) + + mongoose.connection.on('error', (error) => { + consola.error(Badge, 'error!', error) + mongoose.disconnect() + }) + + return await connection().then((mongoose) => mongoose.connection) + }, +} diff --git a/src/processors/database/database.service.ts b/src/processors/database/database.service.ts index 424ebc3e..6d56845e 100644 --- a/src/processors/database/database.service.ts +++ b/src/processors/database/database.service.ts @@ -1,9 +1,10 @@ import { Inject, Injectable } from '@nestjs/common' import { ReturnModelType, mongoose } from '@typegoose/typegoose' -import { InjectModel, getConnectionToken } from 'nestjs-typegoose' +import { DB_CONNECTION_TOKEN } from '~/constants/system.constant' import { NoteModel } from '~/modules/note/note.model' import { PageModel } from '~/modules/page/page.model' import { PostModel } from '~/modules/post/post.model' +import { InjectModel } from '~/transformers/model.transformer' @Injectable() export class DatabaseService { @@ -14,7 +15,7 @@ export class DatabaseService { private readonly noteModel: ReturnModelType, @InjectModel(PageModel) private readonly pageModel: ReturnModelType, - @Inject(getConnectionToken()) private connection: mongoose.Connection, + @Inject(DB_CONNECTION_TOKEN) private connection: mongoose.Connection, ) {} // @ts-ignore diff --git a/src/processors/helper/helper.counting.service.ts b/src/processors/helper/helper.counting.service.ts index 97e255ee..0cc52f92 100644 --- a/src/processors/helper/helper.counting.service.ts +++ b/src/processors/helper/helper.counting.service.ts @@ -1,7 +1,7 @@ import { Injectable, Logger } from '@nestjs/common' -import { InjectModel } from 'nestjs-typegoose' import { CacheService } from '../cache/cache.service' import { DatabaseService } from '../database/database.service' +import { InjectModel } from '~/transformers/model.transformer' import { ArticleType } from '~/constants/article.constant' import { RedisKeys } from '~/constants/cache.constant' import { NoteModel } from '~/modules/note/note.model' diff --git a/src/processors/helper/helper.cron.service.ts b/src/processors/helper/helper.cron.service.ts index 586d488f..dc7054b5 100644 --- a/src/processors/helper/helper.cron.service.ts +++ b/src/processors/helper/helper.cron.service.ts @@ -8,9 +8,9 @@ import { Cron, CronExpression } from '@nestjs/schedule' import COS from 'cos-nodejs-sdk-v5' import dayjs from 'dayjs' import mkdirp from 'mkdirp' -import { InjectModel } from 'nestjs-typegoose' import { CacheService } from '../cache/cache.service' import { HttpService } from './helper.http.service' +import { InjectModel } from '~/transformers/model.transformer' import { isMainCluster } from '~/app.config' import { CronDescription } from '~/common/decorator/cron-description.decorator' import { RedisKeys } from '~/constants/cache.constant' diff --git a/src/transformers/model.transformer.ts b/src/transformers/model.transformer.ts new file mode 100644 index 00000000..76b12e66 --- /dev/null +++ b/src/transformers/model.transformer.ts @@ -0,0 +1,41 @@ +/** + * @copy https://github.com/surmon-china/nodepress/blob/main/src/transformers/model.transformer.ts + * @file Model transform & helper + * @module transformer/model + * @description 用于将一个基本的 Typegoose 模型转换为 Model 和 Provider,及模型注入器 + * @link https://github.com/kpfromer/nestjs-typegoose/blob/master/src/typegoose.providers.ts + * @author Surmon + */ + +import { Connection } from 'mongoose' +import { Inject, Provider } from '@nestjs/common' +import { getModelForClass } from '@typegoose/typegoose' +import { + DB_CONNECTION_TOKEN, + DB_MODEL_TOKEN_SUFFIX, +} from '~/constants/system.constant' + +export interface TypegooseClass { + new (...args: any[]) +} + +export function getModelToken(modelName: string): string { + return modelName + DB_MODEL_TOKEN_SUFFIX +} + +// Get Provider by Class +export function getProviderByTypegooseClass( + typegooseClass: TypegooseClass, +): Provider { + return { + provide: getModelToken(typegooseClass.name), + useFactory: (connection: Connection) => + getModelForClass(typegooseClass, { existingConnection: connection }), + inject: [DB_CONNECTION_TOKEN], + } +} + +// Model injecter +export function InjectModel(model: TypegooseClass) { + return Inject(getModelToken(model.name)) +} diff --git a/src/utils/crud.util.ts b/src/utils/crud.util.ts index 574b65b0..31f13563 100644 --- a/src/utils/crud.util.ts +++ b/src/utils/crud.util.ts @@ -13,8 +13,8 @@ import { } from '@nestjs/common' import { ApiTags, PartialType } from '@nestjs/swagger' import { AnyParamConstructor } from '@typegoose/typegoose/lib/types' -import { InjectModel } from 'nestjs-typegoose' import pluralize from 'pluralize' +import { InjectModel } from '~/transformers/model.transformer' import { Auth } from '~/common/decorator/auth.decorator' import { Paginator } from '~/common/decorator/http.decorator' import { MongoIdDto } from '~/shared/dto/id.dto' diff --git a/test/src/app.controller.e2e-spec.ts b/test/src/app.controller.e2e-spec.ts index 6ae993e4..a4cf0fe6 100644 --- a/test/src/app.controller.e2e-spec.ts +++ b/test/src/app.controller.e2e-spec.ts @@ -1,10 +1,11 @@ import { NestFastifyApplication } from '@nestjs/platform-fastify' import { Test } from '@nestjs/testing' -import { getModelToken } from 'nestjs-typegoose' + import { AppController } from '~/app.controller' import { fastifyApp } from '~/common/adapters/fastify.adapter' import { OptionModel } from '~/modules/configs/configs.model' import { CacheService } from '~/processors/cache/cache.service' +import { getModelToken } from '~/transformers/model.transformer' describe('AppController (e2e)', () => { let app: NestFastifyApplication diff --git a/test/src/modules/auth/auth.service.spec.ts b/test/src/modules/auth/auth.service.spec.ts index a65a32db..ea7c3df9 100644 --- a/test/src/modules/auth/auth.service.spec.ts +++ b/test/src/modules/auth/auth.service.spec.ts @@ -1,7 +1,7 @@ import { JwtModule } from '@nestjs/jwt' import { PassportModule } from '@nestjs/passport' import { Test } from '@nestjs/testing' -import { getModelToken } from 'nestjs-typegoose' +import { getModelToken } from '~/transformers/model.transformer' import { SECURITY } from '~/app.config' import { AuthService } from '~/modules/auth/auth.service' import { JwtStrategy } from '~/modules/auth/jwt.strategy' diff --git a/test/src/modules/configs/configs.service.spec.ts b/test/src/modules/configs/configs.service.spec.ts index 8740d9fc..fc7361af 100644 --- a/test/src/modules/configs/configs.service.spec.ts +++ b/test/src/modules/configs/configs.service.spec.ts @@ -2,9 +2,9 @@ import { BadRequestException } from '@nestjs/common' import { EventEmitter2 } from '@nestjs/event-emitter' import { Test } from '@nestjs/testing' import { getModelForClass } from '@typegoose/typegoose' -import { getModelToken } from 'nestjs-typegoose' import { dbHelper } from 'test/helper/db-mock.helper' import { MockCacheService, redisHelper } from 'test/helper/redis-mock.helper' +import { getModelToken } from '~/transformers/model.transformer' import { RedisKeys } from '~/constants/cache.constant' import { OptionModel } from '~/modules/configs/configs.model' import { ConfigsService } from '~/modules/configs/configs.service' diff --git a/test/src/modules/markdown/markdown.service.spec.ts b/test/src/modules/markdown/markdown.service.spec.ts index 77b3ff86..f8ea1e29 100644 --- a/test/src/modules/markdown/markdown.service.spec.ts +++ b/test/src/modules/markdown/markdown.service.spec.ts @@ -1,5 +1,5 @@ import { Test } from '@nestjs/testing' -import { getModelToken } from 'nestjs-typegoose' +import { getModelToken } from '~/transformers/model.transformer' import { CategoryModel } from '~/modules/category/category.model' import { MarkdownService } from '~/modules/markdown/markdown.service' import { NoteModel } from '~/modules/note/note.model' diff --git a/test/src/modules/serverless/serverless.service.spec.ts b/test/src/modules/serverless/serverless.service.spec.ts index ed80ffc9..c038a2d7 100644 --- a/test/src/modules/serverless/serverless.service.spec.ts +++ b/test/src/modules/serverless/serverless.service.spec.ts @@ -1,7 +1,7 @@ import { Test } from '@nestjs/testing' import { getModelForClass } from '@typegoose/typegoose' -import { getModelToken } from 'nestjs-typegoose' import { dbHelper } from 'test/helper/db-mock.helper' +import { getModelToken } from '~/transformers/model.transformer' import { createMockedContextResponse } from '~/modules/serverless/mock-response.util' import { ServerlessService } from '~/modules/serverless/serverless.service' import { SnippetModel, SnippetType } from '~/modules/snippet/snippet.model' diff --git a/test/src/modules/snippet/snippet.controller.e2e-spec.ts b/test/src/modules/snippet/snippet.controller.e2e-spec.ts index 152b6126..396d0eb4 100644 --- a/test/src/modules/snippet/snippet.controller.e2e-spec.ts +++ b/test/src/modules/snippet/snippet.controller.e2e-spec.ts @@ -1,10 +1,10 @@ import { NestFastifyApplication } from '@nestjs/platform-fastify' import { Test } from '@nestjs/testing' import { getModelForClass } from '@typegoose/typegoose' -import { getModelToken } from 'nestjs-typegoose' import { dbHelper } from 'test/helper/db-mock.helper' import { MockCacheService, redisHelper } from 'test/helper/redis-mock.helper' import { setupE2EApp } from 'test/helper/register-app.helper' +import { getModelToken } from '~/transformers/model.transformer' import { ServerlessService } from '~/modules/serverless/serverless.service' import { SnippetController } from '~/modules/snippet/snippet.controller' import { SnippetModel, SnippetType } from '~/modules/snippet/snippet.model' diff --git a/test/src/modules/snippet/snippet.service.spec.ts b/test/src/modules/snippet/snippet.service.spec.ts index 770e7fce..49c2db03 100644 --- a/test/src/modules/snippet/snippet.service.spec.ts +++ b/test/src/modules/snippet/snippet.service.spec.ts @@ -1,9 +1,9 @@ import { BadRequestException, NotFoundException } from '@nestjs/common' import { Test } from '@nestjs/testing' import { getModelForClass } from '@typegoose/typegoose' -import { getModelToken } from 'nestjs-typegoose' import { dbHelper } from 'test/helper/db-mock.helper' import { redisHelper } from 'test/helper/redis-mock.helper' +import { getModelToken } from '~/transformers/model.transformer' import { ServerlessService } from '~/modules/serverless/serverless.service' import { SnippetModel, SnippetType } from '~/modules/snippet/snippet.model' import { SnippetService } from '~/modules/snippet/snippet.service' diff --git a/test/src/modules/user/user.controller.e2e-spec.ts b/test/src/modules/user/user.controller.e2e-spec.ts index 697c7aad..2e89321a 100644 --- a/test/src/modules/user/user.controller.e2e-spec.ts +++ b/test/src/modules/user/user.controller.e2e-spec.ts @@ -1,8 +1,8 @@ import { NestFastifyApplication } from '@nestjs/platform-fastify' import { Test } from '@nestjs/testing' -import { getModelToken } from 'nestjs-typegoose' import { dbHelper } from 'test/helper/db-mock.helper' import { redisHelper } from 'test/helper/redis-mock.helper' +import { getModelToken } from '~/transformers/model.transformer' import { fastifyApp } from '~/common/adapters/fastify.adapter' import { AuthService } from '~/modules/auth/auth.service' import { UserController } from '~/modules/user/user.controller' diff --git a/test/src/modules/user/user.service.spec.ts b/test/src/modules/user/user.service.spec.ts index 207b97c3..c340ed3d 100644 --- a/test/src/modules/user/user.service.spec.ts +++ b/test/src/modules/user/user.service.spec.ts @@ -1,6 +1,6 @@ import { BadRequestException } from '@nestjs/common' import { Test } from '@nestjs/testing' -import { getModelToken } from 'nestjs-typegoose' +import { getModelToken } from '~/transformers/model.transformer' import { AuthService } from '~/modules/auth/auth.service' import { UserModel } from '~/modules/user/user.model' import { UserService } from '~/modules/user/user.service'