diff --git a/api/src/chat/controllers/category.contoller.spec.ts b/api/src/chat/controllers/category.contoller.spec.ts index f8a8063b..70651403 100644 --- a/api/src/chat/controllers/category.contoller.spec.ts +++ b/api/src/chat/controllers/category.contoller.spec.ts @@ -91,7 +91,7 @@ describe('CategoryController', () => { { provide: BlockService, useValue: { - findOne: jest.fn(), + findOneAndPopulate: jest.fn(), }, }, ], diff --git a/api/src/chat/repositories/category.repository.ts b/api/src/chat/repositories/category.repository.ts index 69a9974c..dc628d21 100644 --- a/api/src/chat/repositories/category.repository.ts +++ b/api/src/chat/repositories/category.repository.ts @@ -24,14 +24,11 @@ export class CategoryRepository extends BaseRepository< never, CategoryDto > { - private readonly blockService: BlockService; - constructor( @InjectModel(Category.name) readonly model: Model, - @Optional() blockService?: BlockService, + @Optional() private readonly blockService?: BlockService, ) { super(model, Category); - this.blockService = blockService!; } /** @@ -42,7 +39,7 @@ export class CategoryRepository extends BaseRepository< * @param criteria - The filter criteria for finding blocks to delete. */ async preDelete( - query: Query< + _query: Query< DeleteResult, Document, unknown, @@ -51,23 +48,18 @@ export class CategoryRepository extends BaseRepository< >, criteria: TFilterQuery, ) { - criteria = query.getQuery(); - const ids = Array.isArray(criteria._id?.$in) - ? criteria._id.$in - : Array.isArray(criteria._id) - ? criteria._id - : [criteria._id]; - - for (const id of ids) { - const associatedBlocks = await this.blockService.findOne({ - category: id, + if (criteria._id) { + const block = await this.blockService?.findOneAndPopulate({ + category: criteria._id, }); - if (associatedBlocks) { - const category = await this.findOne({ _id: id }); + + if (block) { throw new ForbiddenException( - `Category ${category?.label || id} has blocks associated with it`, + `Category ${block.category?.label} has at least one associated block`, ); } + } else { + throw new Error('Attempted to delete category using unknown criteria'); } } } diff --git a/api/src/chat/repositories/label.repository.ts b/api/src/chat/repositories/label.repository.ts index bf5bcdd7..cfab4b44 100644 --- a/api/src/chat/repositories/label.repository.ts +++ b/api/src/chat/repositories/label.repository.ts @@ -8,10 +8,9 @@ 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 { LabelDto } from '../dto/label.dto'; import { @@ -59,32 +58,4 @@ export class LabelRepository extends BaseRepository< }, ); } - - /** - * Before deleting a label, this method fetches the label(s) based on the given criteria and emits a delete event. - * - * @param query - The Mongoose query object used for deletion. - * @param criteria - The filter criteria for finding the labels to be deleted. - * - * @returns {Promise} A promise that resolves once the event is emitted. - */ - async preDelete( - _query: Query< - DeleteResult, - Document, - unknown, - Label, - 'deleteOne' | 'deleteMany' - >, - _criteria: TFilterQuery