use crate::domain::entities::calendar::Calendar; use crate::domain::entities::calendar_event::CalendarEvent; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; /// DTO for calendar data transfer #[derive(Debug, Serialize, Deserialize, Clone)] pub struct CalendarDto { pub id: String, pub name: String, pub owner_id: String, pub description: Option, pub color: Option, pub is_public: bool, pub created_at: DateTime, pub updated_at: DateTime, pub custom_properties: HashMap, } impl Default for CalendarDto { fn default() -> Self { Self { id: String::new(), name: String::new(), owner_id: String::new(), description: None, color: None, is_public: false, created_at: Utc::now(), updated_at: Utc::now(), custom_properties: HashMap::new(), } } } impl From for CalendarDto { fn from(calendar: Calendar) -> Self { Self { id: calendar.id().to_string(), name: calendar.name().to_string(), owner_id: calendar.owner_id().to_string(), description: calendar.description().map(|s| s.to_string()), color: calendar.color().map(|s| s.to_string()), is_public: false, // This needs to be set separately as it's not part of the domain entity created_at: *calendar.created_at(), updated_at: *calendar.updated_at(), custom_properties: calendar.custom_properties().clone(), } } } /// DTO for calendar creation #[derive(Debug, Serialize, Deserialize)] pub struct CreateCalendarDto { pub name: String, pub description: Option, pub color: Option, pub is_public: Option, } /// DTO for calendar update #[derive(Debug, Serialize, Deserialize)] pub struct UpdateCalendarDto { pub name: Option, pub description: Option, pub color: Option, pub is_public: Option, } /// DTO for calendar sharing #[derive(Debug, Serialize, Deserialize)] pub struct CalendarShareDto { pub calendar_id: String, pub user_id: String, pub access_level: String, // 'read', 'write', 'owner' } /// DTO for calendar event data transfer #[derive(Debug, Serialize, Deserialize, Clone)] pub struct CalendarEventDto { pub id: String, pub calendar_id: String, pub summary: String, pub description: Option, pub location: Option, pub start_time: DateTime, pub end_time: DateTime, pub all_day: bool, pub rrule: Option, pub ical_uid: String, pub created_at: DateTime, pub updated_at: DateTime, } impl Default for CalendarEventDto { fn default() -> Self { Self { id: String::new(), calendar_id: String::new(), summary: String::new(), description: None, location: None, start_time: Utc::now(), end_time: Utc::now(), all_day: false, rrule: None, ical_uid: String::new(), created_at: Utc::now(), updated_at: Utc::now(), } } } impl From for CalendarEventDto { fn from(event: CalendarEvent) -> Self { Self { id: event.id().to_string(), calendar_id: event.calendar_id().to_string(), summary: event.summary().to_string(), description: event.description().map(|s| s.to_string()), location: event.location().map(|s| s.to_string()), start_time: *event.start_time(), end_time: *event.end_time(), all_day: event.all_day(), rrule: event.rrule().map(|s| s.to_string()), ical_uid: event.ical_uid().to_string(), created_at: *event.created_at(), updated_at: *event.updated_at(), } } } /// DTO for calendar event creation using iCalendar data #[derive(Debug, Serialize, Deserialize)] pub struct CreateEventICalDto { pub calendar_id: String, pub ical_data: String, } /// DTO for calendar event creation with structured data #[derive(Debug, Serialize, Deserialize)] pub struct CreateEventDto { pub calendar_id: String, pub summary: String, pub description: Option, pub location: Option, pub start_time: DateTime, pub end_time: DateTime, pub all_day: Option, pub rrule: Option, pub user_id: String, // Added for authorization } /// DTO for updating a calendar event #[derive(Debug, Serialize, Deserialize)] pub struct UpdateEventDto { pub summary: Option, pub description: Option, pub location: Option, pub start_time: Option>, pub end_time: Option>, pub all_day: Option, pub rrule: Option, pub user_id: String, // Added for authorization } /// DTO for querying events in a time range #[derive(Debug, Serialize, Deserialize)] pub struct EventQueryDto { pub calendar_id: String, pub start: DateTime, pub end: DateTime, } /// DTO for pagination #[derive(Debug, Serialize, Deserialize)] pub struct PaginationDto { pub limit: Option, pub offset: Option, }