entertainarr-adapter-http 0.1.0

HTTP adapter for entertainarr
Documentation
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(),
    )))
}