From 375f992a0c3aa38d24b13cef19f0742c80b9f532 Mon Sep 17 00:00:00 2001 From: Wyatt Verchere Date: Mon, 13 Nov 2023 18:19:06 -0800 Subject: [PATCH] Adds ordering on loader fields enum (#755) * now sorts on ordering, fmt clippy prepare * fixed tests * removed accidenetal printlns --- ...1b4c68d08607f7a0142b662b53eb05b4723a.json} | 4 +-- ...f1c352857cf2eb15874cee9d31f8d992ab77.json} | 4 +-- src/database/models/loader_fields.rs | 6 ++-- src/models/v2/projects.rs | 4 +-- src/routes/maven.rs | 6 ++-- src/util/img.rs | 2 +- src/util/validate.rs | 2 +- tests/common/dummy_data.rs | 2 +- tests/files/dummy_data.sql | 26 ++++++++++------- tests/tags.rs | 28 +++++++++++++++---- tests/teams.rs | 4 +-- 11 files changed, 56 insertions(+), 32 deletions(-) rename .sqlx/{query-0b52dc08a903a9c82234f6e1a2c59fdb631955011988910f033dd740b6a3b79b.json => query-1243d13d622a9970240c8f26b5031b4c68d08607f7a0142b662b53eb05b4723a.json} (81%) rename .sqlx/{query-458630d00e46183c65f95729d2647d3635f629cfb892fc8ac1964d8ecc269576.json => query-603eaa54b3956d68f656008e9b04f1c352857cf2eb15874cee9d31f8d992ab77.json} (84%) diff --git a/.sqlx/query-0b52dc08a903a9c82234f6e1a2c59fdb631955011988910f033dd740b6a3b79b.json b/.sqlx/query-1243d13d622a9970240c8f26b5031b4c68d08607f7a0142b662b53eb05b4723a.json similarity index 81% rename from .sqlx/query-0b52dc08a903a9c82234f6e1a2c59fdb631955011988910f033dd740b6a3b79b.json rename to .sqlx/query-1243d13d622a9970240c8f26b5031b4c68d08607f7a0142b662b53eb05b4723a.json index 56a912c33..0d9a9e0e1 100644 --- a/.sqlx/query-0b52dc08a903a9c82234f6e1a2c59fdb631955011988910f033dd740b6a3b79b.json +++ b/.sqlx/query-1243d13d622a9970240c8f26b5031b4c68d08607f7a0142b662b53eb05b4723a.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT lfe.id, lfe.enum_name, lfe.ordering, lfe.hidable \n FROM loader_field_enums lfe\n WHERE lfe.enum_name = $1\n ", + "query": "\n SELECT lfe.id, lfe.enum_name, lfe.ordering, lfe.hidable \n FROM loader_field_enums lfe\n WHERE lfe.enum_name = $1\n ORDER BY lfe.ordering ASC\n ", "describe": { "columns": [ { @@ -36,5 +36,5 @@ false ] }, - "hash": "0b52dc08a903a9c82234f6e1a2c59fdb631955011988910f033dd740b6a3b79b" + "hash": "1243d13d622a9970240c8f26b5031b4c68d08607f7a0142b662b53eb05b4723a" } diff --git a/.sqlx/query-458630d00e46183c65f95729d2647d3635f629cfb892fc8ac1964d8ecc269576.json b/.sqlx/query-603eaa54b3956d68f656008e9b04f1c352857cf2eb15874cee9d31f8d992ab77.json similarity index 84% rename from .sqlx/query-458630d00e46183c65f95729d2647d3635f629cfb892fc8ac1964d8ecc269576.json rename to .sqlx/query-603eaa54b3956d68f656008e9b04f1c352857cf2eb15874cee9d31f8d992ab77.json index 3b9f7c915..fbc6462ac 100644 --- a/.sqlx/query-458630d00e46183c65f95729d2647d3635f629cfb892fc8ac1964d8ecc269576.json +++ b/.sqlx/query-603eaa54b3956d68f656008e9b04f1c352857cf2eb15874cee9d31f8d992ab77.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id, enum_id, value, ordering, metadata, created FROM loader_field_enum_values\n WHERE enum_id = ANY($1)\n ", + "query": "\n SELECT id, enum_id, value, ordering, metadata, created FROM loader_field_enum_values\n WHERE enum_id = ANY($1)\n ORDER BY enum_id, ordering, created DESC\n ", "describe": { "columns": [ { @@ -48,5 +48,5 @@ false ] }, - "hash": "458630d00e46183c65f95729d2647d3635f629cfb892fc8ac1964d8ecc269576" + "hash": "603eaa54b3956d68f656008e9b04f1c352857cf2eb15874cee9d31f8d992ab77" } diff --git a/src/database/models/loader_fields.rs b/src/database/models/loader_fields.rs index 3dba4e038..55d70c078 100644 --- a/src/database/models/loader_fields.rs +++ b/src/database/models/loader_fields.rs @@ -341,6 +341,7 @@ impl LoaderFieldEnum { SELECT lfe.id, lfe.enum_name, lfe.ordering, lfe.hidable FROM loader_field_enums lfe WHERE lfe.enum_name = $1 + ORDER BY lfe.ordering ASC ", enum_name ) @@ -393,7 +394,7 @@ impl LoaderFieldEnumValue { let enum_ids = loader_fields .iter() - .filter_map(|x| get_enum_id(x)) + .filter_map(get_enum_id) .collect::>(); let values = Self::list_many(&enum_ids, exec, redis) .await? @@ -444,6 +445,7 @@ impl LoaderFieldEnumValue { " SELECT id, enum_id, value, ordering, metadata, created FROM loader_field_enum_values WHERE enum_id = ANY($1) + ORDER BY enum_id, ordering, created DESC ", &remaining_enums ) @@ -465,7 +467,7 @@ impl LoaderFieldEnumValue { let cachable_enum_sets: Vec<(LoaderFieldEnumId, Vec)> = result .clone() .into_iter() - .group_by(|x| x.enum_id) + .group_by(|x| x.enum_id) // we sort by enum_id, so this will group all values of the same enum_id together .into_iter() .map(|(k, v)| (k, v.collect::>().to_vec())) .collect(); diff --git a/src/models/v2/projects.rs b/src/models/v2/projects.rs index 7d2a0b85e..ba877b840 100644 --- a/src/models/v2/projects.rs +++ b/src/models/v2/projects.rs @@ -77,7 +77,7 @@ impl LegacyProject { // V2 versions only have one project type- v3 versions can rarely have multiple. // We'll just use the first one. - let mut project_type = data.project_types.get(0).cloned().unwrap_or_default(); + let mut project_type = data.project_types.first().cloned().unwrap_or_default(); let mut loaders = data.loaders; if let Some(versions_item) = versions_item { @@ -174,7 +174,7 @@ impl LegacyProject { { let version_ids: Vec<_> = data .iter() - .filter_map(|p| p.versions.get(0).map(|i| (*i).into())) + .filter_map(|p| p.versions.first().map(|i| (*i).into())) .collect(); let example_versions = version_item::Version::get_many(&version_ids, exec, redis).await?; let mut legacy_projects = Vec::new(); diff --git a/src/routes/maven.rs b/src/routes/maven.rs index 23d086374..6ef35c940 100644 --- a/src/routes/maven.rs +++ b/src/routes/maven.rs @@ -179,7 +179,7 @@ async fn find_version( // Try to parse version filters from version coords. let Some((vnumber, filter)) = vcoords.rsplit_once('-') else { - return Ok(exact_matches.get(0).map(|x| (*x).clone())); + return Ok(exact_matches.first().map(|x| (*x).clone())); }; let db_loaders: HashSet = Loader::list(pool, redis) @@ -221,8 +221,8 @@ async fn find_version( .collect::>(); Ok(matched - .get(0) - .or_else(|| exact_matches.get(0)) + .first() + .or_else(|| exact_matches.first()) .copied() .cloned()) } diff --git a/src/util/img.rs b/src/util/img.rs index 54fe36048..a184a5dec 100644 --- a/src/util/img.rs +++ b/src/util/img.rs @@ -13,7 +13,7 @@ pub fn get_color_from_img(data: &[u8]) -> Result, ImageError> { .crop_imm(128, 128, 64, 64); let color = color_thief::get_palette(image.to_rgb8().as_bytes(), ColorFormat::Rgb, 10, 2) .ok() - .and_then(|x| x.get(0).copied()) + .and_then(|x| x.first().copied()) .map(|x| (x.r as u32) << 16 | (x.g as u32) << 8 | (x.b as u32)); Ok(color) diff --git a/src/util/validate.rs b/src/util/validate.rs index 7ebac27c9..83b24ba12 100644 --- a/src/util/validate.rs +++ b/src/util/validate.rs @@ -34,7 +34,7 @@ pub fn validation_errors_to_string(errors: ValidationErrors, adder: Option { - if let Some(error) = errors.get(0) { + if let Some(error) = errors.first() { if let Some(adder) = adder { output.push_str(&format!( "Field {} {} failed validation with error: {}", diff --git a/tests/common/dummy_data.rs b/tests/common/dummy_data.rs index 619579a08..2fe9a4dfe 100644 --- a/tests/common/dummy_data.rs +++ b/tests/common/dummy_data.rs @@ -20,7 +20,7 @@ use super::{environment::TestEnvironment, request_data::get_public_project_creat use super::{asserts::assert_status, database::USER_USER_ID, get_json_val_str}; -pub const DUMMY_DATA_UPDATE: i64 = 3; +pub const DUMMY_DATA_UPDATE: i64 = 5; #[allow(dead_code)] pub const DUMMY_CATEGORIES: &[&str] = &[ diff --git a/tests/files/dummy_data.sql b/tests/files/dummy_data.sql index 1a26659e4..58197c684 100644 --- a/tests/files/dummy_data.sql +++ b/tests/files/dummy_data.sql @@ -34,16 +34,22 @@ INSERT INTO loaders_project_types_games (loader_id, project_type_id, game_id) SE -- Sample game versions, loaders, categories -- Game versions is '2' -INSERT INTO loader_field_enum_values(enum_id, value, metadata) -VALUES (2, '1.20.1', '{"type":"release","major":false}'); -INSERT INTO loader_field_enum_values(enum_id, value, metadata) -VALUES (2, '1.20.2', '{"type":"release","major":false}'); -INSERT INTO loader_field_enum_values(enum_id, value, metadata) -VALUES (2, '1.20.3', '{"type":"release","major":false}'); -INSERT INTO loader_field_enum_values(enum_id, value, metadata) -VALUES (2, '1.20.4', '{"type":"beta","major":false}'); -INSERT INTO loader_field_enum_values(enum_id, value, metadata) -VALUES (2, '1.20.5', '{"type":"release","major":true}'); +INSERT INTO loader_field_enum_values(enum_id, value, metadata, created) +VALUES (2, '1.20.1', '{"type":"release","major":false}', '2021-08-18 15:48:58.435729+00'); +INSERT INTO loader_field_enum_values(enum_id, value, metadata, created) +VALUES (2, '1.20.2', '{"type":"release","major":false}', '2021-08-18 15:48:59.435729+00'); +INSERT INTO loader_field_enum_values(enum_id, value, metadata, created) +VALUES (2, '1.20.3', '{"type":"release","major":false}', '2021-08-18 15:49:00.435729+00'); +INSERT INTO loader_field_enum_values(enum_id, value, metadata, created) +VALUES (2, '1.20.4', '{"type":"beta","major":false}', '2021-08-18 15:49:01.435729+00'); +INSERT INTO loader_field_enum_values(enum_id, value, metadata, created) +VALUES (2, '1.20.5', '{"type":"release","major":true}', '2061-08-18 15:49:02.435729+00'); + +-- Also add 'Ordering_Negative1' and 'Ordering_Positive100' to game versions (to test ordering override) +INSERT INTO loader_field_enum_values(enum_id, value, metadata, ordering) +VALUES (2, 'Ordering_Negative1', '{"type":"release","major":false}', -1); +INSERT INTO loader_field_enum_values(enum_id, value, metadata, ordering) +VALUES (2, 'Ordering_Positive100', '{"type":"release","major":false}', 100); INSERT INTO loader_fields_loaders(loader_id, loader_field_id) SELECT l.id, lf.id FROM loaders l CROSS JOIN loader_fields lf WHERE lf.field = 'game_versions' OR lf.field = 'client_side' OR lf.field = 'server_side'; diff --git a/tests/tags.rs b/tests/tags.rs index 5563b635c..5c9109ed3 100644 --- a/tests/tags.rs +++ b/tests/tags.rs @@ -1,3 +1,5 @@ +use itertools::Itertools; + use crate::common::environment::TestEnvironment; use std::collections::HashSet; @@ -13,17 +15,31 @@ async fn get_tags() { let side_types = api.get_side_types_deserialized().await; let categories = api.get_categories_deserialized().await; - // These tests match dummy data and will need to be updated if the dummy data changes; + // These tests match dummy data and will need to be updated if the dummy data changes + // Versions should be ordered by: + // - ordering + // - ordering ties settled by date added to database + // - We also expect presentation of NEWEST to OLDEST + // - All null orderings are treated as older than any non-null ordering + // (for this test, the 1.20.1, etc, versions are all null ordering) let game_version_versions = game_versions .into_iter() .map(|x| x.version) - .collect::>(); + .collect::>(); assert_eq!( game_version_versions, - ["1.20.1", "1.20.2", "1.20.3", "1.20.4", "1.20.5"] - .iter() - .map(|s| s.to_string()) - .collect() + [ + "Ordering_Negative1", + "Ordering_Positive100", + "1.20.5", + "1.20.4", + "1.20.3", + "1.20.2", + "1.20.1" + ] + .iter() + .map(|s| s.to_string()) + .collect_vec() ); let loader_names = loaders.into_iter().map(|x| x.name).collect::>(); diff --git a/tests/teams.rs b/tests/teams.rs index 9b00fbdc5..621b9eec8 100644 --- a/tests/teams.rs +++ b/tests/teams.rs @@ -266,7 +266,7 @@ async fn test_patch_project_team_member() { let req = test::TestRequest::post() .uri(&format!("/v2/team/{alpha_team_id}/members")) .append_header(("Authorization", USER_USER_PAT)) - .set_json(&json!({ + .set_json(json!({ "user_id": FRIEND_USER_ID, "permissions": (ProjectPermissions::EDIT_MEMBER | ProjectPermissions::EDIT_BODY).bits(), })) @@ -408,7 +408,7 @@ async fn test_patch_organization_team_member() { let req = test::TestRequest::post() .uri(&format!("/v2/team/{zeta_team_id}/members")) .append_header(("Authorization", USER_USER_PAT)) - .set_json(&json!({ + .set_json(json!({ "user_id": FRIEND_USER_ID, "organization_permissions": (OrganizationPermissions::EDIT_MEMBER | OrganizationPermissions::EDIT_MEMBER_DEFAULT_PERMISSIONS).bits(), })).to_request();