From c1cfda9df9e8403dbe92a4c08caace6948dd2990 Mon Sep 17 00:00:00 2001 From: Cameron Date: Wed, 24 Dec 2025 00:27:44 -0500 Subject: [PATCH] Fix memories week span sorting --- src/memories.rs | 58 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/src/memories.rs b/src/memories.rs index a65f9df..f9df485 100644 --- a/src/memories.rs +++ b/src/memories.rs @@ -1,7 +1,9 @@ use actix_web::web::Data; use actix_web::{HttpRequest, HttpResponse, Responder, get, web}; use chrono::LocalResult::{Ambiguous, Single}; -use chrono::{DateTime, Datelike, FixedOffset, Local, LocalResult, NaiveDate, TimeZone, Utc}; +use chrono::{ + DateTime, Datelike, FixedOffset, Local, LocalResult, NaiveDate, TimeZone, Timelike, Utc, +}; use log::{debug, trace, warn}; use opentelemetry::KeyValue; use opentelemetry::trace::{Span, Status, Tracer}; @@ -541,7 +543,59 @@ pub async fn list_memories( match span_mode { // Sort by absolute time for a more 'overview' MemoriesSpan::Month => memories_with_dates.sort_by(|a, b| a.1.cmp(&b.1)), - _ => { + // For week span, sort by day of month, then time of day, then year (oldest first) + MemoriesSpan::Week => { + memories_with_dates.sort_by(|a, b| { + // First, sort by day of month + let day_cmp = a.1.day().cmp(&b.1.day()); + if day_cmp != std::cmp::Ordering::Equal { + return day_cmp; + } + + // Then sort by time of day + match (a.0.created, b.0.created) { + (Some(a_time), Some(b_time)) => { + // Convert timestamps to DateTime + let a_dt_utc = DateTime::::from_timestamp(a_time, 0).unwrap(); + let b_dt_utc = DateTime::::from_timestamp(b_time, 0).unwrap(); + + // Extract time of day in the appropriate timezone + let a_time_of_day = if let Some(ref tz) = client_timezone { + let dt = a_dt_utc.with_timezone(tz); + (dt.hour(), dt.minute(), dt.second()) + } else { + let dt = a_dt_utc.with_timezone(&Local); + (dt.hour(), dt.minute(), dt.second()) + }; + + let b_time_of_day = if let Some(ref tz) = client_timezone { + let dt = b_dt_utc.with_timezone(tz); + (dt.hour(), dt.minute(), dt.second()) + } else { + let dt = b_dt_utc.with_timezone(&Local); + (dt.hour(), dt.minute(), dt.second()) + }; + + // Compare time of day + let time_cmp = a_time_of_day.cmp(&b_time_of_day); + if time_cmp != std::cmp::Ordering::Equal { + return time_cmp; + } + + // Finally, sort by year (oldest first) + a.1.year().cmp(&b.1.year()) + } + (Some(_), None) => std::cmp::Ordering::Less, + (None, Some(_)) => std::cmp::Ordering::Greater, + (None, None) => { + // If no timestamps, just sort by year (oldest first) + a.1.year().cmp(&b.1.year()) + } + } + }); + } + // For day span, sort by day of month then by time + MemoriesSpan::Day => { memories_with_dates.sort_by(|a, b| { let day_comparison = a.1.day().cmp(&b.1.day());