entertainarr-adapter-http 0.1.1

HTTP adapter for entertainarr
Documentation
use axum::Json;
use axum::extract::{Path, State};
use entertainarr_domain::podcast::prelude::PodcastService;
use serde_qs::axum::QsQuery;

use crate::entity::ApiResource;
use crate::entity::podcast_episode::{
    ListPodcastEpisodeParams, PodcastEpisodeDocument, PodcastEpisodeRelation,
};
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,
    Path(podcast_id): Path<u64>,
    QsQuery(params): QsQuery<ListPodcastEpisodeParams>,
) -> Result<Json<ApiResource<Vec<PodcastEpisodeDocument>, PodcastEpisodeRelation>>, ApiErrorResponse>
where
    S: crate::server::prelude::ServerState,
{
    let response = state
        .podcast_service()
        .list_podcast_episode(
            entertainarr_domain::podcast::entity::ListPodcastEpisodeParams {
                user_id,
                filter: entertainarr_domain::podcast::entity::ListPodcastEpisodeFilter {
                    podcast_ids: &[podcast_id],
                    filtered: Some(false),
                    subscribed: None,
                    watched: None,
                },
                sort: params.sort.into(),
                page: params.page.into(),
            },
        )
        .await
        .map_err(|err| {
            tracing::error!(error = ?err, "unable to list podcast episodes");
            ApiErrorResponse::internal()
        })?;

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