From 1e6eb8ccaf78f27fa161fa9094ee0f2f6b7aab9e Mon Sep 17 00:00:00 2001 From: sychic <47618543+Sychic@users.noreply.github.com> Date: Sat, 18 Apr 2026 15:13:45 -0400 Subject: [PATCH 1/7] fix(teams): accept username in edit member endpoint --- apps/labrinth/src/routes/v2/teams.rs | 2 +- apps/labrinth/src/routes/v3/teams.rs | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/labrinth/src/routes/v2/teams.rs b/apps/labrinth/src/routes/v2/teams.rs index 28d2e03f43..21bc0c0c36 100644 --- a/apps/labrinth/src/routes/v2/teams.rs +++ b/apps/labrinth/src/routes/v2/teams.rs @@ -296,7 +296,7 @@ pub struct EditTeamMember { #[patch("/{id}/members/{user_id}")] pub async fn edit_team_member( req: HttpRequest, - info: web::Path<(TeamId, UserId)>, + info: web::Path<(TeamId, String)>, pool: web::Data, edit_member: web::Json, redis: web::Data, diff --git a/apps/labrinth/src/routes/v3/teams.rs b/apps/labrinth/src/routes/v3/teams.rs index aaba5d2f94..25ea2550a9 100644 --- a/apps/labrinth/src/routes/v3/teams.rs +++ b/apps/labrinth/src/routes/v3/teams.rs @@ -4,7 +4,9 @@ use crate::database::DBProject; use crate::database::PgPool; use crate::database::models::notification_item::NotificationBuilder; use crate::database::models::team_item::TeamAssociationId; -use crate::database::models::{DBOrganization, DBTeam, DBTeamMember, DBUser}; +use crate::database::models::{ + DBOrganization, DBTeam, DBTeamMember, DBUser, DBUserId, +}; use crate::database::redis::RedisPool; use crate::models::ids::TeamId; use crate::models::notifications::NotificationBody; @@ -689,7 +691,7 @@ pub struct EditTeamMember { pub async fn edit_team_member( req: HttpRequest, - info: web::Path<(TeamId, UserId)>, + info: web::Path<(TeamId, String)>, pool: web::Data, edit_member: web::Json, redis: web::Data, @@ -697,7 +699,15 @@ pub async fn edit_team_member( ) -> Result { let ids = info.into_inner(); let id = ids.0.into(); - let user_id = ids.1.into(); + + let user_id = DBUser::get(&ids.1, &**pool, &redis) + .await? + .ok_or_else(|| { + ApiError::InvalidInput( + "The user specified does not exist".to_string(), + ) + })? + .id; let current_user = get_user_from_headers( &req, From ac05af890906bddd21bfad42f827cd25fc88d079 Mon Sep 17 00:00:00 2001 From: sychic <47618543+Sychic@users.noreply.github.com> Date: Sat, 18 Apr 2026 23:48:54 -0400 Subject: [PATCH 2/7] fix: remove unused import --- apps/labrinth/src/routes/v3/teams.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/labrinth/src/routes/v3/teams.rs b/apps/labrinth/src/routes/v3/teams.rs index 25ea2550a9..e893622511 100644 --- a/apps/labrinth/src/routes/v3/teams.rs +++ b/apps/labrinth/src/routes/v3/teams.rs @@ -4,9 +4,7 @@ use crate::database::DBProject; use crate::database::PgPool; use crate::database::models::notification_item::NotificationBuilder; use crate::database::models::team_item::TeamAssociationId; -use crate::database::models::{ - DBOrganization, DBTeam, DBTeamMember, DBUser, DBUserId, -}; +use crate::database::models::{DBOrganization, DBTeam, DBTeamMember, DBUser}; use crate::database::redis::RedisPool; use crate::models::ids::TeamId; use crate::models::notifications::NotificationBody; From 1a83de24e37cef5600844fecb606311871c24447 Mon Sep 17 00:00:00 2001 From: sychic <47618543+Sychic@users.noreply.github.com> Date: Sun, 19 Apr 2026 13:17:44 -0400 Subject: [PATCH 3/7] fix: use context to wrap error --- apps/labrinth/src/routes/v3/teams.rs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/apps/labrinth/src/routes/v3/teams.rs b/apps/labrinth/src/routes/v3/teams.rs index e893622511..6a580e30e4 100644 --- a/apps/labrinth/src/routes/v3/teams.rs +++ b/apps/labrinth/src/routes/v3/teams.rs @@ -12,6 +12,7 @@ use crate::models::pats::Scopes; use crate::models::teams::{OrganizationPermissions, ProjectPermissions}; use crate::queue::session::AuthQueue; use crate::routes::ApiError; +use crate::util::error::Context; use actix_web::{HttpRequest, HttpResponse, get, web}; use ariadne::ids::UserId; use eyre::eyre; @@ -700,11 +701,7 @@ pub async fn edit_team_member( let user_id = DBUser::get(&ids.1, &**pool, &redis) .await? - .ok_or_else(|| { - ApiError::InvalidInput( - "The user specified does not exist".to_string(), - ) - })? + .wrap_request_err("The user specified does not exist")? .id; let current_user = get_user_from_headers( From 3f6ea1bc04560dee13ac258eee108234fed3b8ee Mon Sep 17 00:00:00 2001 From: sychic <47618543+Sychic@users.noreply.github.com> Date: Sun, 19 Apr 2026 13:36:09 -0400 Subject: [PATCH 4/7] refactor: use context for error handling in edit_team_member --- apps/labrinth/src/routes/v3/teams.rs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/apps/labrinth/src/routes/v3/teams.rs b/apps/labrinth/src/routes/v3/teams.rs index 6a580e30e4..90bf654136 100644 --- a/apps/labrinth/src/routes/v3/teams.rs +++ b/apps/labrinth/src/routes/v3/teams.rs @@ -714,24 +714,19 @@ pub async fn edit_team_member( .await? .1; - let team_association = - DBTeam::get_association(id, &**pool).await?.ok_or_else(|| { - ApiError::InvalidInput( - "The team specified does not exist".to_string(), - ) - })?; + let team_association = DBTeam::get_association(id, &**pool) + .await? + .wrap_request_err("The team specified does not exist")?; let member = DBTeamMember::get_from_user_id(id, current_user.id.into(), &**pool) .await?; let edit_member_db = DBTeamMember::get_from_user_id_pending(id, user_id, &**pool) .await? - .ok_or_else(|| { - ApiError::Request(eyre!( - "This member does not exist in this team - \ - the member must first be created via `POST`" - )) - })?; + .wrap_request_err( + "This member does not exist in this team - \ + the member must first be created via `POST`", + )?; let mut transaction = pool.begin().await?; From f4b47e2201ab1c4e70aefd43acf6426ee46b6794 Mon Sep 17 00:00:00 2001 From: sychic <47618543+Sychic@users.noreply.github.com> Date: Mon, 20 Apr 2026 14:45:56 -0400 Subject: [PATCH 5/7] fix: remove unused import --- apps/labrinth/src/routes/v3/teams.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/labrinth/src/routes/v3/teams.rs b/apps/labrinth/src/routes/v3/teams.rs index 90bf654136..78e49beaae 100644 --- a/apps/labrinth/src/routes/v3/teams.rs +++ b/apps/labrinth/src/routes/v3/teams.rs @@ -15,7 +15,6 @@ use crate::routes::ApiError; use crate::util::error::Context; use actix_web::{HttpRequest, HttpResponse, get, web}; use ariadne::ids::UserId; -use eyre::eyre; use rust_decimal::Decimal; use serde::{Deserialize, Serialize}; From ae5947e13a1e82d73c4deeb9d6af40ad477765c6 Mon Sep 17 00:00:00 2001 From: sychic <47618543+Sychic@users.noreply.github.com> Date: Tue, 21 Apr 2026 09:07:37 -0400 Subject: [PATCH 6/7] fix: wrap database errors as internall errors --- apps/labrinth/src/routes/v3/teams.rs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/labrinth/src/routes/v3/teams.rs b/apps/labrinth/src/routes/v3/teams.rs index 78e49beaae..d5a5d57cf3 100644 --- a/apps/labrinth/src/routes/v3/teams.rs +++ b/apps/labrinth/src/routes/v3/teams.rs @@ -700,7 +700,7 @@ pub async fn edit_team_member( let user_id = DBUser::get(&ids.1, &**pool, &redis) .await? - .wrap_request_err("The user specified does not exist")? + .wrap_internal_err("Failed to fetch the specified user")? .id; let current_user = get_user_from_headers( @@ -715,16 +715,17 @@ pub async fn edit_team_member( let team_association = DBTeam::get_association(id, &**pool) .await? - .wrap_request_err("The team specified does not exist")?; + .wrap_internal_err("Failed to fetch the specified team")?; let member = DBTeamMember::get_from_user_id(id, current_user.id.into(), &**pool) .await?; let edit_member_db = DBTeamMember::get_from_user_id_pending(id, user_id, &**pool) .await? - .wrap_request_err( - "This member does not exist in this team - \ - the member must first be created via `POST`", + .wrap_internal_err( + "Failed to fetch team member: \ + this member does not exist in this team - \ + the member must first be created via `POST`", )?; let mut transaction = pool.begin().await?; From 8169b9d59ab19247dfa1ec5c94c54f961751d1ae Mon Sep 17 00:00:00 2001 From: sychic <47618543+Sychic@users.noreply.github.com> Date: Tue, 21 Apr 2026 09:26:35 -0400 Subject: [PATCH 7/7] fix: properly wrap errors --- apps/labrinth/src/routes/v3/teams.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/apps/labrinth/src/routes/v3/teams.rs b/apps/labrinth/src/routes/v3/teams.rs index d5a5d57cf3..e58d4ac606 100644 --- a/apps/labrinth/src/routes/v3/teams.rs +++ b/apps/labrinth/src/routes/v3/teams.rs @@ -699,8 +699,9 @@ pub async fn edit_team_member( let id = ids.0.into(); let user_id = DBUser::get(&ids.1, &**pool, &redis) - .await? - .wrap_internal_err("Failed to fetch the specified user")? + .await + .wrap_internal_err("failed to fetch the specified user")? + .wrap_request_err("the specified user does not exist")? .id; let current_user = get_user_from_headers( @@ -714,17 +715,18 @@ pub async fn edit_team_member( .1; let team_association = DBTeam::get_association(id, &**pool) - .await? - .wrap_internal_err("Failed to fetch the specified team")?; + .await + .wrap_internal_err("failed to fetch the specified team")? + .wrap_request_err("the specified team does not exist")?; let member = DBTeamMember::get_from_user_id(id, current_user.id.into(), &**pool) .await?; let edit_member_db = DBTeamMember::get_from_user_id_pending(id, user_id, &**pool) - .await? - .wrap_internal_err( - "Failed to fetch team member: \ - this member does not exist in this team - \ + .await + .wrap_internal_err("failed to fetch team member")? + .wrap_request_err( + "this member does not exist in this team - \ the member must first be created via `POST`", )?;