33 lines
1.4 KiB
TypeScript
33 lines
1.4 KiB
TypeScript
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>()("DebugHttpClient", {
|
|
effect: Dhc,
|
|
}) {}
|
|
|
|
export class TmdbApi extends Effect.Service<TmdbApi>()("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 }> {}
|