perf: parallelize independent async calls in detail pages
Use tokio::try_join! to run independent repo queries and image URL lookups concurrently in bag, brew, and checkin page handlers, and for gear option loading in the brew form data loader.
This commit is contained in:
parent
b8a26bbeca
commit
19e191e922
3 changed files with 41 additions and 22 deletions
|
|
@ -27,11 +27,20 @@ pub(crate) async fn bag_detail_page(
|
||||||
.await
|
.await
|
||||||
.map_err(|e| map_app_error(e.into()))?;
|
.map_err(|e| map_app_error(e.into()))?;
|
||||||
|
|
||||||
let roast = state
|
let (roast, image_url) = tokio::try_join!(
|
||||||
.roast_repo
|
async {
|
||||||
.get(bag.bag.roast_id)
|
state
|
||||||
.await
|
.roast_repo
|
||||||
.map_err(|e| map_app_error(e.into()))?;
|
.get(bag.bag.roast_id)
|
||||||
|
.await
|
||||||
|
.map_err(|e| map_app_error(e.into()))
|
||||||
|
},
|
||||||
|
async {
|
||||||
|
Ok::<_, StatusCode>(
|
||||||
|
resolve_image_url(&state, "roast", i64::from(bag.bag.roast_id)).await,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)?;
|
||||||
|
|
||||||
let roaster = state
|
let roaster = state
|
||||||
.roaster_repo
|
.roaster_repo
|
||||||
|
|
@ -39,8 +48,6 @@ pub(crate) async fn bag_detail_page(
|
||||||
.await
|
.await
|
||||||
.map_err(|e| map_app_error(e.into()))?;
|
.map_err(|e| map_app_error(e.into()))?;
|
||||||
|
|
||||||
let image_url = resolve_image_url(&state, "roast", i64::from(roast.id)).await;
|
|
||||||
|
|
||||||
let view = BagDetailView::from_parts(bag, &roast, &roaster);
|
let view = BagDetailView::from_parts(bag, &roast, &roaster);
|
||||||
|
|
||||||
let template = BagDetailTemplate {
|
let template = BagDetailTemplate {
|
||||||
|
|
|
||||||
|
|
@ -27,17 +27,29 @@ pub(crate) async fn brew_detail_page(
|
||||||
.await
|
.await
|
||||||
.map_err(|e| map_app_error(e.into()))?;
|
.map_err(|e| map_app_error(e.into()))?;
|
||||||
|
|
||||||
let bag = state
|
let (bag, brew_image_url) = tokio::try_join!(
|
||||||
.bag_repo
|
async {
|
||||||
.get(brew_details.brew.bag_id)
|
state
|
||||||
.await
|
.bag_repo
|
||||||
.map_err(|e| map_app_error(e.into()))?;
|
.get(brew_details.brew.bag_id)
|
||||||
|
.await
|
||||||
|
.map_err(|e| map_app_error(e.into()))
|
||||||
|
},
|
||||||
|
async { Ok::<_, StatusCode>(resolve_image_url(&state, "brew", i64::from(id)).await) },
|
||||||
|
)?;
|
||||||
|
|
||||||
let roast = state
|
let (roast, roast_image_url) = tokio::try_join!(
|
||||||
.roast_repo
|
async {
|
||||||
.get(bag.roast_id)
|
state
|
||||||
.await
|
.roast_repo
|
||||||
.map_err(|e| map_app_error(e.into()))?;
|
.get(bag.roast_id)
|
||||||
|
.await
|
||||||
|
.map_err(|e| map_app_error(e.into()))
|
||||||
|
},
|
||||||
|
async {
|
||||||
|
Ok::<_, StatusCode>(resolve_image_url(&state, "roast", i64::from(bag.roast_id)).await)
|
||||||
|
},
|
||||||
|
)?;
|
||||||
|
|
||||||
let roaster = state
|
let roaster = state
|
||||||
.roaster_repo
|
.roaster_repo
|
||||||
|
|
@ -45,9 +57,7 @@ pub(crate) async fn brew_detail_page(
|
||||||
.await
|
.await
|
||||||
.map_err(|e| map_app_error(e.into()))?;
|
.map_err(|e| map_app_error(e.into()))?;
|
||||||
|
|
||||||
let image_url = resolve_image_url(&state, "brew", i64::from(id))
|
let image_url = brew_image_url.or(roast_image_url);
|
||||||
.await
|
|
||||||
.or(resolve_image_url(&state, "roast", i64::from(roast.id)).await);
|
|
||||||
|
|
||||||
let view = BrewDetailView::from_parts(brew_details, &roast, &roaster);
|
let view = BrewDetailView::from_parts(brew_details, &roast, &roaster);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,10 @@ pub(crate) async fn checkin_page(
|
||||||
return Ok(Redirect::to("/login").into_response());
|
return Ok(Redirect::to("/login").into_response());
|
||||||
}
|
}
|
||||||
|
|
||||||
let roast_options = load_roast_options(&state).await.map_err(map_app_error)?;
|
let (roast_options, cafe_options) = tokio::try_join!(
|
||||||
let cafe_options = load_cafe_options(&state).await.map_err(map_app_error)?;
|
async { load_roast_options(&state).await.map_err(map_app_error) },
|
||||||
|
async { load_cafe_options(&state).await.map_err(map_app_error) },
|
||||||
|
)?;
|
||||||
|
|
||||||
let template = CheckInTemplate {
|
let template = CheckInTemplate {
|
||||||
nav_active: "checkin",
|
nav_active: "checkin",
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue