diff options
Diffstat (limited to '')
| -rw-r--r-- | src/domain/calendar.rs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/domain/calendar.rs b/src/domain/calendar.rs new file mode 100644 index 0000000..21216b5 --- /dev/null +++ b/src/domain/calendar.rs @@ -0,0 +1,76 @@ +use chrono::{DateTime, Utc}; +use getset::Getters; + +use crate::domain::value_objects::CalendarId; + +#[derive(Debug, Clone, Getters)] +pub struct Calendar { + #[getset(get = "pub")] + id: CalendarId, + #[getset(get = "pub")] + name: String, + #[getset(get = "pub")] + description: Option<String>, + #[getset(get = "pub")] + is_archived: bool, + #[getset(get = "pub")] + created_at: DateTime<Utc>, + #[getset(get = "pub")] + updated_at: DateTime<Utc>, +} + +impl Calendar { + pub fn new(name: String, description: Option<String>) -> Self { + let now = Utc::now(); + Self { + id: CalendarId::new(), + name, + description, + is_archived: false, + created_at: now, + updated_at: now, + } + } + + pub fn with_id( + id: CalendarId, + name: String, + description: Option<String>, + is_archived: bool, + created_at: DateTime<Utc>, + updated_at: DateTime<Utc>, + ) -> Self { + Self { + id, + name, + description, + is_archived, + created_at, + updated_at, + } + } + + pub fn archive(&mut self) { + self.is_archived = true; + self.touch(); + } + + pub fn unarchive(&mut self) { + self.is_archived = false; + self.touch(); + } + + pub fn update_name(&mut self, name: String) { + self.name = name; + self.touch(); + } + + pub fn update_description(&mut self, description: Option<String>) { + self.description = description; + self.touch(); + } + + pub fn touch(&mut self) { + self.updated_at = Utc::now(); + } +} |