Merge pull request #871 from Hexastack/fix/cleanup-languageId-nlp-sample

fix: cleanup languageId from NlpSamples on language deletion
This commit is contained in:
Yassine 2025-04-12 07:02:03 +01:00 committed by GitHub
commit ef1713145b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 44 additions and 37 deletions

View File

@ -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<Language>) {
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<Language, any, any>,
unknown,
Language,
'deleteOne' | 'deleteMany'
>,
_criteria: TFilterQuery<Language>,
): Promise<void> {
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');
}
}
}

View File

@ -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<Language, any, any>,
unknown,
Language,
'deleteOne' | 'deleteMany'
>,
criteria: TFilterQuery<Language>,
) {
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')