64 lines
1.9 KiB
Rust
64 lines
1.9 KiB
Rust
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<Uuid>,
|
|
pub status: String,
|
|
pub metadata: Value,
|
|
pub discovered_at: DateTime<Utc>,
|
|
pub created_at: DateTime<Utc>,
|
|
pub updated_at: DateTime<Utc>,
|
|
pub deleted_at: Option<DateTime<Utc>>,
|
|
}
|
|
|
|
#[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<Uuid>,
|
|
#[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<String>,
|
|
pub canonical_url: Option<String>,
|
|
pub logo_asset_id: Option<Uuid>,
|
|
pub status: Option<String>,
|
|
pub metadata: Option<Value>,
|
|
}
|
|
|
|
impl PodcastChannel {
|
|
pub fn from_row(row: &Row) -> Result<Self, Error> {
|
|
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")?,
|
|
})
|
|
}
|
|
}
|