use crate::value_objects::{Content, ThoughtId, UserId}; use chrono::{DateTime, Utc}; #[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] pub enum Visibility { Public, Followers, Unlisted, Direct, } #[derive(Debug, Clone)] pub struct Thought { pub id: ThoughtId, pub user_id: UserId, pub content: Content, pub in_reply_to_id: Option, pub in_reply_to_url: Option, pub ap_id: Option, pub visibility: Visibility, pub content_warning: Option, pub sensitive: bool, pub local: bool, pub created_at: DateTime, pub updated_at: Option>, } impl Visibility { pub fn as_str(&self) -> &'static str { match self { Visibility::Public => "public", Visibility::Followers => "followers", Visibility::Unlisted => "unlisted", Visibility::Direct => "direct", } } pub fn from_db_str(s: &str) -> Self { match s { "followers" => Self::Followers, "unlisted" => Self::Unlisted, "direct" => Self::Direct, _ => Self::Public, } } } impl Thought { pub fn new_local( id: ThoughtId, user_id: UserId, content: Content, in_reply_to_id: Option, visibility: Visibility, content_warning: Option, sensitive: bool, ) -> Self { Self { id, user_id, content, in_reply_to_id, in_reply_to_url: None, ap_id: None, visibility, content_warning, sensitive, local: true, created_at: Utc::now(), updated_at: None, } } }