diff --git a/app/api/paragraphExtraction/application/PXCreateExtractor.ts b/app/api/paragraphExtraction/application/PXCreateExtractor.ts index 16fe06e30a..c7b1a504e4 100644 --- a/app/api/paragraphExtraction/application/PXCreateExtractor.ts +++ b/app/api/paragraphExtraction/application/PXCreateExtractor.ts @@ -3,11 +3,10 @@ import { z } from 'zod'; import { UseCase } from 'api/common.v2/contracts/UseCase'; import { TemplatesDataSource } from 'api/templates.v2/contracts/TemplatesDataSource'; +import { IdGenerator } from 'api/common.v2/contracts/IdGenerator'; import { PXExtractor } from '../domain/PXExtractor'; import { PXExtractorsDataSource } from '../domain/PXExtractorDataSource'; -import { SourceTemplateNotFoundError } from '../domain/SourceTemplateNotFoundError'; -import { TargetTemplateNotFoundError } from '../domain/TargetTemplateNotFoundError'; -import { IdGenerator } from 'api/common.v2/contracts/IdGenerator'; +import { PXErrorCode, PXValidationError } from '../domain/PXValidationError'; type Input = z.infer; type Output = PXExtractor; @@ -33,11 +32,17 @@ export class PXCreateExtractor implements UseCase { ]); if (!targetTemplate) { - throw new TargetTemplateNotFoundError(input.targetTemplateId); + throw new PXValidationError( + PXErrorCode.TARGET_TEMPLATE_NOT_FOUND, + `Target template with id ${input.targetTemplateId} was not found` + ); } if (!sourceTemplate) { - throw new SourceTemplateNotFoundError(input.sourceTemplateId); + throw new PXValidationError( + PXErrorCode.SOURCE_TEMPLATE_NOT_FOUND, + `Source template with id ${input.sourceTemplateId} was not found` + ); } const extractor = new PXExtractor({ diff --git a/app/api/paragraphExtraction/application/specs/PXCreateExtractor.spec.ts b/app/api/paragraphExtraction/application/specs/PXCreateExtractor.spec.ts index 52acc44d9e..d6a175d953 100644 --- a/app/api/paragraphExtraction/application/specs/PXCreateExtractor.spec.ts +++ b/app/api/paragraphExtraction/application/specs/PXCreateExtractor.spec.ts @@ -7,10 +7,7 @@ import { DefaultTemplatesDataSource } from 'api/templates.v2/database/data_sourc import { getFixturesFactory } from 'api/utils/fixturesFactory'; import { testingEnvironment } from 'api/utils/testingEnvironment'; -import { SourceTemplateNotFoundError } from '../../domain/SourceTemplateNotFoundError'; -import { TargetSourceTemplateEqualError } from '../../domain/TargetSourceTemplateEqualError'; -import { TargetTemplateInvalidError } from '../../domain/TargetTemplateInvalidError'; -import { TargetTemplateNotFoundError } from '../../domain/TargetTemplateNotFoundError'; +import { PXErrorCode } from 'api/paragraphExtraction/domain/PXValidationError'; import { mongoPXExtractorsCollection, MongoPXExtractorsDataSource, @@ -72,7 +69,6 @@ describe('PXCreateExtractor', () => { it('should throw if target Template does not exist', async () => { const { createExtractor } = setUpUseCase(); - const targetTemplateId = new ObjectId().toString(); const promise = createExtractor.execute({ @@ -80,12 +76,13 @@ describe('PXCreateExtractor', () => { targetTemplateId, }); - await expect(promise).rejects.toEqual(new TargetTemplateNotFoundError(targetTemplateId)); + await expect(promise).rejects.toMatchObject({ + code: PXErrorCode.TARGET_TEMPLATE_NOT_FOUND, + }); }); it('should throw if source Template does not exist', async () => { const { createExtractor } = setUpUseCase(); - const sourceTemplateId = new ObjectId().toString(); const promise = createExtractor.execute({ @@ -93,7 +90,9 @@ describe('PXCreateExtractor', () => { sourceTemplateId, }); - await expect(promise).rejects.toEqual(new SourceTemplateNotFoundError(sourceTemplateId)); + await expect(promise).rejects.toMatchObject({ + code: PXErrorCode.SOURCE_TEMPLATE_NOT_FOUND, + }); }); it('should throw if target template is not valid for create an Extractor', async () => { @@ -104,12 +103,11 @@ describe('PXCreateExtractor', () => { targetTemplateId: invalidTargetTemplate._id.toString(), }); - await expect(promise).rejects.toEqual( - new TargetTemplateInvalidError(invalidTargetTemplate._id.toString()) - ); + await expect(promise).rejects.toMatchObject({ + code: PXErrorCode.TARGET_TEMPLATE_INVALID, + }); const dbPXExtractors = await testingEnvironment.db.getAllFrom(mongoPXExtractorsCollection); - expect(dbPXExtractors).toEqual([]); }); @@ -121,10 +119,11 @@ describe('PXCreateExtractor', () => { targetTemplateId: targetTemplate._id.toString(), }); - await expect(promise).rejects.toEqual(new TargetSourceTemplateEqualError()); + await expect(promise).rejects.toMatchObject({ + code: PXErrorCode.TARGET_SOURCE_TEMPLATE_EQUAL, + }); const dbPXExtractors = await testingEnvironment.db.getAllFrom(mongoPXExtractorsCollection); - expect(dbPXExtractors).toEqual([]); }); }); diff --git a/app/api/paragraphExtraction/domain/PXExtractor.ts b/app/api/paragraphExtraction/domain/PXExtractor.ts index 6e66dd0e78..3a4b3901a3 100644 --- a/app/api/paragraphExtraction/domain/PXExtractor.ts +++ b/app/api/paragraphExtraction/domain/PXExtractor.ts @@ -1,6 +1,5 @@ import { Template } from 'api/templates.v2/model/Template'; -import { TargetTemplateInvalidError } from './TargetTemplateInvalidError'; -import { TargetSourceTemplateEqualError } from './TargetSourceTemplateEqualError'; +import { PXValidationError, PXErrorCode } from './PXValidationError'; export type PXExtractorProps = { id: string; @@ -25,11 +24,17 @@ export class PXExtractor { private validate() { if (!this.targetTemplate.getPropertiesByType('markdown').length) { - throw new TargetTemplateInvalidError(this.targetTemplate.id); + throw new PXValidationError( + PXErrorCode.TARGET_TEMPLATE_INVALID, + `Target template with id ${this.targetTemplate.id} should have at least one rich text property` + ); } if (this.targetTemplate.id === this.sourceTemplate.id) { - throw new TargetSourceTemplateEqualError(); + throw new PXValidationError( + PXErrorCode.TARGET_SOURCE_TEMPLATE_EQUAL, + 'Target and Source template cannot be the same' + ); } } } diff --git a/app/api/paragraphExtraction/domain/PXValidationError.ts b/app/api/paragraphExtraction/domain/PXValidationError.ts new file mode 100644 index 0000000000..46d42ef715 --- /dev/null +++ b/app/api/paragraphExtraction/domain/PXValidationError.ts @@ -0,0 +1,17 @@ +export enum PXErrorCode { + TARGET_TEMPLATE_NOT_FOUND = 'TARGET_TEMPLATE_NOT_FOUND', + SOURCE_TEMPLATE_NOT_FOUND = 'SOURCE_TEMPLATE_NOT_FOUND', + TARGET_TEMPLATE_INVALID = 'TARGET_TEMPLATE_INVALID', + TARGET_SOURCE_TEMPLATE_EQUAL = 'TARGET_SOURCE_TEMPLATE_EQUAL', +} + +export class PXValidationError extends Error { + constructor( + public code: PXErrorCode, + message: string, + options?: ErrorOptions + ) { + super(message, options); + this.name = 'PXValidationError'; + } +} diff --git a/app/api/paragraphExtraction/domain/SourceTemplateNotFoundError.ts b/app/api/paragraphExtraction/domain/SourceTemplateNotFoundError.ts deleted file mode 100644 index f387625360..0000000000 --- a/app/api/paragraphExtraction/domain/SourceTemplateNotFoundError.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class SourceTemplateNotFoundError extends Error { - constructor(targetTemplateId: string) { - super(`Source template with id ${targetTemplateId} was not found`); - this.name = 'SourceTemplateNotFoundError'; - } -} diff --git a/app/api/paragraphExtraction/domain/TargetSourceTemplateEqualError.ts b/app/api/paragraphExtraction/domain/TargetSourceTemplateEqualError.ts deleted file mode 100644 index e1d86fda60..0000000000 --- a/app/api/paragraphExtraction/domain/TargetSourceTemplateEqualError.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class TargetSourceTemplateEqualError extends Error { - constructor() { - super('Target and Source template cannot be the same'); - this.name = 'TargetSourceTemplateEqualError'; - } -} diff --git a/app/api/paragraphExtraction/domain/TargetTemplateInvalidError.ts b/app/api/paragraphExtraction/domain/TargetTemplateInvalidError.ts deleted file mode 100644 index 921399dfa1..0000000000 --- a/app/api/paragraphExtraction/domain/TargetTemplateInvalidError.ts +++ /dev/null @@ -1,8 +0,0 @@ -export class TargetTemplateInvalidError extends Error { - constructor(targetTemplateId: string) { - super( - `Target template with id ${targetTemplateId} should have at least one rich text property` - ); - this.name = 'TargetTemplateInvalidError'; - } -} diff --git a/app/api/paragraphExtraction/domain/TargetTemplateNotFoundError.ts b/app/api/paragraphExtraction/domain/TargetTemplateNotFoundError.ts deleted file mode 100644 index 66c97b2dc6..0000000000 --- a/app/api/paragraphExtraction/domain/TargetTemplateNotFoundError.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class TargetTemplateNotFoundError extends Error { - constructor(targetTemplateId: string) { - super(`Target template with id ${targetTemplateId} was not found`); - this.name = 'TargetTemplateNotFoundError'; - } -}