entertainarr-adapter-http 0.1.0

HTTP adapter for entertainarr
Documentation
use crate::entity::podcast_subscription::{
    PodcastSubscriptionDocument, PodcastSubscriptionEntity, PodcastSubscriptionMeta,
};
use crate::entity::task::{TaskDocument, TaskEntity, TaskKind};
use crate::entity::{Entity, Relation};

crate::create_kind!(PodcastKind, "podcasts");

pub type PodcastEntity = Entity<u64, PodcastKind>;

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[cfg_attr(feature = "facet", repr(C))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PodcastDocument {
    pub id: u64,
    #[serde(rename = "type")]
    pub kind: PodcastKind,
    pub attributes: PodcastAttributes,
    pub relationships: PodcastRelationships,
}

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[cfg_attr(feature = "facet", repr(C))]
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum PodcastInclude {
    #[default]
    Subscription,
    Synchronization,
}

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[cfg_attr(feature = "facet", repr(C))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PodcastAttributes {
    pub title: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub description: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub image_url: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub language: Option<String>,
    pub feed_url: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub website: Option<String>,
    pub created_at: chrono::DateTime<chrono::Utc>,
    pub updated_at: chrono::DateTime<chrono::Utc>,
}

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PodcastRelationships {
    pub subscription: Relation<PodcastSubscriptionEntity, Option<PodcastSubscriptionMeta>>,
    pub synchronization: Relation<TaskEntity>,
}

#[cfg_attr(feature = "facet", derive(facet::Facet))]
#[cfg_attr(feature = "facet", repr(C))]
#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase", untagged)]
pub enum PodcastRelation {
    PocastSubscription(PodcastSubscriptionDocument),
    Task(TaskDocument),
}

#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
pub struct PodcastTaskInputDocument {
    #[serde(rename = "type")]
    pub kind: TaskKind,
    pub attributes: PodcastTaskInputAttributes,
}

#[derive(Clone, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]
#[serde(tag = "method", rename_all = "camelCase")]
pub enum PodcastTaskInputAttributes {
    SynchronizeAll,
    Synchronize { podcast_id: u64 },
}