i18n+filtering fork - fluent-templates v2
at main 3.2 kB view raw
1use chrono::{Datelike, Utc, Duration, NaiveTime}; 2use sqlx::PgPool; 3use std::env; 4 5#[tokio::main] 6async fn main() -> Result<(), Box<dyn std::error::Error>> { 7 // Set up database connection 8 let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); 9 let pool = PgPool::connect(&database_url).await?; 10 11 // Calculate next week range (June 9-15, 2025) 12 let now = Utc::now(); 13 let days_since_monday = (now.weekday().num_days_from_monday()) as i64; 14 let days_until_next_monday = 7 - days_since_monday; 15 16 let start_of_next_week = now 17 .date_naive() 18 .checked_add_days(chrono::Days::new(days_until_next_monday as u64)) 19 .unwrap() 20 .and_time(NaiveTime::from_hms_opt(0, 0, 0).unwrap()) 21 .and_utc(); 22 23 let end_of_next_week = start_of_next_week + Duration::days(6) + Duration::hours(23) + Duration::minutes(59) + Duration::seconds(59); 24 25 println!("Next week range: {} to {}", start_of_next_week, end_of_next_week); 26 27 // Query for events with bibliovente in the name 28 let bibliovente_events = sqlx::query!( 29 "SELECT 30 record->>'name' as name, 31 (record->>'startsAt')::timestamptz as starts_at, 32 COALESCE((record->>'endsAt')::timestamptz, 33 DATE_TRUNC('day', (record->>'startsAt')::timestamptz) + INTERVAL '1 day' - INTERVAL '1 second') as ends_at 34 FROM events 35 WHERE record->>'name' ILIKE '%bibliovente%'" 36 ).fetch_all(&pool).await?; 37 38 println!("\nBibliovente events in database:"); 39 for event in &bibliovente_events { 40 println!("Name: {}", event.name.as_ref().unwrap_or(&"None".to_string())); 41 println!("Starts: {}", event.starts_at.unwrap()); 42 println!("Ends: {}", event.ends_at.unwrap()); 43 44 // Test overlap logic 45 let starts_at = event.starts_at.unwrap(); 46 let ends_at = event.ends_at.unwrap(); 47 48 let overlaps = ends_at >= start_of_next_week && starts_at <= end_of_next_week; 49 println!("Overlaps with next week: {}", overlaps); 50 println!("---"); 51 } 52 53 // Query with next-week filter 54 let filtered_events = sqlx::query!( 55 "SELECT 56 record->>'name' as name, 57 (record->>'startsAt')::timestamptz as starts_at, 58 COALESCE((record->>'endsAt')::timestamptz, 59 DATE_TRUNC('day', (record->>'startsAt')::timestamptz) + INTERVAL '1 day' - INTERVAL '1 second') as ends_at 60 FROM events 61 WHERE (COALESCE((record->>'endsAt')::timestamptz, 62 DATE_TRUNC('day', (record->>'startsAt')::timestamptz) + INTERVAL '1 day' - INTERVAL '1 second') >= $1 63 AND (record->>'startsAt')::timestamptz <= $2)", 64 start_of_next_week, 65 end_of_next_week 66 ).fetch_all(&pool).await?; 67 68 println!("\nEvents matching next-week filter:"); 69 for event in &filtered_events { 70 println!("Name: {}", event.name.as_ref().unwrap_or(&"None".to_string())); 71 println!("Starts: {}", event.starts_at.unwrap()); 72 println!("Ends: {}", event.ends_at.unwrap()); 73 println!("---"); 74 } 75 76 Ok(()) 77}