From a07aff500834695d17ba2703e0c1967fb060378b Mon Sep 17 00:00:00 2001 From: Brent Schroeter Date: Sat, 12 Apr 2025 23:04:05 -0700 Subject: [PATCH] extract PopulatedTeamMembership into a dedicated struct --- src/guards.rs | 43 ++++++++++++++++++++--------------------- src/team_memberships.rs | 28 ++++++++++++++++++--------- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/guards.rs b/src/guards.rs index e57e80d..835a282 100644 --- a/src/guards.rs +++ b/src/guards.rs @@ -4,7 +4,10 @@ use diesel::prelude::*; use uuid::Uuid; use crate::{ - app_error::AppError, csrf::validate_csrf_token, team_memberships::TeamMembership, teams::Team, + app_error::AppError, + csrf::validate_csrf_token, + team_memberships::{PopulatedTeamMembership, TeamMembership}, + teams::Team, users::User, }; @@ -17,27 +20,23 @@ pub async fn require_team_membership( team_id: &Uuid, db_conn: &Connection, ) -> Result { - let maybe_team = { - let current_user_id = current_user.id; - let team_id = *team_id; - db_conn - .interact::<_, Result>>(move |conn| { - TeamMembership::all() - .filter(TeamMembership::with_user_id(¤t_user_id)) - .filter(TeamMembership::with_team_id(&team_id)) - .first(conn) - .optional() - .map_err(Into::into) - }) - .await - .unwrap()? - }; - match maybe_team { - Some((team, _)) => Ok(team), - None => Err(AppError::Forbidden( - "not a member of requested team".to_string(), - )), - } + let current_user_id = current_user.id; + let team_id = *team_id; + db_conn + .interact::<_, Result>>(move |conn| { + PopulatedTeamMembership::all() + .filter(TeamMembership::with_user_id(¤t_user_id)) + .filter(TeamMembership::with_team_id(&team_id)) + .first(conn) + .optional() + .map_err(Into::into) + }) + .await + .unwrap()? + .map(|team_membership| team_membership.team) + .ok_or(AppError::Forbidden( + "not a member of requested team".to_owned(), + )) } /// Returns a ForbiddenError if the CSRF token parameters do not match an entry diff --git a/src/team_memberships.rs b/src/team_memberships.rs index 8dbeb07..b0bc7c4 100644 --- a/src/team_memberships.rs +++ b/src/team_memberships.rs @@ -21,15 +21,6 @@ pub struct TeamMembership { } impl TeamMembership { - #[diesel::dsl::auto_type(no_type_alias)] - pub fn all() -> _ { - let select: AsSelect<(Team, User), Pg> = <(Team, User)>::as_select(); - team_memberships::table - .inner_join(teams::table) - .inner_join(users::table) - .select(select) - } - #[auto_type(no_type_alias)] pub fn with_team_id<'a>(id: &'a Uuid) -> _ { team_memberships::team_id.eq(id) @@ -40,3 +31,22 @@ impl TeamMembership { team_memberships::user_id.eq(id) } } + +#[derive(Clone, Debug, Queryable, Selectable)] +pub struct PopulatedTeamMembership { + #[diesel(embed)] + pub team: Team, + #[diesel(embed)] + pub user: User, +} + +impl PopulatedTeamMembership { + #[auto_type(no_type_alias)] + pub fn all() -> _ { + let select: AsSelect = Self::as_select(); + team_memberships::table + .inner_join(teams::table) + .inner_join(users::table) + .select(select) + } +}