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