diff --git a/api/src/nlp/repositories/nlp-sample.repository.spec.ts b/api/src/nlp/repositories/nlp-sample.repository.spec.ts index 3d8da6a6..afcbebc7 100644 --- a/api/src/nlp/repositories/nlp-sample.repository.spec.ts +++ b/api/src/nlp/repositories/nlp-sample.repository.spec.ts @@ -219,12 +219,10 @@ describe('NlpSampleRepository', () => { skip: 0, sort: ['text', 'asc'], } as PageQueryDto; - const projection = { text: 1 }; - const result = await nlpSampleRepository.findByEntitiesAndPopulate( { filters, values }, page, - projection, + { text: 1 }, ); expect(Array.isArray(result)).toBe(true); diff --git a/api/src/nlp/repositories/nlp-sample.repository.ts b/api/src/nlp/repositories/nlp-sample.repository.ts index c9305dce..d41294a8 100644 --- a/api/src/nlp/repositories/nlp-sample.repository.ts +++ b/api/src/nlp/repositories/nlp-sample.repository.ts @@ -14,14 +14,13 @@ import { Document, Model, PipelineStage, - ProjectionType, Query, Types, } from 'mongoose'; import { BaseRepository, DeleteResult } from '@/utils/generics/base-repository'; import { PageQueryDto } from '@/utils/pagination/pagination-query.dto'; -import { TFilterQuery } from '@/utils/types/filter.types'; +import { TFilterQuery, TProjectionType } from '@/utils/types/filter.types'; import { TNlpSampleDto } from '../dto/nlp-sample.dto'; import { NlpSampleEntity } from '../schemas/nlp-sample-entity.schema'; @@ -183,7 +182,7 @@ export class NlpSampleRepository extends BaseRepository< values: NlpValue[]; }, page?: PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Aggregate { return this.model.aggregate([ ...this.buildFindByEntitiesStages(criterias), @@ -211,7 +210,7 @@ export class NlpSampleRepository extends BaseRepository< values: NlpValue[]; }, page?: PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise { const aggregation = this.findByEntitiesAggregation( criterias, @@ -239,7 +238,7 @@ export class NlpSampleRepository extends BaseRepository< values: NlpValue[]; }, page?: PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise { const aggregation = this.findByEntitiesAggregation( criterias, diff --git a/api/src/nlp/services/nlp-sample.service.ts b/api/src/nlp/services/nlp-sample.service.ts index 5f789643..17627dd2 100644 --- a/api/src/nlp/services/nlp-sample.service.ts +++ b/api/src/nlp/services/nlp-sample.service.ts @@ -12,7 +12,7 @@ import { NotFoundException, } from '@nestjs/common'; import { OnEvent } from '@nestjs/event-emitter'; -import { Document, ProjectionType, Query } from 'mongoose'; +import { Document, Query } from 'mongoose'; import Papa from 'papaparse'; import { Message } from '@/chat/schemas/message.schema'; @@ -22,7 +22,11 @@ import { LanguageService } from '@/i18n/services/language.service'; import { DeleteResult } from '@/utils/generics/base-repository'; import { BaseService } from '@/utils/generics/base-service'; import { PageQueryDto } from '@/utils/pagination/pagination-query.dto'; -import { TFilterQuery, THydratedDocument } from '@/utils/types/filter.types'; +import { + TFilterQuery, + THydratedDocument, + TProjectionType, +} from '@/utils/types/filter.types'; import { NlpSampleEntityCreateDto } from '../dto/nlp-sample-entity.dto'; import { NlpSampleCreateDto, TNlpSampleDto } from '../dto/nlp-sample.dto'; @@ -78,7 +82,7 @@ export class NlpSampleService extends BaseService< patterns: NlpValueMatchPattern[]; }, page?: PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise { if (!patterns.length) { return await this.repository.find(filters, page, projection); @@ -118,7 +122,7 @@ export class NlpSampleService extends BaseService< patterns: NlpValueMatchPattern[]; }, page?: PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise { if (!patterns.length) { return await this.repository.findAndPopulate(filters, page, projection); diff --git a/api/src/utils/generics/base-repository.ts b/api/src/utils/generics/base-repository.ts index 79a3d448..dda5be49 100644 --- a/api/src/utils/generics/base-repository.ts +++ b/api/src/utils/generics/base-repository.ts @@ -20,7 +20,6 @@ import { HydratedDocument, Model, PipelineStage, - ProjectionType, Query, SortOrder, UpdateQuery, @@ -33,6 +32,7 @@ import { TFilterQuery, TFlattenOption, THydratedDocument, + TProjectionType, TQueryOptions, } from '@/utils/types/filter.types'; @@ -351,7 +351,7 @@ export abstract class BaseRepository< */ protected findOneQuery( criteria: string | TFilterQuery, - projection?: ProjectionType, + projection?: TProjectionType, ): Query { if (!criteria) { // An empty criteria would return the first document that it finds @@ -378,7 +378,7 @@ export abstract class BaseRepository< async findOne( criteria: string | TFilterQuery, options?: ClassTransformOptions, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise { if (!criteria) { // @TODO : Issue a warning ? @@ -401,7 +401,7 @@ export abstract class BaseRepository< */ async findOneAndPopulate( criteria: string | TFilterQuery, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise { this.ensureCanPopulate(); const query = this.findOneQuery(criteria, projection).populate( @@ -413,7 +413,7 @@ export abstract class BaseRepository< protected findQuery( filter: TFilterQuery, pageQuery?: PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Query; /** @@ -422,7 +422,7 @@ export abstract class BaseRepository< protected findQuery( filter: TFilterQuery, pageQuery?: QuerySortDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Query; /** @@ -439,7 +439,7 @@ export abstract class BaseRepository< protected findQuery( filter: TFilterQuery, pageQuery?: QuerySortDto | PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Query { if (Array.isArray(pageQuery)) { const query = this.model.find(filter, projection); @@ -461,7 +461,7 @@ export abstract class BaseRepository< async find( filter: TFilterQuery, pageQuery?: PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise; /** @@ -470,7 +470,7 @@ export abstract class BaseRepository< async find( filter: TFilterQuery, pageQuery?: QuerySortDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise; /** @@ -490,7 +490,7 @@ export abstract class BaseRepository< async find( filter: TFilterQuery, pageQuery?: QuerySortDto | PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise { if (Array.isArray(pageQuery)) { const query = this.findQuery(filter, pageQuery, projection); @@ -518,7 +518,7 @@ export abstract class BaseRepository< async findAndPopulate( filters: TFilterQuery, pageQuery?: PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise; /** @@ -527,7 +527,7 @@ export abstract class BaseRepository< async findAndPopulate( filters: TFilterQuery, pageQuery?: QuerySortDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise; /** @@ -547,7 +547,7 @@ export abstract class BaseRepository< async findAndPopulate( filters: TFilterQuery, pageQuery?: QuerySortDto | PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise { this.ensureCanPopulate(); if (Array.isArray(pageQuery)) { diff --git a/api/src/utils/generics/base-service.ts b/api/src/utils/generics/base-service.ts index 6f0b88af..c29ae101 100644 --- a/api/src/utils/generics/base-service.ts +++ b/api/src/utils/generics/base-service.ts @@ -9,12 +9,12 @@ import { ConflictException, Inject } from '@nestjs/common'; import { ClassTransformOptions } from 'class-transformer'; import { MongoError } from 'mongodb'; -import { ProjectionType } from 'mongoose'; import { LoggerService } from '@/logger/logger.service'; import { TFilterQuery, TFlattenOption, + TProjectionType, TQueryOptions, } from '@/utils/types/filter.types'; @@ -51,14 +51,14 @@ export abstract class BaseService< async findOne( criteria: string | TFilterQuery, options?: ClassTransformOptions, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise { return await this.repository.findOne(criteria, options, projection); } async findOneAndPopulate( criteria: string | TFilterQuery, - projection?: ProjectionType, + projection?: TProjectionType, ) { return await this.repository.findOneAndPopulate(criteria, projection); } @@ -66,7 +66,7 @@ export abstract class BaseService< async find( filter: TFilterQuery, pageQuery?: PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise; /** @@ -75,13 +75,13 @@ export abstract class BaseService< async find( filter: TFilterQuery, pageQuery?: QuerySortDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise; async find( filter: TFilterQuery, pageQuery?: QuerySortDto | PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise { if (Array.isArray(pageQuery)) return await this.repository.find(filter, pageQuery, projection); @@ -92,7 +92,7 @@ export abstract class BaseService< async findAndPopulate( filters: TFilterQuery, pageQuery?: PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise; /** @@ -101,13 +101,13 @@ export abstract class BaseService< async findAndPopulate( filters: TFilterQuery, pageQuery?: QuerySortDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise; async findAndPopulate( filters: TFilterQuery, pageQuery?: QuerySortDto | PageQueryDto, - projection?: ProjectionType, + projection?: TProjectionType, ): Promise { if (Array.isArray(pageQuery)) return await this.repository.findAndPopulate( diff --git a/api/src/utils/types/filter.types.ts b/api/src/utils/types/filter.types.ts index 2c5f2d47..8ac03ad4 100644 --- a/api/src/utils/types/filter.types.ts +++ b/api/src/utils/types/filter.types.ts @@ -146,3 +146,9 @@ export type THydratedDocument = TOmitId>; export type TFlattenOption = { shouldFlatten?: boolean }; export type TQueryOptions = (QueryOptions & TFlattenOption) | null; + +export type TProjectField = 0 | 1; + +export type TProjectionType = { + [K in keyof T]?: TProjectField; +};