use crate::types::{ extract::{AuthorizedUser, Check, CheckResult, Json, Png}, http::ResponseCode, user::User, }; use axum::{response::Response, routing::{post, put}, Router}; use serde::Deserialize; #[derive(Deserialize)] struct UserLoadRequest { ids: Vec, } impl Check for UserLoadRequest { fn check(&self) -> CheckResult { Ok(()) } } async fn load_batch( AuthorizedUser(_user): AuthorizedUser, Json(body): Json, ) -> Response { let users = User::from_user_ids(body.ids); let Ok(json) = serde_json::to_string(&users) else { return ResponseCode::InternalServerError.text("Failed to fetch users") }; ResponseCode::Success.json(&json) } #[derive(Deserialize)] struct UserPageReqiest { page: u64, } impl Check for UserPageReqiest { fn check(&self) -> CheckResult { Ok(()) } } async fn load_page( AuthorizedUser(_user): AuthorizedUser, Json(body): Json, ) -> Response { let Ok(users) = User::from_user_page(body.page) else { return ResponseCode::InternalServerError.text("Failed to fetch users") }; let Ok(json) = serde_json::to_string(&users) else { return ResponseCode::InternalServerError.text("Failed to fetch users") }; ResponseCode::Success.json(&json) } async fn load_self(AuthorizedUser(user): AuthorizedUser) -> Response { let Ok(json) = serde_json::to_string(&user) else { return ResponseCode::InternalServerError.text("Failed to fetch user") }; ResponseCode::Success.json(&json) } async fn avatar(AuthorizedUser(user): AuthorizedUser, Png(img): Png) -> Response { let path = format!("./public/image/custom/avatar/{}.png", user.user_id); if img.save(path).is_err() { return ResponseCode::InternalServerError.text("Failed to update avatar"); } ResponseCode::Success.text("Successfully updated avatar") } async fn banner(AuthorizedUser(user): AuthorizedUser, Png(img): Png) -> Response { let path = format!("./public/image/custom/banner/{}.png", user.user_id); if img.save(path).is_err() { return ResponseCode::InternalServerError.text("Failed to update banner"); } ResponseCode::Success.text("Successfully updated banner") } pub fn router() -> Router { Router::new() .route("/load", post(load_batch)) .route("/self", post(load_self)) .route("/page", post(load_page)) .route("/avatar", put(avatar)) .route("/banner", put(banner)) }