Move all-projects route to specific user scope (#6220)

* Move all-projects route to specific user scope

* ci

* ci flaky test

* fmt
This commit is contained in:
aecsocket
2026-05-28 15:41:57 +01:00
committed by GitHub
parent cf1d948030
commit ec49a3b051
2 changed files with 40 additions and 14 deletions
@@ -252,12 +252,27 @@ async fn fetch_project_downloads_facets(
fn normalize_download_source_facets(
user_agents: &[String],
) -> Vec<DownloadSource> {
user_agents
let mut sources = user_agents
.iter()
.filter_map(|user_agent| normalize_download_source(user_agent))
.collect::<HashSet<_>>()
.into_iter()
.collect()
.collect::<Vec<_>>();
sources.sort_by(|a, b| {
download_source_sort_key(a).cmp(download_source_sort_key(b))
});
sources
}
fn download_source_sort_key(source: &DownloadSource) -> &str {
match source {
DownloadSource::Named(name) => name,
DownloadSource::Website => "website",
DownloadSource::ModrinthApp => "modrinth_app",
DownloadSource::ModrinthHosting => "modrinth_hosting",
DownloadSource::ModrinthMaven => "modrinth_maven",
DownloadSource::Other => "other",
}
}
async fn fetch_project_playtime_facets(
+23 -12
View File
@@ -40,10 +40,10 @@ pub fn config(cfg: &mut web::ServiceConfig) {
cfg.route("user", web::get().to(user_auth_get));
cfg.route("users", web::get().to(users_get));
cfg.route("user_email", web::get().to(admin_user_email));
cfg.route("all-projects", web::get().to(all_projects));
cfg.service(
web::scope("user")
.route("{user_id}/all-projects", web::get().to(all_projects))
.route("{user_id}/projects", web::get().to(projects_list))
.route("{id}/notes", web::patch().to(user_notes_edit))
.route("{id}", web::get().to(user_get))
@@ -72,6 +72,7 @@ pub struct UserEmailQuery {
pub async fn all_projects(
req: HttpRequest,
info: web::Path<(String,)>,
pool: web::Data<PgPool>,
redis: web::Data<RedisPool>,
session_queue: web::Data<AuthQueue>,
@@ -81,15 +82,19 @@ pub async fn all_projects(
&**pool,
&redis,
&session_queue,
Scopes::PROJECT_READ | Scopes::ORGANIZATION_READ,
Scopes::PROJECT_READ,
)
.await?
.1;
.await
.map(|x| x.1)
.ok();
let target_user = DBUser::get(&info.into_inner().0, &**pool, &redis)
.await?
.ok_or(ApiError::NotFound)?;
let user_project_ids =
DBUser::get_projects(user.id.into(), &**pool, &redis).await?;
DBUser::get_projects(target_user.id, &**pool, &redis).await?;
let organization_ids =
DBUser::get_organizations(user.id.into(), &**pool).await?;
DBUser::get_organizations(target_user.id, &**pool).await?;
let organizations_data =
DBOrganization::get_many_ids(&organization_ids, &**pool, &redis)
.await?;
@@ -124,22 +129,29 @@ pub async fn all_projects(
let mut organizations = HashMap::new();
let mut visible_organization_ids = Vec::new();
for data in organizations_data {
if !is_visible_organization(&data, &Some(user.clone()), &pool, &redis)
.await?
{
if !is_visible_organization(&data, &user, &pool, &redis).await? {
continue;
}
visible_organization_ids.push(data.id);
let members_data = team_groups.remove(&data.team_id).unwrap_or(vec![]);
let logged_in = user
.as_ref()
.and_then(|user| {
members_data
.iter()
.find(|x| x.user_id == user.id.into() && x.accepted)
})
.is_some();
let team_members = members_data
.into_iter()
.filter(|x| logged_in || x.accepted || target_user.id == x.user_id)
.filter_map(|data| {
users.iter().find(|x| x.id == data.user_id).map(|member| {
crate::models::teams::TeamMember::from(
data,
member.clone(),
false,
!logged_in,
)
})
})
@@ -179,8 +191,7 @@ pub async fn all_projects(
crate::database::DBProject::get_many_ids(&project_ids, &**pool, &redis)
.await?;
let projects =
filter_visible_projects(projects_data, &Some(user), &pool, true)
.await?;
filter_visible_projects(projects_data, &user, &pool, true).await?;
Ok(web::Json(AllProjectsResponse {
projects,