From 87584919389451a8b333d8d800852b3e3ba4261c Mon Sep 17 00:00:00 2001 From: xeovalyte Date: Tue, 11 Feb 2025 20:34:47 +0100 Subject: [PATCH] Added a method to get current members --- server/src/database/model/user.rs | 16 ++++++++++++++++ server/src/model/member.rs | 4 ++-- server/src/model/user.rs | 13 +++++++++++++ server/src/routes/member.rs | 24 +++++++++++++++++++----- 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/server/src/database/model/user.rs b/server/src/database/model/user.rs index 38a82b3..a2cd28b 100644 --- a/server/src/database/model/user.rs +++ b/server/src/database/model/user.rs @@ -2,6 +2,8 @@ use sqlx::{PgPool, Postgres}; use crate::model::member::Roles; +use super::Member as DbMember; + #[derive(validator::Validate)] pub struct User { pub user_id: uuid::Uuid, @@ -99,4 +101,18 @@ impl UserMember { Ok(roles) } + + pub async fn get_members_from_user( + pool: &PgPool, + user_id: &uuid::Uuid, + ) -> Result, sqlx::Error> { + let members = sqlx::query_as!(DbMember, + " + SELECT members.* FROM users_members INNER JOIN members ON users_members.member_id = members.member_id AND users_members.user_id = $1; + ", + user_id + ).fetch_all(pool).await?; + + Ok(members) + } } diff --git a/server/src/model/member.rs b/server/src/model/member.rs index 9539b24..cd188bf 100644 --- a/server/src/model/member.rs +++ b/server/src/model/member.rs @@ -1,13 +1,13 @@ use bitflags::bitflags; use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct Name { pub first: String, pub full: String, } -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct Member { pub id: String, pub name: Name, diff --git a/server/src/model/user.rs b/server/src/model/user.rs index 9a7b3c7..f380237 100644 --- a/server/src/model/user.rs +++ b/server/src/model/user.rs @@ -1,4 +1,5 @@ use serde::Serialize; +use sqlx::PgPool; #[derive(Serialize)] pub struct User { @@ -8,6 +9,10 @@ pub struct User { } use crate::database::model::User as DbUser; +use crate::database::model::UserMember as DbUserMember; +use crate::util::convert_vec; + +use super::Member; impl From for User { fn from(db_user: DbUser) -> Self { Self { @@ -17,3 +22,11 @@ impl From for User { } } } + +impl User { + pub async fn members(&self, pool: &PgPool) -> Result, sqlx::Error> { + let related_members = DbUserMember::get_members_from_user(pool, &self.id).await?; + + Ok(convert_vec(related_members)) + } +} diff --git a/server/src/routes/member.rs b/server/src/routes/member.rs index a5cdcc6..9b31a16 100644 --- a/server/src/routes/member.rs +++ b/server/src/routes/member.rs @@ -1,6 +1,11 @@ -use axum::{extract::State, routing::post, Router}; +use axum::{ + extract::State, + http::HeaderMap, + routing::{get, post}, + Json, Router, +}; -use crate::AppState; +use crate::{auth::get_user_from_header, model::Member, AppState}; pub mod migrate; @@ -8,11 +13,20 @@ pub fn routes() -> Router { Router::new() .route("/members/migrate_request", post(migrate::migrate_request)) .route("/members/migrate_confirm", post(migrate::migrate_confirm)) + .route("/member", get(get_current_members)) } -pub async fn get_members<'a>( +pub async fn get_current_members( State(state): State, - body: String, -) -> Result<(), crate::Error> { + headers: HeaderMap, +) -> Result>, crate::Error> { + let (_roles, user) = get_user_from_header(&state.pool, &headers).await?; + + let members = user.members(&state.pool).await?; + + Ok(Json(members)) +} + +pub async fn get_members(State(state): State, body: String) -> Result<(), crate::Error> { Ok(()) }