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)))
}