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