diff --git a/api/src/i18n/repositories/language.repository.ts b/api/src/i18n/repositories/language.repository.ts index 09128054..77bf26a7 100644 --- a/api/src/i18n/repositories/language.repository.ts +++ b/api/src/i18n/repositories/language.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 { LanguageDto } from '../dto/language.dto'; import { Language } from '../schemas/language.schema'; @@ -26,30 +25,4 @@ export class LanguageRepository extends BaseRepository< constructor(@InjectModel(Language.name) readonly model: Model) { super(model, Language); } - - /** - * Pre-delete hook that triggers before an language is deleted. - * - * @param query The query used to delete the language. - * @param criteria The filter criteria used to find the language for deletion. - */ - async preDelete( - _query: Query< - DeleteResult, - Document, - unknown, - Language, - 'deleteOne' | 'deleteMany' - >, - _criteria: TFilterQuery, - ): Promise { - if (_criteria._id) { - const language = await this.find( - typeof _criteria === 'string' ? { _id: _criteria } : _criteria, - ); - this.eventEmitter.emit('hook:language:delete', language); - } else { - throw new Error('Attempted to delete language using unknown criteria'); - } - } } diff --git a/api/src/nlp/services/nlp-sample.service.ts b/api/src/nlp/services/nlp-sample.service.ts index f2f33e7d..665f8cc7 100644 --- a/api/src/nlp/services/nlp-sample.service.ts +++ b/api/src/nlp/services/nlp-sample.service.ts @@ -12,13 +12,15 @@ import { NotFoundException, } from '@nestjs/common'; import { OnEvent } from '@nestjs/event-emitter'; +import { Document, Query } from 'mongoose'; import Papa from 'papaparse'; import { Message } from '@/chat/schemas/message.schema'; import { Language } from '@/i18n/schemas/language.schema'; import { LanguageService } from '@/i18n/services/language.service'; +import { DeleteResult } from '@/utils/generics/base-repository'; import { BaseService } from '@/utils/generics/base-service'; -import { THydratedDocument } from '@/utils/types/filter.types'; +import { TFilterQuery, THydratedDocument } from '@/utils/types/filter.types'; import { NlpSampleEntityCreateDto } from '../dto/nlp-sample-entity.dto'; import { NlpSampleCreateDto, TNlpSampleDto } from '../dto/nlp-sample.dto'; @@ -233,16 +235,48 @@ export class NlpSampleService extends BaseService< * * @param language The language that has been deleted. */ - @OnEvent('hook:language:delete') - async handleLanguageDelete(language: Language) { - await this.updateMany( + @OnEvent('hook:language:preDelete') + async handleLanguageDelete( + _query: Query< + DeleteResult, + Document, + unknown, + Language, + 'deleteOne' | 'deleteMany' + >, + criteria: TFilterQuery, + ) { + const deletedLanguages = await this.languageService.find( + criteria, + undefined, { - language: language.id, - }, - { - language: null, + id: 1, }, ); + const deletedLanguagesIds = deletedLanguages.map( + (deletedLanguage) => deletedLanguage.id, + ); + + this.logger.debug( + `Found ${deletedLanguagesIds.length} languages to clean up`, + ); + + if (deletedLanguagesIds.length > 0) { + await this.updateMany( + { + language: { + $in: deletedLanguagesIds, + }, + }, + { + language: null, + }, + ).then((result) => { + this.logger.debug( + `Cleaned up languageId from ${result.modifiedCount} NLP samples`, + ); + }); + } } @OnEvent('hook:message:preCreate')