Optimize dependencies route and change return value (#230)

This commit is contained in:
Geometrically 2021-07-31 19:23:06 -07:00 committed by GitHub
parent 66becbc4cc
commit c9c58b65a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 49 deletions

View File

@ -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)

View File

@ -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<models::projects::Project>,
pub version: Option<models::projects::Version>,
pub projects: Vec<models::projects::Project>,
pub versions: Vec<models::projects::Version>,
}
#[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<models::projects::VersionId, Vec<DependencyInfo>> =
HashMap::new();
let projects = projects_result?
.into_iter()
.map(convert_project)
.collect::<Vec<models::projects::Project>>();
let versions = versions_result?
.into_iter()
.map(super::versions::convert_version)
.collect::<Vec<models::projects::Version>>();
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(""))
}

View File

@ -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 {