Include compatible dependencies field in project search (#6366)

* include compatible dependency projects field

* fix
This commit is contained in:
aecsocket
2026-06-11 20:18:44 +00:00
committed by GitHub
parent c082594825
commit 64e17c7c1b
5 changed files with 96 additions and 34 deletions
+51 -30
View File
@@ -21,7 +21,7 @@ use crate::database::models::{
use crate::database::redis::RedisPool;
use crate::models::exp;
use crate::models::ids::ProjectId;
use crate::models::projects::from_duplicate_version_fields;
use crate::models::projects::{DependencyType, from_duplicate_version_fields};
use crate::models::v2::projects::LegacyProject;
use crate::routes::v2_reroute;
use crate::search::{SearchProjectDependency, UploadSearchProject};
@@ -124,10 +124,14 @@ pub async fn index_local(
info!("Indexing local dependencies!");
let dependencies: DashMap<DBProjectId, Vec<SearchProjectDependency>> =
sqlx::query!(
"
SELECT DISTINCT v.mod_id dependent_project_id, d.mod_dependency_id dependency_project_id,
m.name dependency_name, m.slug dependency_slug, m.icon_url dependency_icon_url
sqlx::query!(
"
SELECT DISTINCT v.mod_id dependent_project_id,
d.mod_dependency_id dependency_project_id,
d.dependency_type dependency_type,
m.name dependency_name,
m.slug dependency_slug,
m.icon_url dependency_icon_url
FROM versions v
INNER JOIN dependencies d ON d.dependent_id = v.id
INNER JOIN mods m ON m.id = d.mod_dependency_id
@@ -135,32 +139,35 @@ pub async fn index_local(
AND d.mod_dependency_id IS NOT NULL
AND m.status = ANY($2)
",
&project_ids,
&searchable_statuses,
)
.fetch(pool)
.try_fold(
DashMap::new(),
|acc: DashMap<DBProjectId, Vec<SearchProjectDependency>>, m| {
if let Some(dependency_project_id) = m.dependency_project_id {
acc.entry(DBProjectId(m.dependent_project_id))
.or_default()
.push(SearchProjectDependency {
project_id: ProjectId::from(DBProjectId(
dependency_project_id,
))
.to_string(),
name: m.dependency_name,
slug: m.dependency_slug,
icon_url: m.dependency_icon_url,
});
}
&project_ids,
&searchable_statuses,
)
.fetch(pool)
.try_fold(
DashMap::new(),
|acc: DashMap<DBProjectId, Vec<SearchProjectDependency>>, m| {
if let Some(dependency_project_id) = m.dependency_project_id {
acc.entry(DBProjectId(m.dependent_project_id))
.or_default()
.push(SearchProjectDependency {
project_id: ProjectId::from(DBProjectId(
dependency_project_id,
))
.to_string(),
dependency_type: DependencyType::from_string(
&m.dependency_type,
),
name: m.dependency_name,
slug: m.dependency_slug,
icon_url: m.dependency_icon_url,
});
}
async move { Ok(acc) }
},
)
.await
.wrap_err("failed to fetch project dependencies")?;
async move { Ok(acc) }
},
)
.await
.wrap_err("failed to fetch project dependencies")?;
struct PartialGallery {
url: String,
@@ -398,6 +405,18 @@ pub async fn index_local(
.iter()
.map(|dependency| dependency.project_id.clone())
.collect::<Vec<_>>();
let compatible_dependency_project_ids = dependencies
.iter()
.filter(|dependency| {
matches!(
dependency.dependency_type,
DependencyType::Required
| DependencyType::Optional
| DependencyType::Embedded
)
})
.map(|dependency| dependency.project_id.clone())
.collect::<Vec<_>>();
if let Some(versions) = versions.remove(&project.id) {
// Aggregated project loader fields
@@ -539,6 +558,8 @@ pub async fn index_local(
open_source,
color: project.color.map(|x| x as u32),
dependency_project_ids: dependency_project_ids.clone(),
compatible_dependency_project_ids:
compatible_dependency_project_ids.clone(),
dependencies: dependencies.clone(),
loader_fields,
project_loader_fields: project_loader_fields.clone(),