11import { Provider } from '@nestjs/common' ;
22import { Connection , Document , Model } from 'mongoose' ;
33import { getConnectionToken , getModelToken } from './common/mongoose.utils' ;
4- import {
5- AsyncModelFactory ,
6- DiscriminatorOptions ,
7- ModelDefinition ,
8- } from './interfaces' ;
9-
10- function addDiscriminators (
11- model : Model < Document > ,
12- discriminators : DiscriminatorOptions [ ] = [ ] ,
13- ) {
14- discriminators . forEach ( ( { name, schema } ) =>
15- model . discriminator ( name , schema ) ,
16- ) ;
17- }
4+ import { AsyncModelFactory , ModelDefinition } from './interfaces' ;
185
196export function createMongooseProviders (
207 connectionName ?: string ,
@@ -23,7 +10,12 @@ export function createMongooseProviders(
2310 return options . reduce (
2411 ( providers , option ) => [
2512 ...providers ,
26- ...createMongooseProviders ( connectionName , option . discriminators ) ,
13+ ...( option . discriminators || [ ] ) . map ( ( d ) => ( {
14+ provide : getModelToken ( d . name ) ,
15+ useFactory : ( model : Model < Document > ) =>
16+ model . discriminator ( d . name , d . schema ) ,
17+ inject : [ getModelToken ( option . name ) ] ,
18+ } ) ) ,
2719 {
2820 provide : getModelToken ( option . name ) ,
2921 useFactory : ( connection : Connection ) => {
@@ -32,7 +24,6 @@ export function createMongooseProviders(
3224 option . schema ,
3325 option . collection ,
3426 ) ;
35- addDiscriminators ( model , option . discriminators ) ;
3627 return model ;
3728 } ,
3829 inject : [ getConnectionToken ( connectionName ) ] ,
@@ -58,19 +49,16 @@ export function createMongooseAsyncProviders(
5849 schema ,
5950 option . collection ,
6051 ) ;
61- addDiscriminators ( model , option . discriminators ) ;
6252 return model ;
6353 } ,
6454 inject : [ getConnectionToken ( connectionName ) , ...( option . inject || [ ] ) ] ,
6555 } ,
66- // discriminators must convert to `AsyncModelFactory`.
67- // Otherwise, the discriminators will register as `Model` before `model.discriminator` and throw OverwriteModelError
68- ...createMongooseAsyncProviders (
69- connectionName ,
70- ( option . discriminators || [ ] ) . map < AsyncModelFactory > (
71- ( { name, schema } ) => ( { name, useFactory : async ( ) => schema } ) ,
72- ) ,
73- ) ,
56+ ...( option . discriminators || [ ] ) . map ( ( d ) => ( {
57+ provide : getModelToken ( d . name ) ,
58+ useFactory : ( model : Model < Document > ) =>
59+ model . discriminator ( d . name , d . schema ) ,
60+ inject : [ getModelToken ( option . name ) ] ,
61+ } ) ) ,
7462 ] ;
7563 } , [ ] as Provider [ ] ) ;
7664}
0 commit comments