entertainarr-adapter-http 0.1.1

HTTP adapter for entertainarr
Documentation
use axum::Json;
use axum::extract::State;
use entertainarr_domain::podcast::prelude::PodcastService;

use crate::entity::ApiResource;
use crate::entity::podcast::{PodcastTaskInputAttributes, PodcastTaskInputDocument};
use crate::server::extractor::user::CurrentUser;
use crate::server::handler::error::ApiErrorResponse;

pub async fn handle<S>(
    State(state): State<S>,
    // TODO handle rights
    CurrentUser(user_id): CurrentUser,
    Json(payload): Json<ApiResource<PodcastTaskInputDocument>>,
) -> Result<axum::http::StatusCode, ApiErrorResponse>
where
    S: crate::server::prelude::ServerState,
{
    match payload.data.attributes {
        PodcastTaskInputAttributes::SynchronizeAll => {
            state
                .podcast_service()
                .request_synchronize_all(Some(user_id))
                .await
                .map_err(|err| {
                    tracing::error!(error = ?err, "unable to create task");
                    ApiErrorResponse::internal()
                })?;
        }
        PodcastTaskInputAttributes::Synchronize { podcast_id } => {
            state
                .podcast_service()
                .request_synchronize(Some(user_id), std::iter::once(podcast_id))
                .await
                .map_err(|err| {
                    tracing::error!(error = ?err, "unable to create task");
                    ApiErrorResponse::internal()
                })?;
        }
    }
    Ok(axum::http::StatusCode::CREATED)
}