update grid4 & heroledger models
This commit is contained in:
@@ -1,10 +1,25 @@
|
||||
use chrono::{Duration, Utc};
|
||||
use chrono::{Duration, Utc, NaiveDateTime};
|
||||
use heromodels::db::{Collection, Db};
|
||||
use heromodels::models::User;
|
||||
use heromodels::models::calendar::{AttendanceStatus, Attendee, Calendar, Event, EventStatus};
|
||||
use heromodels_core::Model;
|
||||
|
||||
fn main() {
|
||||
// Helper to format i64 timestamps
|
||||
let fmt_time = |ts: i64| -> String {
|
||||
let ndt = NaiveDateTime::from_timestamp_opt(ts, 0)
|
||||
.unwrap_or(NaiveDateTime::from_timestamp_opt(0, 0).unwrap());
|
||||
chrono::DateTime::<Utc>::from_utc(ndt, Utc)
|
||||
.format("%Y-%m-%d %H:%M")
|
||||
.to_string()
|
||||
};
|
||||
let fmt_date = |ts: i64| -> String {
|
||||
let ndt = NaiveDateTime::from_timestamp_opt(ts, 0)
|
||||
.unwrap_or(NaiveDateTime::from_timestamp_opt(0, 0).unwrap());
|
||||
chrono::DateTime::<Utc>::from_utc(ndt, Utc)
|
||||
.format("%Y-%m-%d")
|
||||
.to_string()
|
||||
};
|
||||
// Create a new DB instance, reset before every run
|
||||
let db_path = "/tmp/ourdb_calendar_example";
|
||||
let db = heromodels::db::hero::OurDB::new(db_path, true).expect("Can create DB");
|
||||
@@ -47,50 +62,21 @@ fn main() {
|
||||
println!("- User 2 (ID: {}): {}", user2_id, stored_user2.full_name);
|
||||
println!("- User 3 (ID: {}): {}", user3_id, stored_user3.full_name);
|
||||
|
||||
// --- Create Attendees ---
|
||||
// --- Create Attendees (embedded in events, not stored separately) ---
|
||||
println!("\n--- Creating Attendees ---");
|
||||
let attendee1 = Attendee::new(user1_id).status(AttendanceStatus::Accepted);
|
||||
let attendee2 = Attendee::new(user2_id).status(AttendanceStatus::Tentative);
|
||||
let attendee3 = Attendee::new(user3_id); // Default NoResponse
|
||||
|
||||
// Store attendees in database and get their IDs
|
||||
let attendee_collection = db
|
||||
.collection::<Attendee>()
|
||||
.expect("can open attendee collection");
|
||||
|
||||
let (attendee1_id, stored_attendee1) = attendee_collection
|
||||
.set(&attendee1)
|
||||
.expect("can set attendee1");
|
||||
let (attendee2_id, stored_attendee2) = attendee_collection
|
||||
.set(&attendee2)
|
||||
.expect("can set attendee2");
|
||||
let (attendee3_id, stored_attendee3) = attendee_collection
|
||||
.set(&attendee3)
|
||||
.expect("can set attendee3");
|
||||
|
||||
println!("Created attendees:");
|
||||
println!(
|
||||
"- Attendee 1 (ID: {}): Contact ID {}, Status: {:?}",
|
||||
attendee1_id, stored_attendee1.contact_id, stored_attendee1.status
|
||||
);
|
||||
println!(
|
||||
"- Attendee 2 (ID: {}): Contact ID {}, Status: {:?}",
|
||||
attendee2_id, stored_attendee2.contact_id, stored_attendee2.status
|
||||
);
|
||||
println!(
|
||||
"- Attendee 3 (ID: {}): Contact ID {}, Status: {:?}",
|
||||
attendee3_id, stored_attendee3.contact_id, stored_attendee3.status
|
||||
);
|
||||
|
||||
// --- Create Events with Attendees ---
|
||||
println!("\n--- Creating Events with Enhanced Features ---");
|
||||
let now = Utc::now();
|
||||
let event1_start = (now + Duration::hours(1)).timestamp();
|
||||
let event1_end = (now + Duration::hours(2)).timestamp();
|
||||
|
||||
let event1 = Event::new(
|
||||
"Team Meeting",
|
||||
now + Duration::hours(1),
|
||||
now + Duration::hours(2),
|
||||
)
|
||||
let event1 = Event::new()
|
||||
.title("Team Meeting")
|
||||
.reschedule(event1_start, event1_end)
|
||||
.description("Weekly sync-up meeting to discuss project progress.")
|
||||
.location("Conference Room A")
|
||||
.color("#FF5722") // Red-orange color
|
||||
@@ -99,14 +85,14 @@ fn main() {
|
||||
.category("Work")
|
||||
.reminder_minutes(15)
|
||||
.timezone("UTC")
|
||||
.add_attendee(attendee1_id)
|
||||
.add_attendee(attendee2_id);
|
||||
.add_attendee(attendee1.clone())
|
||||
.add_attendee(attendee2.clone());
|
||||
|
||||
let event2 = Event::new(
|
||||
"Project Brainstorm",
|
||||
now + Duration::days(1),
|
||||
now + Duration::days(1) + Duration::minutes(90),
|
||||
)
|
||||
let event2_start = (now + Duration::days(1)).timestamp();
|
||||
let event2_end = (now + Duration::days(1) + Duration::minutes(90)).timestamp();
|
||||
let event2 = Event::new()
|
||||
.title("Project Brainstorm")
|
||||
.reschedule(event2_start, event2_end)
|
||||
.description("Brainstorming session for new project features.")
|
||||
.location("Innovation Lab")
|
||||
.color("#4CAF50") // Green color
|
||||
@@ -115,28 +101,28 @@ fn main() {
|
||||
.category("Planning")
|
||||
.reminder_minutes(30)
|
||||
.is_recurring(true)
|
||||
.add_attendee(attendee1_id)
|
||||
.add_attendee(attendee3_id);
|
||||
.add_attendee(attendee1.clone())
|
||||
.add_attendee(attendee3.clone());
|
||||
|
||||
let event3 = Event::new(
|
||||
"Client Call",
|
||||
now + Duration::days(2),
|
||||
now + Duration::days(2) + Duration::hours(1),
|
||||
)
|
||||
let event3_start = (now + Duration::days(2)).timestamp();
|
||||
let event3_end = (now + Duration::days(2) + Duration::hours(1)).timestamp();
|
||||
let event3 = Event::new()
|
||||
.title("Client Call")
|
||||
.reschedule(event3_start, event3_end)
|
||||
.description("Quarterly review with key client.")
|
||||
.color("#9C27B0") // Purple color
|
||||
.created_by(user3_id)
|
||||
.status(EventStatus::Published)
|
||||
.category("Client")
|
||||
.reminder_minutes(60)
|
||||
.add_attendee(attendee2_id);
|
||||
.add_attendee(attendee2.clone());
|
||||
|
||||
// Create an all-day event
|
||||
let event4 = Event::new(
|
||||
"Company Holiday",
|
||||
now + Duration::days(7),
|
||||
now + Duration::days(7) + Duration::hours(24),
|
||||
)
|
||||
let event4_start = (now + Duration::days(7)).timestamp();
|
||||
let event4_end = (now + Duration::days(7) + Duration::hours(24)).timestamp();
|
||||
let event4 = Event::new()
|
||||
.title("Company Holiday")
|
||||
.reschedule(event4_start, event4_end)
|
||||
.description("National holiday - office closed.")
|
||||
.color("#FFC107") // Amber color
|
||||
.all_day(true)
|
||||
@@ -148,7 +134,7 @@ fn main() {
|
||||
println!(
|
||||
"- Event 1: '{}' at {} with {} attendees",
|
||||
event1.title,
|
||||
event1.start_time.format("%Y-%m-%d %H:%M"),
|
||||
fmt_time(event1.start_time),
|
||||
event1.attendees.len()
|
||||
);
|
||||
println!(
|
||||
@@ -174,12 +160,19 @@ fn main() {
|
||||
);
|
||||
println!(" All-day: {}", event1.all_day);
|
||||
println!(" Recurring: {}", event1.is_recurring);
|
||||
println!(" Attendee IDs: {:?}", event1.attendees);
|
||||
println!(
|
||||
" Attendee IDs: {:?}",
|
||||
event1
|
||||
.attendees
|
||||
.iter()
|
||||
.map(|a| a.contact_id)
|
||||
.collect::<Vec<u32>>()
|
||||
);
|
||||
|
||||
println!(
|
||||
"- Event 2: '{}' at {} with {} attendees",
|
||||
event2.title,
|
||||
event2.start_time.format("%Y-%m-%d %H:%M"),
|
||||
fmt_time(event2.start_time),
|
||||
event2.attendees.len()
|
||||
);
|
||||
println!(
|
||||
@@ -205,12 +198,19 @@ fn main() {
|
||||
);
|
||||
println!(" All-day: {}", event2.all_day);
|
||||
println!(" Recurring: {}", event2.is_recurring);
|
||||
println!(" Attendee IDs: {:?}", event2.attendees);
|
||||
println!(
|
||||
" Attendee IDs: {:?}",
|
||||
event2
|
||||
.attendees
|
||||
.iter()
|
||||
.map(|a| a.contact_id)
|
||||
.collect::<Vec<u32>>()
|
||||
);
|
||||
|
||||
println!(
|
||||
"- Event 3: '{}' at {} with {} attendees",
|
||||
event3.title,
|
||||
event3.start_time.format("%Y-%m-%d %H:%M"),
|
||||
fmt_time(event3.start_time),
|
||||
event3.attendees.len()
|
||||
);
|
||||
println!(
|
||||
@@ -236,12 +236,19 @@ fn main() {
|
||||
);
|
||||
println!(" All-day: {}", event3.all_day);
|
||||
println!(" Recurring: {}", event3.is_recurring);
|
||||
println!(" Attendee IDs: {:?}", event3.attendees);
|
||||
println!(
|
||||
" Attendee IDs: {:?}",
|
||||
event3
|
||||
.attendees
|
||||
.iter()
|
||||
.map(|a| a.contact_id)
|
||||
.collect::<Vec<u32>>()
|
||||
);
|
||||
|
||||
println!(
|
||||
"- Event 4: '{}' at {} (All-day: {})",
|
||||
event4.title,
|
||||
event4.start_time.format("%Y-%m-%d"),
|
||||
fmt_date(event4.start_time),
|
||||
event4.all_day
|
||||
);
|
||||
println!(
|
||||
@@ -262,25 +269,37 @@ fn main() {
|
||||
let new_start = now + Duration::hours(2);
|
||||
let new_end = now + Duration::hours(3);
|
||||
let mut updated_event1 = event1.clone();
|
||||
updated_event1 = updated_event1.reschedule(new_start, new_end);
|
||||
updated_event1 = updated_event1.reschedule(new_start.timestamp(), new_end.timestamp());
|
||||
println!(
|
||||
"Rescheduled '{}' to {}",
|
||||
updated_event1.title,
|
||||
new_start.format("%Y-%m-%d %H:%M")
|
||||
fmt_time(new_start.timestamp())
|
||||
);
|
||||
|
||||
// Remove an attendee
|
||||
updated_event1 = updated_event1.remove_attendee(attendee1_id);
|
||||
updated_event1 = updated_event1.remove_attendee(user1_id);
|
||||
println!(
|
||||
"Removed attendee {} from '{}'. Remaining attendee IDs: {:?}",
|
||||
attendee1_id, updated_event1.title, updated_event1.attendees
|
||||
user1_id,
|
||||
updated_event1.title,
|
||||
updated_event1
|
||||
.attendees
|
||||
.iter()
|
||||
.map(|a| a.contact_id)
|
||||
.collect::<Vec<u32>>()
|
||||
);
|
||||
|
||||
// Add a new attendee
|
||||
updated_event1 = updated_event1.add_attendee(attendee3_id);
|
||||
updated_event1 = updated_event1.add_attendee(attendee3.clone());
|
||||
println!(
|
||||
"Added attendee {} to '{}'. Current attendee IDs: {:?}",
|
||||
attendee3_id, updated_event1.title, updated_event1.attendees
|
||||
user3_id,
|
||||
updated_event1.title,
|
||||
updated_event1
|
||||
.attendees
|
||||
.iter()
|
||||
.map(|a| a.contact_id)
|
||||
.collect::<Vec<u32>>()
|
||||
);
|
||||
|
||||
// --- Demonstrate Event Status Changes ---
|
||||
@@ -300,11 +319,11 @@ fn main() {
|
||||
println!("Cancelled event: '{}'", cancelled_event.title);
|
||||
|
||||
// Update event with new features
|
||||
let enhanced_event = Event::new(
|
||||
"Enhanced Meeting",
|
||||
now + Duration::days(5),
|
||||
now + Duration::days(5) + Duration::hours(2),
|
||||
)
|
||||
let enhanced_start = (now + Duration::days(5)).timestamp();
|
||||
let enhanced_end = (now + Duration::days(5) + Duration::hours(2)).timestamp();
|
||||
let enhanced_event = Event::new()
|
||||
.title("Enhanced Meeting")
|
||||
.reschedule(enhanced_start, enhanced_end)
|
||||
.description("Meeting with all new features demonstrated.")
|
||||
.location("Virtual - Zoom")
|
||||
.color("#673AB7") // Deep purple
|
||||
@@ -314,9 +333,9 @@ fn main() {
|
||||
.reminder_minutes(45)
|
||||
.timezone("America/New_York")
|
||||
.is_recurring(true)
|
||||
.add_attendee(attendee1_id)
|
||||
.add_attendee(attendee2_id)
|
||||
.add_attendee(attendee3_id);
|
||||
.add_attendee(attendee1)
|
||||
.add_attendee(attendee2)
|
||||
.add_attendee(attendee3);
|
||||
|
||||
println!("Created enhanced event with all features:");
|
||||
println!(" Title: {}", enhanced_event.title);
|
||||
@@ -485,13 +504,13 @@ fn main() {
|
||||
println!("\n--- Modifying Calendar ---");
|
||||
|
||||
// Create and store a new event
|
||||
let new_event = Event::new(
|
||||
"1-on-1 Meeting",
|
||||
now + Duration::days(3),
|
||||
now + Duration::days(3) + Duration::minutes(30),
|
||||
)
|
||||
.description("One-on-one meeting with team member.")
|
||||
.location("Office");
|
||||
let ne_start = (now + Duration::days(3)).timestamp();
|
||||
let ne_end = (now + Duration::days(3) + Duration::minutes(30)).timestamp();
|
||||
let new_event = Event::new()
|
||||
.title("1-on-1 Meeting")
|
||||
.reschedule(ne_start, ne_end)
|
||||
.description("One-on-one meeting with team member.")
|
||||
.location("Office");
|
||||
|
||||
let (new_event_id, _stored_new_event) =
|
||||
event_collection.set(&new_event).expect("can set new event");
|
||||
@@ -565,7 +584,7 @@ fn main() {
|
||||
"- Event ID: {}, Title: '{}', Start: {}, Attendees: {}",
|
||||
event.get_id(),
|
||||
event.title,
|
||||
event.start_time.format("%Y-%m-%d %H:%M"),
|
||||
fmt_time(event.start_time),
|
||||
event.attendees.len()
|
||||
);
|
||||
}
|
||||
@@ -583,22 +602,16 @@ fn main() {
|
||||
retrieved_event1.attendees.len()
|
||||
);
|
||||
|
||||
// Look up attendee details for each attendee ID
|
||||
for &attendee_id in &retrieved_event1.attendees {
|
||||
if let Some(attendee) = attendee_collection
|
||||
.get_by_id(attendee_id)
|
||||
.expect("can try to get attendee")
|
||||
// Look up attendee details directly from embedded attendees
|
||||
for attendee in &retrieved_event1.attendees {
|
||||
if let Some(user) = user_collection
|
||||
.get_by_id(attendee.contact_id)
|
||||
.expect("can try to get user")
|
||||
{
|
||||
// Look up user details for the attendee's contact_id
|
||||
if let Some(user) = user_collection
|
||||
.get_by_id(attendee.contact_id)
|
||||
.expect("can try to get user")
|
||||
{
|
||||
println!(
|
||||
" - Attendee ID {}: {} (User: {}, Status: {:?})",
|
||||
attendee_id, user.full_name, attendee.contact_id, attendee.status
|
||||
);
|
||||
}
|
||||
println!(
|
||||
" - User {}: {} (Status: {:?})",
|
||||
attendee.contact_id, user.full_name, attendee.status
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user