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 visibility: Visibility, pub content_warning: Option, pub sensitive: bool, pub local: bool, pub created_at: DateTime, pub updated_at: Option>, pub note_extensions: Option, pub mood: 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) -> Result { match s { "public" => Ok(Self::Public), "followers" => Ok(Self::Followers), "unlisted" => Ok(Self::Unlisted), "direct" => Ok(Self::Direct), other => Err(crate::errors::DomainError::Internal(format!( "unknown visibility: '{other}'" ))), } } } pub struct NewThought { pub id: ThoughtId, pub user_id: UserId, pub content: Content, pub in_reply_to_id: Option, pub visibility: Visibility, pub content_warning: Option, pub sensitive: bool, pub mood: Option, } impl Thought { pub fn new_local(p: NewThought) -> Self { Self { id: p.id, user_id: p.user_id, content: p.content, in_reply_to_id: p.in_reply_to_id, visibility: p.visibility, content_warning: p.content_warning, sensitive: p.sensitive, local: true, created_at: Utc::now(), updated_at: None, note_extensions: None, mood: p.mood, } } }