diff --git a/packages/query-typegoose/__tests__/services/typegoose-query.service.spec.ts b/packages/query-typegoose/__tests__/services/typegoose-query.service.spec.ts index f946ca436..0f38c68c9 100644 --- a/packages/query-typegoose/__tests__/services/typegoose-query.service.spec.ts +++ b/packages/query-typegoose/__tests__/services/typegoose-query.service.spec.ts @@ -13,7 +13,7 @@ describe('TypegooseQueryService', () => { class TestEntityService extends TypegooseQueryService { constructor(@InjectModel(TestEntity) readonly model: ReturnModelType) { - super(model); + super(model, { documentToObjectOptions: { virtuals: true } }); } } diff --git a/packages/query-typegoose/src/index.ts b/packages/query-typegoose/src/index.ts index 4b7995d4e..b0c427a67 100644 --- a/packages/query-typegoose/src/index.ts +++ b/packages/query-typegoose/src/index.ts @@ -1,2 +1,2 @@ -export { TypegooseQueryService } from './services'; +export { TypegooseQueryService, TypegooseQueryServiceOpts } from './services'; export { NestjsQueryTypegooseModule } from './module'; diff --git a/packages/query-typegoose/src/services/typegoose-query.service.ts b/packages/query-typegoose/src/services/typegoose-query.service.ts index 63c811dd9..f8287660d 100644 --- a/packages/query-typegoose/src/services/typegoose-query.service.ts +++ b/packages/query-typegoose/src/services/typegoose-query.service.ts @@ -9,11 +9,15 @@ import { QueryService, UpdateManyResponse, } from '@nestjs-query/core'; -import { Logger, NotFoundException } from '@nestjs/common'; -import { FilterQuery, UpdateQuery } from 'mongoose'; +import { NotFoundException } from '@nestjs/common'; +import { DocumentToObjectOptions, FilterQuery, UpdateQuery } from 'mongoose'; import { ReturnModelType } from '@typegoose/typegoose'; import escapeRegExp from 'lodash.escaperegexp'; +export interface TypegooseQueryServiceOpts { + documentToObjectOptions?: DocumentToObjectOptions; +} + const mongoOperatorMapper: { [k: string]: string } = { eq: '$eq', neq: '$ne', @@ -28,25 +32,27 @@ const mongoOperatorMapper: { [k: string]: string } = { }; /** - * Base class for all query services that use a `typeorm` Repository. + * Base class for all query services that use Typegoose. * * @example * * ```ts * @QueryService(TodoItemEntity) - * export class TodoItemService extends TypeOrmQueryService { + * export class TodoItemService extends TypegooseQueryService { * constructor( - * @InjectRepository(TodoItemEntity) repo: Repository, + * @InjectModel(TodoItemEntity) model: ReturnModelType, * ) { - * super(repo); + * super(model); * } * } * ``` */ export class TypegooseQueryService implements QueryService { - protected readonly logger = new Logger(TypegooseQueryService.name); + protected readonly documentToObjectOptions: DocumentToObjectOptions; - constructor(readonly Model: ReturnModelType Entity>) {} + constructor(readonly Model: ReturnModelType Entity>, opts?: TypegooseQueryServiceOpts) { + this.documentToObjectOptions = opts?.documentToObjectOptions || { virtuals: true }; + } protected buildExpression(filter: Filter): FilterQuery Entity> { return Object.entries(filter).reduce((prev: FilterQuery Entity>, [key, value]) => { @@ -81,7 +87,6 @@ export class TypegooseQueryService implements QueryService { $regex: regExp, }; } - this.logger.error(`Operator ${fieldKey} not supported yet`); return prevCondition; }, {}, @@ -93,7 +98,7 @@ export class TypegooseQueryService implements QueryService { }, {}); } - private getSchemaKey(key: string) { + private getSchemaKey(key: string): string { return key === 'id' ? '_id' : key; } @@ -122,7 +127,7 @@ export class TypegooseQueryService implements QueryService { })), }, ).exec(); - return entities.map((doc) => doc.toObject({ virtuals: true }) as Entity); + return entities.map((doc) => doc.toObject(this.documentToObjectOptions) as Entity); } aggregate(filter: Filter, aggregate: AggregateQuery): Promise> { @@ -144,7 +149,7 @@ export class TypegooseQueryService implements QueryService { */ async findById(id: string): Promise { const doc = await this.Model.findById(id); - return doc?.toObject({ virtuals: true }) as Entity; + return doc?.toObject(this.documentToObjectOptions) as Entity; } /** @@ -180,7 +185,7 @@ export class TypegooseQueryService implements QueryService { async createOne>(record: C): Promise { const doc = new this.Model(record); await doc.save(record); - return doc.toObject({ virtuals: true }) as Entity; + return doc.toObject(this.documentToObjectOptions) as Entity; } /** @@ -213,7 +218,7 @@ export class TypegooseQueryService implements QueryService { this.ensureIdIsNotPresent(update); const doc = await this.Model.findByIdAndUpdate(id, update as UpdateQuery Entity>, { new: true }); if (doc) { - return doc.toObject({ virtuals: true }) as Entity; + return doc.toObject(this.documentToObjectOptions) as Entity; } throw new NotFoundException(`Unable to find ${this.Model.modelName} with id: ${id}`); } @@ -254,7 +259,7 @@ export class TypegooseQueryService implements QueryService { async deleteOne(id: string | number): Promise { const doc = await this.Model.findByIdAndDelete(id); if (doc) { - return doc.toObject({ virtuals: true }) as Entity; + return doc.toObject(this.documentToObjectOptions) as Entity; } throw new NotFoundException(`Unable to find ${this.Model.modelName} with id: ${id}`); } @@ -364,7 +369,7 @@ export class TypegooseQueryService implements QueryService { const referenceId = curr[relationName as keyof Entity]; if (referenceId) { const relationDoc = await relationModel.findOne(referenceId); - map.set(curr, relationDoc?.toObject({ virtuals: true })); + map.set(curr, relationDoc?.toObject(this.documentToObjectOptions)); } return map; }, Promise.resolve(new Map()));