92 lines
2.8 KiB
Rust

use axum::{
extract::{Path, State},
http::HeaderMap,
routing::{delete, get, post},
Json, Router,
};
use crate::{
auth::get_user_from_header,
database::model::{Member as DbMember, Message as DbMessage, UserMember as DbUserMember},
model::{member::Roles, message::Channel, Member, Message, User},
util::convert_vec,
AppState,
};
pub fn routes() -> Router<AppState> {
Router::new()
.route("/user", get(get_current_user))
.route("/user/{user_id}/members", post(members_insert))
.route("/user/{user_id}/members", delete(members_remove))
.route("/user/{user_id}/messages", get(get_messages))
}
pub async fn get_current_user(
State(state): State<AppState>,
headers: HeaderMap,
) -> Result<Json<User>, crate::Error> {
let user = get_user_from_header(&state.pool, &headers).await?;
Ok(Json(user))
}
pub async fn members_insert(
State(state): State<AppState>,
Path(user_id): Path<String>,
headers: HeaderMap,
Json(registration_tokens): Json<Vec<String>>,
) -> Result<Json<Vec<Member>>, crate::Error> {
let user = get_user_from_header(&state.pool, &headers).await?;
user.authorize(&state.pool, Some(Roles::ADMIN), Some(user_id))
.await?;
let members =
DbMember::get_many_from_registration_tokens(&state.pool, registration_tokens).await?;
let member_ids: Vec<String> = 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<uuid::Uuid> = vec![user.id; member_ids.len()];
DbUserMember::insert_many(&mut transaction, &user_ids, &member_ids).await?;
transaction.commit().await?;
Ok(Json(convert_vec(members)))
}
pub async fn members_remove(
State(state): State<AppState>,
Path(user_id): Path<String>,
headers: HeaderMap,
Json(member_ids): Json<Vec<String>>,
) -> Result<(), crate::Error> {
let user = get_user_from_header(&state.pool, &headers).await?;
user.authorize(&state.pool, Some(Roles::ADMIN), Some(user_id))
.await?;
let mut transaction = state.pool.begin().await?;
// Link the user to the members
DbUserMember::remove_many(&mut transaction, &[user.id], &member_ids).await?;
transaction.commit().await?;
Ok(())
}
pub async fn get_messages(
State(state): State<AppState>,
Path(user_id): Path<String>,
headers: HeaderMap,
) -> Result<Json<Vec<Message>>, crate::Error> {
let user = get_user_from_header(&state.pool, &headers).await?;
user.authorize(&state.pool, None, Some(user_id)).await?;
let (roles, groups) = user.get_roles_groups(&state.pool).await?;
let messages = DbMessage::get(&state.pool, Channel::ALGEMEEN, roles, groups).await?;
Ok(Json(convert_vec(messages)))
}