fixes modpacks losing version data on modification (#840)

This commit is contained in:
Wyatt Verchere 2024-01-08 07:28:33 -08:00 committed by GitHub
parent 5f6cc1281e
commit d51d6517be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 4 deletions

View File

@ -244,13 +244,40 @@ pub async fn version_edit(
);
}
// Get the older version to get info from
let old_version = v3::versions::version_get_helper(
req.clone(),
info.clone().0,
pool.clone(),
redis.clone(),
session_queue.clone(),
)
.await
.or_else(v2_reroute::flatten_404_error)?;
let old_version = match v2_reroute::extract_ok_json::<Version>(old_version).await {
Ok(version) => version,
Err(response) => return Ok(response),
};
// If this has 'mrpack_loaders' as a loader field previously, this is a modpack.
// Therefore, if we are modifying the 'loader' field in this case,
// we are actually modifying the 'mrpack_loaders' loader field
let mut loaders = new_version.loaders.clone();
if old_version.fields.contains_key("mrpack_loaders") && new_version.loaders.is_some() {
fields.insert(
"mrpack_loaders".to_string(),
serde_json::json!(new_version.loaders),
);
loaders = None;
}
let new_version = v3::versions::EditVersion {
name: new_version.name,
version_number: new_version.version_number,
changelog: new_version.changelog,
version_type: new_version.version_type,
dependencies: new_version.dependencies,
loaders: new_version.loaders,
loaders,
featured: new_version.featured,
primary_file: new_version.primary_file,
downloads: new_version.downloads,

View File

@ -106,7 +106,7 @@ async fn search_projects() {
found_project_ids.sort();
println!("Facets: {:?}", facets);
assert_eq!(found_project_ids, expected_project_ids);
assert_eq!(num_hits, expected_project_ids.len() as usize);
assert_eq!(num_hits, { expected_project_ids.len() });
}
})
.await;

View File

@ -34,22 +34,25 @@ async fn test_project_type_sanity() {
("mod", "test-mod", TestFile::build_random_jar()),
("modpack", "test-modpack", TestFile::build_random_mrpack()),
] {
// Create a modpack or mod
// both are 'fabric' (but modpack is actually 'mrpack' behind the scenes, through v3,with fabric as a 'mrpack_loader')
let (test_project, test_version) = api
.add_public_project(slug, Some(file), None, USER_USER_PAT)
.await;
let test_project_slug = test_project.slug.as_ref().unwrap();
// TODO:
// assert_eq!(test_project.project_type, mod_or_modpack);
// Check that the loader displays correctly as fabric from the version creation
assert_eq!(test_project.loaders, vec!["fabric"]);
assert_eq!(test_version[0].loaders, vec!["fabric"]);
// Check that the project type is correct when getting the project
let project = api
.get_project_deserialized(test_project_slug, USER_USER_PAT)
.await;
assert_eq!(test_project.loaders, vec!["fabric"]);
assert_eq!(project.project_type, mod_or_modpack);
// Check that the project type is correct when getting the version
let version = api
.get_version_deserialized(&test_version[0].id.to_string(), USER_USER_PAT)
.await;
@ -57,6 +60,34 @@ async fn test_project_type_sanity() {
version.loaders.iter().map(|x| &x.0).collect_vec(),
vec!["fabric"]
);
// Edit the version loader to change it to 'forge'
let resp = api
.edit_version(
&test_version[0].id.to_string(),
json!({
"loaders": ["forge"],
}),
USER_USER_PAT,
)
.await;
assert_status!(&resp, StatusCode::NO_CONTENT);
// Check that the project type is still correct when getting the project
let project = api
.get_project_deserialized(test_project_slug, USER_USER_PAT)
.await;
assert_eq!(project.project_type, mod_or_modpack);
assert_eq!(project.loaders, vec!["forge"]);
// Check that the project type is still correct when getting the version
let version = api
.get_version_deserialized(&test_version[0].id.to_string(), USER_USER_PAT)
.await;
assert_eq!(
version.loaders.iter().map(|x| &x.0).collect_vec(),
vec!["forge"]
);
}
// TODO: as we get more complicated strucures with v3 testing, and alpha/beta get more complicated, we should add more tests here,