use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use serde_json::Value; use tokio_postgres::{Error, Row}; use uuid::Uuid; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct PodcastChannel { pub id: Uuid, pub youtube_channel_id: String, pub name: String, pub canonical_url: String, pub logo_asset_id: Option, pub status: String, pub metadata: Value, pub discovered_at: DateTime, pub created_at: DateTime, pub updated_at: DateTime, pub deleted_at: Option>, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct NewPodcastChannel { pub youtube_channel_id: String, pub name: String, pub canonical_url: String, pub logo_asset_id: Option, #[serde(default = "default_candidate_status")] pub status: String, #[serde(default)] pub metadata: Value, } fn default_candidate_status() -> String { "candidate".to_owned() } #[derive(Debug, Clone, Default, Serialize, Deserialize)] pub struct PodcastChannelPatch { pub name: Option, pub canonical_url: Option, pub logo_asset_id: Option, pub status: Option, pub metadata: Option, } impl PodcastChannel { pub fn from_row(row: &Row) -> Result { Ok(Self { id: row.try_get("id")?, youtube_channel_id: row.try_get("youtube_channel_id")?, name: row.try_get("name")?, canonical_url: row.try_get("canonical_url")?, logo_asset_id: row.try_get("logo_asset_id")?, status: row.try_get("status")?, metadata: row.try_get("metadata")?, discovered_at: row.try_get("discovered_at")?, created_at: row.try_get("created_at")?, updated_at: row.try_get("updated_at")?, deleted_at: row.try_get("deleted_at")?, }) } }