92 lines
2.8 KiB
Rust
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)))
|
|
}
|