diff --git a/api/src/chat/repositories/block.repository.ts b/api/src/chat/repositories/block.repository.ts index 78903a3ca..ec9f7d97d 100644 --- a/api/src/chat/repositories/block.repository.ts +++ b/api/src/chat/repositories/block.repository.ts @@ -8,17 +8,17 @@ import { Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; -import { - Document, - Model, - Query, - Types, - UpdateQuery, - UpdateWithAggregationPipeline, -} from 'mongoose'; +import { Model, Types } from 'mongoose'; -import { BaseRepository, DeleteResult } from '@/utils/generics/base-repository'; -import { TFilterQuery } from '@/utils/types/filter.types'; +import { BaseRepository } from '@/utils/generics/base-repository'; +import { + Args, + postDelete, + preCreate, + preDelete, + preUpdate, + preUpdateMany, +} from '@/utils/types/lifecycle-hook-manager.types'; import { BlockCreateDto, BlockDto, BlockUpdateDto } from '../dto/block.dto'; import { @@ -63,10 +63,8 @@ export class BlockRepository extends BaseRepository< * * @param doc - The document that is being created. */ - async preCreate( - _doc: Document & Block & { _id: Types.ObjectId }, - ): Promise { - if (_doc) this.checkDeprecatedAttachmentUrl(_doc); + async preCreate(...[doc]: Args>): Promise { + if (doc) this.checkDeprecatedAttachmentUrl(doc); } /** @@ -77,19 +75,9 @@ export class BlockRepository extends BaseRepository< * @param updates - The update data. */ async preUpdate( - _query: Query< - Document, - Document, - unknown, - Block, - 'findOneAndUpdate' - >, - criteria: TFilterQuery, - updates: - | UpdateWithAggregationPipeline - | UpdateQuery>, + ...[, criteria, updates]: Args> ): Promise { - const update: BlockUpdateDto = updates?.['$set']; + const update = '$set' in updates ? updates.$set : {}; if (update?.category) { const movedBlock = await this.findOne(criteria); @@ -109,7 +97,10 @@ export class BlockRepository extends BaseRepository< { $set: { attachedBlock: null } }, ); } - this.checkDeprecatedAttachmentUrl(update); + + if (update) { + this.checkDeprecatedAttachmentUrl(update); + } } /** @@ -120,18 +111,10 @@ export class BlockRepository extends BaseRepository< * @param updates - The update data. */ async preUpdateMany( - _query: Query< - Document, - Document, - unknown, - Block, - 'updateMany', - Record - >, - criteria: TFilterQuery, - updates: UpdateQuery>, + ...[, criteria, updates]: Args> ): Promise { - const categoryId: string = updates.$set.category; + const categoryId = '$set' in updates && updates.$set?.category; + if (categoryId) { const movedBlocks = await this.find(criteria); @@ -226,16 +209,7 @@ export class BlockRepository extends BaseRepository< * @param query - The delete query. * @param result - The result of the delete operation. */ - async postDelete( - _query: Query< - DeleteResult, - Document, - unknown, - Block, - 'deleteOne' | 'deleteMany' - >, - result: DeleteResult, - ) { + async postDelete(...[, result]: Args>) { if (result.deletedCount > 0) { } } @@ -247,16 +221,7 @@ export class BlockRepository extends BaseRepository< * @param query - The delete query. * @param criteria - The filter criteria for finding blocks to delete. */ - async preDelete( - _query: Query< - DeleteResult, - Document, - unknown, - Block, - 'deleteOne' | 'deleteMany' - >, - criteria: TFilterQuery, - ) { + async preDelete(...[, criteria]: Args>) { const docsToDelete = await this.model.find(criteria); const idsToDelete = docsToDelete.map(({ id }) => id); if (idsToDelete.length > 0) { diff --git a/api/src/chat/repositories/category.repository.ts b/api/src/chat/repositories/category.repository.ts index 69a9974c7..30fe71f7f 100644 --- a/api/src/chat/repositories/category.repository.ts +++ b/api/src/chat/repositories/category.repository.ts @@ -8,10 +8,10 @@ import { ForbiddenException, Injectable, Optional } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; -import { Document, Model, Query } from 'mongoose'; +import { Model } from 'mongoose'; -import { BaseRepository, DeleteResult } from '@/utils/generics/base-repository'; -import { TFilterQuery } from '@/utils/types/filter.types'; +import { BaseRepository } from '@/utils/generics/base-repository'; +import { Args, preDelete } from '@/utils/types/lifecycle-hook-manager.types'; import { CategoryDto } from '../dto/category.dto'; import { Category } from '../schemas/category.schema'; @@ -41,16 +41,7 @@ export class CategoryRepository extends BaseRepository< * @param query - The delete query. * @param criteria - The filter criteria for finding blocks to delete. */ - async preDelete( - query: Query< - DeleteResult, - Document, - unknown, - Category, - 'deleteOne' | 'deleteMany' - >, - criteria: TFilterQuery, - ) { + async preDelete(...[query, criteria]: Args>) { criteria = query.getQuery(); const ids = Array.isArray(criteria._id?.$in) ? criteria._id.$in diff --git a/api/src/chat/repositories/context-var.repository.ts b/api/src/chat/repositories/context-var.repository.ts index fe3f7e353..3cd5f5015 100644 --- a/api/src/chat/repositories/context-var.repository.ts +++ b/api/src/chat/repositories/context-var.repository.ts @@ -13,10 +13,10 @@ import { Optional, } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; -import { Document, Model, Query } from 'mongoose'; +import { Model } from 'mongoose'; -import { BaseRepository, DeleteResult } from '@/utils/generics/base-repository'; -import { TFilterQuery } from '@/utils/types/filter.types'; +import { BaseRepository } from '@/utils/generics/base-repository'; +import { Args, preDelete } from '@/utils/types/lifecycle-hook-manager.types'; import { ContextVarDto } from '../dto/context-var.dto'; import { ContextVar } from '../schemas/context-var.schema'; @@ -47,16 +47,7 @@ export class ContextVarRepository extends BaseRepository< * @param query - The delete query. * @param criteria - The filter criteria for finding context vars to delete. */ - async preDelete( - _query: Query< - DeleteResult, - Document, - unknown, - ContextVar, - 'deleteOne' | 'deleteMany' - >, - criteria: TFilterQuery, - ) { + async preDelete(...[, criteria]: Args>) { const ids = Array.isArray(criteria._id) ? criteria._id : [criteria._id]; for (const id of ids) { diff --git a/api/src/chat/repositories/label.repository.ts b/api/src/chat/repositories/label.repository.ts index bf5bcdd7f..1ca100f1b 100644 --- a/api/src/chat/repositories/label.repository.ts +++ b/api/src/chat/repositories/label.repository.ts @@ -8,16 +8,19 @@ import { Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; -import { Document, Model, Query } from 'mongoose'; +import { Model } from 'mongoose'; -import { BaseRepository, DeleteResult } from '@/utils/generics/base-repository'; -import { TFilterQuery } from '@/utils/types/filter.types'; +import { BaseRepository } from '@/utils/generics/base-repository'; +import { + Args, + postCreate, + preDelete, +} from '@/utils/types/lifecycle-hook-manager.types'; import { LabelDto } from '../dto/label.dto'; import { Label, LABEL_POPULATE, - LabelDocument, LabelFull, LabelPopulate, } from '../schemas/label.schema'; @@ -40,7 +43,7 @@ export class LabelRepository extends BaseRepository< * * @returns A promise that resolves when the update operation is complete. */ - async postCreate(created: LabelDocument): Promise { + async postCreate(...[created]: Args>): Promise { this.eventEmitter.emit( 'hook:label:create', created, @@ -68,16 +71,7 @@ export class LabelRepository extends BaseRepository< * * @returns {Promise} A promise that resolves once the event is emitted. */ - async preDelete( - _query: Query< - DeleteResult, - Document, - unknown, - Label, - 'deleteOne' | 'deleteMany' - >, - _criteria: TFilterQuery