entertainarr-adapter-http 0.1.1

HTTP adapter for entertainarr
Documentation
use axum::Json;
use axum::extract::State;
use entertainarr_domain::tvshow::prelude::TvShowService;
use serde_qs::axum::QsQuery;

use crate::entity::ApiResource;
use crate::entity::tvshow_episode::{
    ListTvShowEpisodeParams, TvShowEpisodeDocument, TvShowEpisodeRelation,
};
use crate::server::extractor::user::CurrentUser;
use crate::server::handler::error::ApiErrorResponse;
use crate::server::handler::prelude::FromDomainResponse;

pub async fn handle<S>(
    State(state): State<S>,
    CurrentUser(user_id): CurrentUser,
    QsQuery(params): QsQuery<ListTvShowEpisodeParams>,
) -> Result<Json<ApiResource<Vec<TvShowEpisodeDocument>, TvShowEpisodeRelation>>, ApiErrorResponse>
where
    S: crate::server::prelude::ServerState,
{
    let language = entertainarr_domain::language::Language::En;
    let response = state
        .tvshow_service()
        .list_tvshow_episodes(
            entertainarr_domain::tvshow::entity::ListTvShowEpisodeParams {
                user_id,
                language,
                filter: entertainarr_domain::tvshow::entity::ListTvShowEpisodeFilter {
                    tvshow_ids: &[],
                    season_ids: &[],
                    subscribed: params.filter.subscribed,
                    watched: params.filter.watched,
                },
                sort: params.sort.into(),
                page: params.page.into(),
            },
        )
        .await
        .map_err(|err| {
            tracing::error!(error = ?err, "unable to list tvshow episodes");
            ApiErrorResponse::internal()
        })?;

    Ok(Json(ApiResource::from_response(response, params.include)))
}