Version ordering [MOD-551] (#740)

* Version ordering

* cargo sqlx prepare

* Use version ordering for maven

* Use version ordering when sorting versions in Rust (not just SQL)

* Thanks clippy
This commit is contained in:
Jackson Kruger
2023-11-01 11:36:39 -05:00
committed by GitHub
parent d5594b03e3
commit 911d442340
16 changed files with 392 additions and 27 deletions

View File

@@ -100,7 +100,7 @@ pub async fn maven_metadata(
SELECT id, version_number, version_type
FROM versions
WHERE mod_id = $1 AND status = ANY($2)
ORDER BY date_published ASC
ORDER BY ordering ASC NULLS LAST, date_published ASC
",
project.inner.id as database::models::ids::ProjectId,
&*crate::models::projects::VersionStatus::iterator()

View File

@@ -964,6 +964,7 @@ async fn create_initial_version(
status: VersionStatus::Listed,
version_type: version_data.release_channel.to_string(),
requested_status: None,
ordering: version_data.ordering,
};
Ok(version)

View File

@@ -76,6 +76,9 @@ pub struct InitialVersionData {
#[validate(length(max = 10))]
#[serde(default)]
pub uploaded_images: Vec<ImageId>,
// The ordering relative to other versions
pub ordering: Option<i32>,
}
#[derive(Serialize, Deserialize, Clone)]
@@ -316,6 +319,7 @@ async fn version_create_inner(
featured: version_create_data.featured,
status: version_create_data.status,
requested_status: None,
ordering: version_create_data.ordering,
});
return Ok(());
@@ -427,6 +431,7 @@ async fn version_create_inner(
version_type: version_data.release_channel,
status: builder.status,
requested_status: builder.requested_status,
ordering: builder.ordering,
files: builder
.files
.iter()

View File

@@ -323,7 +323,7 @@ pub async fn get_update_from_hash(
bool
})
.sorted_by(|a, b| a.inner.date_published.cmp(&b.inner.date_published))
.sorted()
.collect::<Vec<_>>();
if let Some(first) = versions.pop() {
@@ -522,7 +522,7 @@ pub async fn update_files(
bool
})
.sorted_by(|a, b| b.inner.date_published.cmp(&a.inner.date_published))
.sorted()
.next();
if let Some(version) = version {
@@ -629,7 +629,7 @@ pub async fn update_individual_files(
bool
})
.sorted_by(|a, b| b.inner.date_published.cmp(&a.inner.date_published))
.sorted()
.next();
if let Some(version) = version {

View File

@@ -115,7 +115,7 @@ pub async fn version_list(
.cloned()
.collect::<Vec<_>>();
versions.sort_by(|a, b| b.inner.date_published.cmp(&a.inner.date_published));
versions.sort();
// Attempt to populate versions with "auto featured" versions
if response.is_empty() && !versions.is_empty() && filters.featured.unwrap_or(false) {
@@ -155,7 +155,7 @@ pub async fn version_list(
}
}
response.sort_by(|a, b| b.inner.date_published.cmp(&a.inner.date_published));
response.sort();
response.dedup_by(|a, b| a.inner.id == b.inner.id);
let response = filter_authorized_versions(response, &user_option, &pool).await?;
@@ -306,6 +306,7 @@ pub struct EditVersion {
pub downloads: Option<u32>,
pub status: Option<VersionStatus>,
pub file_types: Option<Vec<EditVersionFileType>>,
pub ordering: Option<Option<i32>>, //TODO: How do you actually pass this in json?
}
#[derive(Serialize, Deserialize)]
@@ -684,6 +685,20 @@ pub async fn version_edit(
}
}
if let Some(ordering) = &new_version.ordering {
sqlx::query!(
"
UPDATE versions
SET ordering = $1
WHERE (id = $2)
",
ordering.to_owned() as Option<i32>,
id as database::models::ids::VersionId,
)
.execute(&mut *transaction)
.await?;
}
// delete any images no longer in the changelog
let checkable_strings: Vec<&str> = vec![&new_version.changelog]
.into_iter()