1 | import { composeWithMongoose, composeWithMongooseDiscriminators } from 'graphql-compose-mongoose';
|
2 | import { SchemaComposer } from 'graphql-compose';
|
3 | import { camelCase } from 'camel-case';
|
4 | import mongoose from 'mongoose';
|
5 | import { loadFromModuleExportExpression } from '@graphql-mesh/utils';
|
6 |
|
7 | const modelQueryOperations = ['findById', 'findByIds', 'findOne', 'findMany', 'count', 'connection', 'pagination'];
|
8 | const modelMutationOperations = [
|
9 | 'createOne',
|
10 | 'createMany',
|
11 | 'updateById',
|
12 | 'updateOne',
|
13 | 'updateMany',
|
14 | 'removeById',
|
15 | 'removeOne',
|
16 | 'removeMany',
|
17 | ];
|
18 | class MongooseHandler {
|
19 | constructor({ config, pubsub }) {
|
20 | this.config = config;
|
21 | this.pubsub = pubsub;
|
22 | }
|
23 | async getMeshSource() {
|
24 | var _a;
|
25 | if (this.config.connectionString) {
|
26 | await mongoose.connect(this.config.connectionString, {
|
27 | useNewUrlParser: true,
|
28 | useUnifiedTopology: true,
|
29 | });
|
30 | this.pubsub.subscribe('destroy', () => mongoose.disconnect());
|
31 | }
|
32 | const schemaComposer = new SchemaComposer();
|
33 | await Promise.all([
|
34 | Promise.all((_a = this.config.models) === null || _a === void 0 ? void 0 : _a.map(async (modelConfig) => {
|
35 | const model = await loadFromModuleExportExpression(modelConfig.path, modelConfig.name);
|
36 | const modelTC = composeWithMongoose(model, modelConfig.options);
|
37 | await Promise.all([
|
38 | Promise.all(modelQueryOperations.map(async (queryOperation) => schemaComposer.Query.addFields({
|
39 | [camelCase(`${modelConfig.name}_${queryOperation}`)]: modelTC.getResolver(queryOperation),
|
40 | }))),
|
41 | Promise.all(modelMutationOperations.map(async (mutationOperation) => schemaComposer.Mutation.addFields({
|
42 | [camelCase(`${modelConfig.name}_${mutationOperation}`)]: modelTC.getResolver(mutationOperation),
|
43 | }))),
|
44 | ]);
|
45 | })),
|
46 | Promise.all(this.config.discriminators.map(async (discriminatorConfig) => {
|
47 | const discriminator = await loadFromModuleExportExpression(discriminatorConfig.path, discriminatorConfig.name);
|
48 | const discriminatorTC = composeWithMongooseDiscriminators(discriminator, discriminatorConfig.options);
|
49 | await Promise.all([
|
50 | Promise.all(modelQueryOperations.map(async (queryOperation) => schemaComposer.Query.addFields({
|
51 | [camelCase(`${discriminatorConfig.name}_${queryOperation}`)]: discriminatorTC.getResolver(queryOperation),
|
52 | }))),
|
53 | Promise.all(modelMutationOperations.map(async (mutationOperation) => schemaComposer.Mutation.addFields({
|
54 | [camelCase(`${discriminatorConfig.name}_${mutationOperation}`)]: discriminatorTC.getResolver(mutationOperation),
|
55 | }))),
|
56 | ]);
|
57 | })),
|
58 | ]);
|
59 | const schema = schemaComposer.buildSchema();
|
60 | return {
|
61 | schema,
|
62 | };
|
63 | }
|
64 | }
|
65 |
|
66 | export default MongooseHandler;
|
67 |
|