From 9002ddf491852b4ed1264014a45323d9637ad696 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bitard=20Micha=C3=ABl?= <bitard.michael@gmail.com> Date: Tue, 25 Mar 2025 11:16:18 +0100 Subject: [PATCH] better zodParseEffectTyped --- .../database/queries/titres-etapes.queries.ts | 16 ++-------------- packages/api/src/tools/fp-tools.ts | 13 +++++++++++-- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/packages/api/src/database/queries/titres-etapes.queries.ts b/packages/api/src/database/queries/titres-etapes.queries.ts index 6d2fdc8dd..f4cc9f320 100644 --- a/packages/api/src/database/queries/titres-etapes.queries.ts +++ b/packages/api/src/database/queries/titres-etapes.queries.ts @@ -64,7 +64,7 @@ import { CommuneId } from 'camino-common/src/static/communes' import { EtapeStatutId, etapeStatutIdValidator } from 'camino-common/src/static/etapesStatuts' import { contenuValidator, FlattenedContenu, heritageContenuValidator } from 'camino-common/src/etape-form' import { DemarcheTypeId, demarcheTypeIdValidator } from 'camino-common/src/static/demarchesTypes' -import { Effect, Match, Option, pipe } from 'effect' +import { Effect, Option, pipe } from 'effect' import { CaminoError } from 'camino-common/src/zod-tools' import { callAndExit, shortCircuitError, zodParseEffectTyped } from '../../tools/fp-tools' import { TempDocumentName } from 'camino-common/src/document' @@ -526,19 +526,7 @@ export const getDocumentsByEtapeId = ( demarche: CanReadDemarche ): Effect.Effect<EtapeDocument[], CaminoError<GetDocumentsByEtapeIdErrors>> => getEtapeDocumentLargeObjectIdsByEtapeId(titre_etape_id, pool, user, titreTypeId, titresAdministrationsLocales, entreprisesTitulairesOuAmodiataires, etapeTypeId, demarche).pipe( - Effect.flatMap(result => - zodParseEffectTyped(z.array(etapeDocumentValidator), result).pipe( - Effect.mapError(caminoError => - Match.value(caminoError.message).pipe( - Match.when('Problème de validation de données', () => ({ - ...caminoError, - message: errorParseGetDocumentsByEtapeId, - })), - Match.exhaustive - ) - ) - ) - ) + Effect.flatMap(result => zodParseEffectTyped(z.array(etapeDocumentValidator), result, errorParseGetDocumentsByEtapeId)) ) const getEtapesWithAutomaticStatutValidator = z.object({ diff --git a/packages/api/src/tools/fp-tools.ts b/packages/api/src/tools/fp-tools.ts index 4fedc8aea..b670998c5 100644 --- a/packages/api/src/tools/fp-tools.ts +++ b/packages/api/src/tools/fp-tools.ts @@ -3,8 +3,14 @@ import { Cause, Effect, Exit, pipe } from 'effect' import { ZodTypeAny } from 'zod' import { fromError, isZodErrorLike } from 'zod-validation-error' +/** + * @deprecated use more precise message + */ export type ZodUnparseable = 'Problème de validation de données' +/** + * @deprecated use zodParseEffectTyped + */ export const zodParseEffectCallback = <T extends ZodTypeAny>(validator: T) => (value: unknown): Effect.Effect<T['_output'], CaminoError<ZodUnparseable>> => @@ -20,6 +26,9 @@ const zodErrorToDetail = (myError: unknown): string | undefined => { return undefined } +/** + * @deprecated use zodParseEffectTyped + */ export const zodParseEffect = <T extends ZodTypeAny>(validator: T, item: unknown): Effect.Effect<T['_output'], CaminoError<ZodUnparseable>> => { return Effect.try({ try: () => validator.parse(item), @@ -27,10 +36,10 @@ export const zodParseEffect = <T extends ZodTypeAny>(validator: T, item: unknown }) } -export const zodParseEffectTyped = <T extends ZodTypeAny>(validator: T, item: T['_output']): Effect.Effect<T['_output'], CaminoError<ZodUnparseable>> => { +export const zodParseEffectTyped = <T extends ZodTypeAny, U extends string>(validator: T, item: T['_output'], errorMessage: U): Effect.Effect<T['_output'], CaminoError<U>> => { return Effect.try({ try: () => validator.parse(item), - catch: myError => ({ message: 'Problème de validation de données', detail: zodErrorToDetail(myError), zodErrorReadableMessage: zodErrorToReadableMessage(myError) }), + catch: myError => ({ message: errorMessage, detail: zodErrorToDetail(myError), zodErrorReadableMessage: zodErrorToReadableMessage(myError) }), }) } -- GitLab