diff --git a/server/migrations/004_unique_users_members.sql b/server/migrations/004_unique_users_members.sql new file mode 100644 index 0000000..9db96ac --- /dev/null +++ b/server/migrations/004_unique_users_members.sql @@ -0,0 +1,2 @@ +ALTER TABLE users_members + ADD UNIQUE (user_id, member_id); diff --git a/server/src/auth.rs b/server/src/auth.rs index 78362e7..4295958 100644 --- a/server/src/auth.rs +++ b/server/src/auth.rs @@ -12,8 +12,8 @@ use sqlx::PgPool; use tokio::task; use crate::{ - database::model::{Session, UserMember}, - model::{member::Roles, User}, + database::model::Session, + model::User, }; mod error; diff --git a/server/src/routes.rs b/server/src/routes.rs index 6f0f452..d382eea 100644 --- a/server/src/routes.rs +++ b/server/src/routes.rs @@ -8,7 +8,6 @@ pub mod user; pub fn routes() -> Router { Router::new() .route("/", get(root)) - // .route("/member/:id", get()) .merge(member::routes()) .merge(auth::routes()) .merge(user::routes()) diff --git a/server/src/routes/user.rs b/server/src/routes/user.rs index 5cb7ceb..a1b0d32 100644 --- a/server/src/routes/user.rs +++ b/server/src/routes/user.rs @@ -7,7 +7,9 @@ use axum::{ use crate::{ auth::get_user_from_header, - model::{member::Roles, User}, + database::model::{Member as DbMember, UserMember as DbUserMember}, + model::{member::Roles, Member, User}, + util::convert_vec, AppState, }; @@ -29,10 +31,24 @@ pub async fn members_insert( State(state): State, Path(user_id): Path, headers: HeaderMap, -) -> Result<(), crate::Error> { + Json(registration_tokens): Json>, +) -> Result>, crate::Error> { let user = get_user_from_header(&state.pool, &headers).await?; user.authorize(&state.pool, Some(Roles::ADMIN), Some(user_id)) .await?; - Ok(()) + let members = + DbMember::get_many_from_registration_tokens(&state.pool, registration_tokens).await?; + + let member_ids: Vec = members.iter().map(|m| m.member_id.to_owned()).collect(); + + let mut transaction = state.pool.begin().await?; + + // Link the user to the members + let user_ids: Vec = vec![user.id; member_ids.len()]; + DbUserMember::insert_many(&mut transaction, &user_ids, &member_ids).await?; + + transaction.commit().await?; + + Ok(Json(convert_vec(members))) }