From cee942dcef9f44110d09bf3b3345ed4a6a633494 Mon Sep 17 00:00:00 2001 From: aecsocket Date: Sat, 16 May 2026 17:18:18 +0100 Subject: [PATCH] Fix file version updates not considering visibility (#6105) --- ...b367a5b03dd86543c7a859fd6b7f2dfef2967.json | 33 +++++++++++++++++++ ...bc18674c8f19334bdbeb48244a941f10a5e17.json | 31 ----------------- apps/labrinth/src/routes/v3/version_file.rs | 14 ++++++-- apps/labrinth/tests/version.rs | 12 +++++++ 4 files changed, 56 insertions(+), 34 deletions(-) create mode 100644 apps/labrinth/.sqlx/query-0f9aa21316eb3ef0ff92f0c74d5b367a5b03dd86543c7a859fd6b7f2dfef2967.json delete mode 100644 apps/labrinth/.sqlx/query-26210e28d63aa61e6bea453b720bc18674c8f19334bdbeb48244a941f10a5e17.json diff --git a/apps/labrinth/.sqlx/query-0f9aa21316eb3ef0ff92f0c74d5b367a5b03dd86543c7a859fd6b7f2dfef2967.json b/apps/labrinth/.sqlx/query-0f9aa21316eb3ef0ff92f0c74d5b367a5b03dd86543c7a859fd6b7f2dfef2967.json new file mode 100644 index 000000000..7e896a882 --- /dev/null +++ b/apps/labrinth/.sqlx/query-0f9aa21316eb3ef0ff92f0c74d5b367a5b03dd86543c7a859fd6b7f2dfef2967.json @@ -0,0 +1,33 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT v.id version_id, v.mod_id mod_id\n FROM mods m\n INNER JOIN versions v ON m.id = v.mod_id AND (cardinality($4::varchar[]) = 0 OR v.version_type = ANY($4)) AND v.status = ANY($5)\n INNER JOIN version_fields vf ON vf.field_id = 3 AND v.id = vf.version_id\n INNER JOIN loader_field_enum_values lfev ON vf.enum_value = lfev.id AND (cardinality($2::varchar[]) = 0 OR lfev.value = ANY($2::varchar[]))\n INNER JOIN loaders_versions lv ON lv.version_id = v.id\n INNER JOIN loaders l on lv.loader_id = l.id AND (cardinality($3::varchar[]) = 0 OR l.loader = ANY($3::varchar[]))\n WHERE m.id = ANY($1) AND m.status = ANY($6)\n ORDER BY v.date_published ASC\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "version_id", + "type_info": "Int8" + }, + { + "ordinal": 1, + "name": "mod_id", + "type_info": "Int8" + } + ], + "parameters": { + "Left": [ + "Int8Array", + "VarcharArray", + "VarcharArray", + "VarcharArray", + "TextArray", + "TextArray" + ] + }, + "nullable": [ + false, + false + ] + }, + "hash": "0f9aa21316eb3ef0ff92f0c74d5b367a5b03dd86543c7a859fd6b7f2dfef2967" +} diff --git a/apps/labrinth/.sqlx/query-26210e28d63aa61e6bea453b720bc18674c8f19334bdbeb48244a941f10a5e17.json b/apps/labrinth/.sqlx/query-26210e28d63aa61e6bea453b720bc18674c8f19334bdbeb48244a941f10a5e17.json deleted file mode 100644 index 8d135fcbf..000000000 --- a/apps/labrinth/.sqlx/query-26210e28d63aa61e6bea453b720bc18674c8f19334bdbeb48244a941f10a5e17.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT v.id version_id, v.mod_id mod_id\n FROM mods m\n INNER JOIN versions v ON m.id = v.mod_id AND (cardinality($4::varchar[]) = 0 OR v.version_type = ANY($4))\n INNER JOIN version_fields vf ON vf.field_id = 3 AND v.id = vf.version_id\n INNER JOIN loader_field_enum_values lfev ON vf.enum_value = lfev.id AND (cardinality($2::varchar[]) = 0 OR lfev.value = ANY($2::varchar[]))\n INNER JOIN loaders_versions lv ON lv.version_id = v.id\n INNER JOIN loaders l on lv.loader_id = l.id AND (cardinality($3::varchar[]) = 0 OR l.loader = ANY($3::varchar[]))\n WHERE m.id = ANY($1)\n ORDER BY v.date_published ASC\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "version_id", - "type_info": "Int8" - }, - { - "ordinal": 1, - "name": "mod_id", - "type_info": "Int8" - } - ], - "parameters": { - "Left": [ - "Int8Array", - "VarcharArray", - "VarcharArray", - "VarcharArray" - ] - }, - "nullable": [ - false, - false - ] - }, - "hash": "26210e28d63aa61e6bea453b720bc18674c8f19334bdbeb48244a941f10a5e17" -} diff --git a/apps/labrinth/src/routes/v3/version_file.rs b/apps/labrinth/src/routes/v3/version_file.rs index f0ce7b2a4..7723ffdeb 100644 --- a/apps/labrinth/src/routes/v3/version_file.rs +++ b/apps/labrinth/src/routes/v3/version_file.rs @@ -6,7 +6,7 @@ use crate::database::ReadOnlyPgPool; use crate::database::redis::RedisPool; use crate::models::ids::VersionId; use crate::models::pats::Scopes; -use crate::models::projects::VersionType; +use crate::models::projects::{ProjectStatus, VersionStatus, VersionType}; use crate::models::teams::ProjectPermissions; use crate::queue::session::AuthQueue; use crate::routes::internal::delphi; @@ -406,18 +406,26 @@ async fn update_files_internal( " SELECT v.id version_id, v.mod_id mod_id FROM mods m - INNER JOIN versions v ON m.id = v.mod_id AND (cardinality($4::varchar[]) = 0 OR v.version_type = ANY($4)) + INNER JOIN versions v ON m.id = v.mod_id AND (cardinality($4::varchar[]) = 0 OR v.version_type = ANY($4)) AND v.status = ANY($5) INNER JOIN version_fields vf ON vf.field_id = 3 AND v.id = vf.version_id INNER JOIN loader_field_enum_values lfev ON vf.enum_value = lfev.id AND (cardinality($2::varchar[]) = 0 OR lfev.value = ANY($2::varchar[])) INNER JOIN loaders_versions lv ON lv.version_id = v.id INNER JOIN loaders l on lv.loader_id = l.id AND (cardinality($3::varchar[]) = 0 OR l.loader = ANY($3::varchar[])) - WHERE m.id = ANY($1) + WHERE m.id = ANY($1) AND m.status = ANY($6) ORDER BY v.date_published ASC ", &files.iter().map(|x| x.project_id.0).collect::>(), &update_data.game_versions.clone().unwrap_or_default(), &update_data.loaders.clone().unwrap_or_default(), &update_data.version_types.clone().unwrap_or_default().iter().map(|x| x.to_string()).collect::>(), + &*VersionStatus::iterator() + .filter(|x| !x.is_hidden()) + .map(|x| x.to_string()) + .collect::>(), + &*ProjectStatus::iterator() + .filter(|x| !x.is_hidden()) + .map(|x| x.to_string()) + .collect::>(), ) .fetch(&***pool) .try_fold(DashMap::new(), |acc : DashMap<_,Vec>, m| { diff --git a/apps/labrinth/tests/version.rs b/apps/labrinth/tests/version.rs index 675eff444..46cf863d9 100644 --- a/apps/labrinth/tests/version.rs +++ b/apps/labrinth/tests/version.rs @@ -132,6 +132,18 @@ async fn version_updates() { beta_version_id ); + let versions = api + .update_files_deserialized_common( + "sha1", + vec![beta_version_hash.to_string()], + None, + None, + None, + None, + ) + .await; + assert!(versions.is_empty()); + // When there is only the one version, there should be no updates let version = api .get_update_from_hash_deserialized_common(