entertainarr-adapter-http 0.1.1

HTTP adapter for entertainarr
Documentation
use axum::routing::{delete, get, post};
use entertainarr_domain::podcast::entity::PodcastWithSubscription;

use crate::entity::podcast::{
    PodcastAttributes, PodcastDocument, PodcastRelation, PodcastRelationships,
};
use crate::entity::podcast_subscription::{PodcastSubscriptionEntity, PodcastSubscriptionMeta};
use crate::entity::{ApiResource, Couple, Relation};

pub mod find;
pub mod subscription;
pub mod task;
pub mod user_list;

pub fn create<S>() -> axum::Router<S>
where
    S: crate::server::prelude::ServerState + Clone,
{
    axum::Router::new()
        .route("/podcasts/{podcast_id}", get(find::handle::<S>))
        .route(
            "/users/me/podcasts",
            get(user_list::handle::<S>).post(subscription::create::handle::<S>),
        )
        .route(
            "/users/me/podcasts/{podcast_id}",
            delete(subscription::delete::handle::<S>).put(subscription::update::handle::<S>),
        )
        .route("/podcast-tasks", post(task::create::handle::<S>))
}

impl From<entertainarr_domain::podcast::entity::Podcast> for PodcastDocument {
    fn from(value: entertainarr_domain::podcast::entity::Podcast) -> Self {
        Self {
            id: value.id,
            kind: Default::default(),
            attributes: PodcastAttributes {
                title: value.title,
                description: value.description,
                image_url: value.image_url,
                language: value.language,
                feed_url: value.feed_url,
                website: value.website,
                created_at: value.created_at,
                updated_at: value.updated_at,
            },
            relationships: PodcastRelationships {
                subscription: Relation {
                    data: Some(PodcastSubscriptionEntity {
                        id: Couple(value.id, 0),
                        kind: Default::default(),
                    }),
                    meta: None,
                },
                synchronization: Relation {
                    data: None,
                    meta: (),
                },
            },
        }
    }
}

impl From<entertainarr_domain::podcast::entity::Podcast> for PodcastAttributes {
    fn from(value: entertainarr_domain::podcast::entity::Podcast) -> Self {
        PodcastAttributes {
            title: value.title,
            description: value.description,
            image_url: value.image_url,
            language: value.language,
            feed_url: value.feed_url,
            website: value.website,
            created_at: value.created_at,
            updated_at: value.updated_at,
        }
    }
}

impl From<entertainarr_domain::podcast::entity::PodcastWithSubscription> for PodcastDocument {
    fn from(value: entertainarr_domain::podcast::entity::PodcastWithSubscription) -> Self {
        let entertainarr_domain::podcast::entity::PodcastWithSubscription {
            podcast,
            queue_size,
        } = value;
        Self {
            id: podcast.id,
            kind: Default::default(),
            attributes: PodcastAttributes {
                title: podcast.title,
                description: podcast.description,
                image_url: podcast.image_url,
                language: podcast.language,
                feed_url: podcast.feed_url,
                website: podcast.website,
                created_at: podcast.created_at,
                updated_at: podcast.updated_at,
            },
            relationships: PodcastRelationships {
                subscription: Relation {
                    data: Some(PodcastSubscriptionEntity {
                        id: Couple(podcast.id, 0),
                        kind: Default::default(),
                    }),
                    meta: Some(PodcastSubscriptionMeta { queue_size }),
                },
                synchronization: Relation {
                    data: None,
                    meta: (),
                },
            },
        }
    }
}

impl ApiResource<Vec<PodcastDocument>, PodcastRelation> {
    pub fn from_subscription_list(list: Vec<PodcastWithSubscription>) -> Self {
        let mut data = Vec::with_capacity(list.len());
        list.into_iter().for_each(|item| {
            data.push(PodcastDocument::from(item));
        });
        Self {
            data,
            includes: Vec::new(),
        }
    }
}