aboutsummaryrefslogtreecommitdiff
path: root/src/domain/event.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/domain/event.rs')
-rw-r--r--src/domain/event.rs116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/domain/event.rs b/src/domain/event.rs
new file mode 100644
index 0000000..93216a4
--- /dev/null
+++ b/src/domain/event.rs
@@ -0,0 +1,116 @@
+use chrono::{DateTime, Utc};
+use getset::Getters;
+
+use crate::domain::value_objects::{CalendarId, EventColor, EventId, TimeRange};
+
+#[derive(Debug, Clone, Getters)]
+pub struct Event {
+ #[getset(get = "pub")]
+ id: EventId,
+ #[getset(get = "pub")]
+ calendar_id: CalendarId,
+ #[getset(get = "pub")]
+ title: String,
+ #[getset(get = "pub")]
+ description: Option<String>,
+ #[getset(get = "pub")]
+ time_range: TimeRange,
+ #[getset(get = "pub")]
+ color: EventColor,
+ #[getset(get = "pub")]
+ is_all_day: bool,
+ #[getset(get = "pub")]
+ is_cancelled: bool,
+ #[getset(get = "pub")]
+ created_at: DateTime<Utc>,
+ #[getset(get = "pub")]
+ updated_at: DateTime<Utc>,
+}
+
+impl Event {
+ pub fn new(
+ calendar_id: CalendarId,
+ title: String,
+ description: Option<String>,
+ time_range: TimeRange,
+ color: EventColor,
+ is_all_day: bool,
+ ) -> Self {
+ let now = Utc::now();
+ Self {
+ id: EventId::new(),
+ calendar_id,
+ title,
+ description,
+ time_range,
+ color,
+ is_all_day,
+ is_cancelled: false,
+ created_at: now,
+ updated_at: now,
+ }
+ }
+
+ pub fn with_id(
+ id: EventId,
+ calendar_id: CalendarId,
+ title: String,
+ description: Option<String>,
+ time_range: TimeRange,
+ color: EventColor,
+ is_all_day: bool,
+ is_cancelled: bool,
+ created_at: DateTime<Utc>,
+ updated_at: DateTime<Utc>,
+ ) -> Self {
+ Self {
+ id,
+ calendar_id,
+ title,
+ description,
+ time_range,
+ color,
+ is_all_day,
+ is_cancelled,
+ created_at,
+ updated_at,
+ }
+ }
+
+ pub fn cancel(&mut self) {
+ self.is_cancelled = true;
+ self.updated_at = Utc::now();
+ }
+
+ pub fn restore(&mut self) {
+ self.is_cancelled = false;
+ self.updated_at = Utc::now();
+ }
+
+ pub fn update_title(&mut self, title: String) {
+ self.title = title;
+ self.updated_at = Utc::now();
+ }
+
+ pub fn update_description(&mut self, description: Option<String>) {
+ self.description = description;
+ self.updated_at = Utc::now();
+ }
+
+ pub fn update_time_range(&mut self, time_range: TimeRange) {
+ self.time_range = time_range;
+ self.updated_at = Utc::now();
+ }
+
+ pub fn update_color(&mut self, color: EventColor) {
+ self.color = color;
+ self.updated_at = Utc::now();
+ }
+
+ pub fn overlaps_with(&self, other: &Event) -> bool {
+ !self.is_cancelled
+ && !other.is_cancelled
+ && self.calendar_id == other.calendar_id
+ && self.time_range.overlaps(other.time_range())
+ }
+}