From 80849f2bf53a801e8c9f50e742b41cf3ac61640d Mon Sep 17 00:00:00 2001 From: Jon Seager Date: Tue, 3 Feb 2026 08:56:29 +0000 Subject: [PATCH] refactor(brews): extract brew timeline event builder into helper Move timeline event construction out of create_brew to keep the handler under clippy's too_many_lines limit. --- src/application/routes/brews.rs | 72 ++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/src/application/routes/brews.rs b/src/application/routes/brews.rs index 221386e..cc20149 100644 --- a/src/application/routes/brews.rs +++ b/src/application/routes/brews.rs @@ -202,6 +202,43 @@ pub(crate) async fn create_brew( .map_err(AppError::from)?; // Add timeline event + let _ = state + .timeline_repo + .insert(brew_timeline_event(&enriched)) + .await; + + if is_datastar_request(&headers) { + // Check if request came from timeline - return a script that redirects + let from_timeline = headers + .get("referer") + .and_then(|v| v.to_str().ok()) + .is_some_and(|r| r.contains("/timeline")); + + if from_timeline { + use axum::http::header::HeaderValue; + let mut response = + axum::response::Html("").into_response(); + response + .headers_mut() + .insert("datastar-selector", HeaderValue::from_static("body")); + response + .headers_mut() + .insert("datastar-mode", HeaderValue::from_static("append")); + Ok(response) + } else { + render_brew_list_fragment(state, request, true) + .await + .map_err(ApiError::from) + } + } else if matches!(source, PayloadSource::Form) { + let target = ListNavigator::new(BREW_PAGE_PATH, BREW_FRAGMENT_PATH, request).page_href(1); + Ok(Redirect::to(&target).into_response()) + } else { + Ok((StatusCode::CREATED, Json(enriched)).into_response()) + } +} + +fn brew_timeline_event(enriched: &BrewWithDetails) -> NewTimelineEvent { let ratio = if enriched.brew.coffee_weight > 0.0 { format!( "1:{:.1}", @@ -211,9 +248,9 @@ pub(crate) async fn create_brew( "N/A".to_string() }; - let event = NewTimelineEvent { + NewTimelineEvent { entity_type: "brew".to_string(), - entity_id: brew.id.into_inner(), + entity_id: enriched.brew.id.into_inner(), action: "brewed".to_string(), occurred_at: chrono::Utc::now(), title: enriched.roast_name.clone(), @@ -261,37 +298,6 @@ pub(crate) async fn create_brew( water_volume: enriched.brew.water_volume, water_temp: enriched.brew.water_temp, }), - }; - let _ = state.timeline_repo.insert(event).await; - - if is_datastar_request(&headers) { - // Check if request came from timeline - return a script that redirects - let from_timeline = headers - .get("referer") - .and_then(|v| v.to_str().ok()) - .is_some_and(|r| r.contains("/timeline")); - - if from_timeline { - use axum::http::header::HeaderValue; - let mut response = - axum::response::Html("").into_response(); - response - .headers_mut() - .insert("datastar-selector", HeaderValue::from_static("body")); - response - .headers_mut() - .insert("datastar-mode", HeaderValue::from_static("append")); - Ok(response) - } else { - render_brew_list_fragment(state, request, true) - .await - .map_err(ApiError::from) - } - } else if matches!(source, PayloadSource::Form) { - let target = ListNavigator::new(BREW_PAGE_PATH, BREW_FRAGMENT_PATH, request).page_href(1); - Ok(Redirect::to(&target).into_response()) - } else { - Ok((StatusCode::CREATED, Json(enriched)).into_response()) } }