forked from
smokesignal.events/smokesignal
i18n+filtering fork - fluent-templates v2
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}