/* @flow */ /* eslint-disable no-param-reassign */ import type { Resolver, ObjectTypeComposer } from 'graphql-compose'; import type { MongooseDocument } from 'mongoose'; import { filterHelper, filterHelperArgs } from './helpers'; import type { ExtendedResolveParams, GenResolverOpts } from './index'; import { beforeQueryHelper } from './helpers/beforeQueryHelper'; export default function count( model: Class, // === MongooseModel tc: ObjectTypeComposer, opts?: GenResolverOpts ): Resolver { if (!model || !model.modelName || !model.schema) { throw new Error('First arg for Resolver count() should be instance of Mongoose Model.'); } if (!tc || tc.constructor.name !== 'ObjectTypeComposer') { throw new Error('Second arg for Resolver count() should be instance of ObjectTypeComposer.'); } return tc.schemaComposer.createResolver({ type: 'Int', name: 'count', kind: 'query', args: { ...filterHelperArgs(tc, model, { filterTypeName: `Filter${tc.getTypeName()}Input`, model, ...(opts && opts.filter), }), }, resolve: (resolveParams: ExtendedResolveParams) => { resolveParams.query = model.find(); resolveParams.model = model; filterHelper(resolveParams); if (resolveParams.query.countDocuments) { // mongoose 5.2.0 and above resolveParams.query.countDocuments(); return beforeQueryHelper(resolveParams); } else { // mongoose 5 and below resolveParams.query.count(); return beforeQueryHelper(resolveParams); } }, }); }