Skip to content

Commit c6266cd

Browse files
Merge pull request #692 from lafeuil/master
fix: improve the providing of discriminator models
2 parents 470652d + cd11e48 commit c6266cd

File tree

1 file changed

+13
-25
lines changed

1 file changed

+13
-25
lines changed

lib/mongoose.providers.ts

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,7 @@
11
import { Provider } from '@nestjs/common';
22
import { Connection, Document, Model } from 'mongoose';
33
import { 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

196
export 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

Comments
 (0)