From c9c58b65a677c849a070abaeec1c7daccd4064ee Mon Sep 17 00:00:00 2001 From: Geometrically <18202329+Geometrically@users.noreply.github.com> Date: Sat, 31 Jul 2021 19:23:06 -0700 Subject: [PATCH] Optimize dependencies route and change return value (#230) --- src/routes/auth.rs | 2 +- src/routes/projects.rs | 66 ++++++++++++++---------------------------- src/routes/versions.rs | 8 +++-- 3 files changed, 27 insertions(+), 49 deletions(-) diff --git a/src/routes/auth.rs b/src/routes/auth.rs index d598f97e1..2479bfb38 100644 --- a/src/routes/auth.rs +++ b/src/routes/auth.rs @@ -228,7 +228,7 @@ pub async fn auth_callback( transaction.commit().await?; - let redirect_url = if result.url.contains("?") { + let redirect_url = if result.url.contains('?') { format!("{}&code={}", result.url, token.access_token) } else { format!("{}?code={}", result.url, token.access_token) diff --git a/src/routes/projects.rs b/src/routes/projects.rs index 9de15c568..bb8640e13 100644 --- a/src/routes/projects.rs +++ b/src/routes/projects.rs @@ -16,7 +16,6 @@ use actix_web::{delete, get, patch, post, web, HttpRequest, HttpResponse}; use futures::StreamExt; use serde::{Deserialize, Serialize}; use sqlx::PgPool; -use std::collections::HashMap; use std::sync::Arc; use validator::Validate; @@ -133,8 +132,8 @@ pub async fn project_get( #[derive(Serialize)] struct DependencyInfo { - pub project: Option, - pub version: Option, + pub projects: Vec, + pub versions: Vec, } #[get("dependencies")] @@ -177,50 +176,27 @@ pub async fn dependency_list( )>>() .await?; - let projects = database::Project::get_many_full( - dependencies.iter().map(|x| x.2).flatten().collect(), - &**pool, - ) - .await?; - let versions = database::Version::get_many_full( - dependencies.iter().map(|x| x.1).flatten().collect(), - &**pool, - ) - .await?; + let (projects_result, versions_result) = futures::join!( + database::Project::get_many_full( + dependencies.iter().map(|x| x.2).flatten().collect(), + &**pool, + ), + database::Version::get_many_full( + dependencies.iter().map(|x| x.1).flatten().collect(), + &**pool, + ) + ); - let mut response: HashMap> = - HashMap::new(); + let projects = projects_result? + .into_iter() + .map(convert_project) + .collect::>(); + let versions = versions_result? + .into_iter() + .map(super::versions::convert_version) + .collect::>(); - for dependency in dependencies { - let deps = response.get_mut(&dependency.0.into()); - - let info = DependencyInfo { - project: if let Some(id) = dependency.2 { - projects - .iter() - .find(|x| x.inner.id == id) - .map(|x| convert_project(x.clone())) - } else { - None - }, - version: if let Some(id) = dependency.1 { - versions - .iter() - .find(|x| x.id == id) - .map(|x| super::versions::convert_version(x.clone())) - } else { - None - }, - }; - - if let Some(deps) = deps { - deps.push(info); - } else { - response.insert(dependency.0.into(), vec![info]); - } - } - - Ok(HttpResponse::Ok().json(response)) + Ok(HttpResponse::Ok().json(DependencyInfo { projects, versions })) } else { Ok(HttpResponse::NotFound().body("")) } diff --git a/src/routes/versions.rs b/src/routes/versions.rs index 63e59c22b..4f0126cfa 100644 --- a/src/routes/versions.rs +++ b/src/routes/versions.rs @@ -62,10 +62,12 @@ pub async fn version_list( // Attempt to populate versions with "auto featured" versions if response.is_empty() && !versions.is_empty() && filters.featured.unwrap_or(false) { - let loaders = database::models::categories::Loader::list(&**pool).await?; - let game_versions = + let (loaders, game_versions) = futures::join!( + database::models::categories::Loader::list(&**pool), database::models::categories::GameVersion::list_filter(None, Some(true), &**pool) - .await?; + ); + + let (loaders, game_versions) = (loaders?, game_versions?); let mut joined_filters = Vec::new(); for game_version in &game_versions {