import { createGetHttpRequest, createUrlWithParams, DebugHttpClient as Dhc } from "@/libs/apis/clients"; import { TMDB_ROUTE_SEARCH_MOVIE } from "@/libs/apis/routes"; import { type TmdbMovieSearchQueryParams, TmdbMovieSearchResponse } from "@/libs/apis/tmdb/schemas"; import { HttpClient, HttpClientRequest, HttpClientResponse } from "@effect/platform"; import { Data, Effect, pipe } from "effect"; export class DebugHttpClient extends Effect.Service()("DebugHttpClient", { effect: Dhc, }) {} export class TmdbApi extends Effect.Service()("TmdbApi", { effect: Effect.gen(function*() { yield* Effect.logDebug("--- TMDB-API ---"); const client = yield* Dhc; return { searchMovie: (args: TmdbMovieSearchQueryParams) => pipe( createUrlWithParams(TMDB_ROUTE_SEARCH_MOVIE)({ ...args }), Effect.andThen((url: URL) => createGetHttpRequest(url)), Effect.andThen((request: HttpClientRequest.HttpClientRequest) => client.execute(request)), // NOTE: Essentiel à désactiver pour des APIs externes HttpClient.withTracerPropagation(false), Effect.andThen((response: HttpClientResponse.HttpClientResponse) => HttpClientResponse.schemaBodyJson(TmdbMovieSearchResponse)(response) ), Effect.scoped, ), }; }), }) {} export class TmdbApiError extends Data.TaggedError("TmdbApiError")<{ cause: unknown }> {}