use axum::Json;
use axum::extract::State;
use entertainarr_domain::tvshow::entity::TvShowEpisodeProgressInput;
use entertainarr_domain::tvshow::prelude::TvShowService;
use crate::entity::ApiResource;
use crate::entity::tvshow_episode::{
TvShowEpisodeProgressDocument, TvShowEpisodeProgressInputDocument,
};
use crate::server::extractor::user::CurrentUser;
use crate::server::handler::error::ApiErrorResponse;
pub async fn handle<S>(
State(state): State<S>,
CurrentUser(user_id): CurrentUser,
Json(payload): Json<ApiResource<Vec<TvShowEpisodeProgressInputDocument>>>,
) -> Result<Json<ApiResource<Vec<TvShowEpisodeProgressDocument>>>, ApiErrorResponse>
where
S: crate::server::prelude::ServerState,
{
let data = payload
.data
.into_iter()
.map(|item| TvShowEpisodeProgressInput {
user_id,
tvshow_episode_id: item.id.0,
progress: item.attributes.progress,
completed: item.attributes.completed,
})
.collect::<Vec<_>>();
let progressions = state
.tvshow_service()
.upsert_tvshow_episode_progressions(&data)
.await
.map_err(|err| {
tracing::error!(error = ?err, "unable to upsert podcast episode progresses");
ApiErrorResponse::internal()
})?;
Ok(Json(ApiResource::new(
progressions
.into_iter()
.map(TvShowEpisodeProgressDocument::from)
.collect(),
)))
}