Fix datetime parsing bug in event submission
- Fix timezone detection logic to only consider dashes after 'T' as timezone indicators - Reorder multipart datetime parsing to try flexible formats before strict RFC3339 - Resolves 400 "Invalid RFC3339 datetime" error for format like "2025-10-07T00:13" - Event submissions now work correctly with local church time format
This commit is contained in:
parent
4899c3829c
commit
c607aa135c
|
@ -67,7 +67,13 @@ pub fn parse_datetime_with_timezone(
|
||||||
) -> Result<DateTimeWithTimezone> {
|
) -> Result<DateTimeWithTimezone> {
|
||||||
let timezone = timezone.unwrap_or(DEFAULT_CHURCH_TIMEZONE);
|
let timezone = timezone.unwrap_or(DEFAULT_CHURCH_TIMEZONE);
|
||||||
|
|
||||||
if datetime_str.ends_with('Z') || datetime_str.contains('+') || datetime_str.contains('-') {
|
// Check if this looks like RFC3339 with timezone info (ends with Z, contains +, or has timezone offset after T)
|
||||||
|
let has_timezone = datetime_str.ends_with('Z') ||
|
||||||
|
datetime_str.contains('+') ||
|
||||||
|
(datetime_str.contains('T') &&
|
||||||
|
datetime_str.split('T').nth(1).map_or(false, |time_part| time_part.contains('-')));
|
||||||
|
|
||||||
|
if has_timezone {
|
||||||
let dt = DateTime::parse_from_rfc3339(datetime_str)
|
let dt = DateTime::parse_from_rfc3339(datetime_str)
|
||||||
.map_err(|_| ApiError::BadRequest("Invalid RFC3339 datetime".to_string()))?;
|
.map_err(|_| ApiError::BadRequest("Invalid RFC3339 datetime".to_string()))?;
|
||||||
DateTimeWithTimezone::new(dt.with_timezone(&Utc), timezone)
|
DateTimeWithTimezone::new(dt.with_timezone(&Utc), timezone)
|
||||||
|
|
|
@ -71,20 +71,20 @@ impl MultipartProcessor {
|
||||||
pub fn get_datetime(&self, field_name: &str) -> Result<DateTime<Utc>> {
|
pub fn get_datetime(&self, field_name: &str) -> Result<DateTime<Utc>> {
|
||||||
let datetime_str = self.get_required_string(field_name)?;
|
let datetime_str = self.get_required_string(field_name)?;
|
||||||
|
|
||||||
// First try the shared timezone-aware parsing function
|
// Try parsing as RFC3339 first (already has timezone info)
|
||||||
if let Ok(utc_time) = crate::utils::datetime::parse_event_datetime_to_utc(&datetime_str) {
|
if let Ok(dt) = DateTime::parse_from_rfc3339(&datetime_str) {
|
||||||
return Ok(utc_time);
|
return Ok(dt.to_utc());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fallback to legacy formats for backward compatibility
|
// Try flexible local formats for backward compatibility
|
||||||
// These will now be treated as EST/EDT times and converted to UTC
|
// These will be treated as EST/EDT times and converted to UTC
|
||||||
let formats = [
|
let formats = [
|
||||||
"%Y-%m-%dT%H:%M",
|
"%Y-%m-%dT%H:%M", // 2025-10-08T00:09
|
||||||
"%Y-%m-%dT%H:%M:%S",
|
"%Y-%m-%dT%H:%M:%S", // 2025-10-08T00:09:00
|
||||||
"%Y-%m-%d %H:%M",
|
"%Y-%m-%d %H:%M", // 2025-10-08 00:09
|
||||||
"%Y-%m-%d %H:%M:%S",
|
"%Y-%m-%d %H:%M:%S", // 2025-10-08 00:09:00
|
||||||
"%m/%d/%Y %H:%M",
|
"%m/%d/%Y %H:%M", // 10/08/2025 00:09
|
||||||
"%m/%d/%Y %I:%M %p",
|
"%m/%d/%Y %I:%M %p", // 10/08/2025 12:09 AM
|
||||||
];
|
];
|
||||||
|
|
||||||
for format in &formats {
|
for format in &formats {
|
||||||
|
@ -95,9 +95,9 @@ impl MultipartProcessor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Try parsing as RFC3339 (already has timezone info)
|
// Last resort: try the shared timezone-aware parsing function
|
||||||
if let Ok(dt) = DateTime::parse_from_rfc3339(&datetime_str) {
|
if let Ok(utc_time) = crate::utils::datetime::parse_event_datetime_to_utc(&datetime_str) {
|
||||||
return Ok(dt.to_utc());
|
return Ok(utc_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
Err(ApiError::ValidationError(format!(
|
Err(ApiError::ValidationError(format!(
|
||||||
|
|
Loading…
Reference in a new issue