aboutsummaryrefslogtreecommitdiff
path: root/src/domain/calendar.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/domain/calendar.rs76
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();
+ }
+}