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