summaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/api')
-rw-r--r--src/api/image.rs54
-rw-r--r--src/api/mod.rs1
-rw-r--r--src/api/users.rs28
3 files changed, 81 insertions, 2 deletions
diff --git a/src/api/image.rs b/src/api/image.rs
new file mode 100644
index 0000000..84eccc7
--- /dev/null
+++ b/src/api/image.rs
@@ -0,0 +1,54 @@
+use axum::{extract::Query, response::Response, routing::get, Router, http::StatusCode};
+use serde::Deserialize;
+
+use crate::types::http::ResponseCode;
+
+
+
+#[derive(Deserialize)]
+struct AvatarRequest {
+ user_id: u64,
+}
+
+async fn avatar(params: Option<Query<AvatarRequest>>) -> Response {
+
+ let Some(params) = params else {
+ return ResponseCode::BadRequest.text("Missing query paramaters");
+ };
+
+ let custom = format!("/image/custom/avatar/{}.png", params.user_id);
+ let default = format!("/image/default/{}.png", params.user_id % 25);
+
+ let file = ResponseCode::Success.file(&custom).await;
+ if file.status() != StatusCode::OK {
+ return ResponseCode::Success.file(&default).await
+ }
+ file
+}
+
+#[derive(Deserialize)]
+struct BannerRequest {
+ user_id: u64,
+}
+
+async fn banner(params: Option<Query<BannerRequest>>) -> Response {
+
+ let Some(params) = params else {
+ return ResponseCode::BadRequest.text("Missing query paramaters");
+ };
+
+ let custom = format!("/image/custom/banner/{}.png", params.user_id);
+
+ let file = ResponseCode::Success.file(&custom).await;
+ if file.status() != StatusCode::OK {
+ return ResponseCode::NotFound.text("User does not have a custom banner")
+ }
+ file
+}
+
+
+pub fn router() -> Router {
+ Router::new()
+ .route("/avatar", get(avatar))
+ .route("/banner", get(banner))
+}
diff --git a/src/api/mod.rs b/src/api/mod.rs
index d36b127..adc19d7 100644
--- a/src/api/mod.rs
+++ b/src/api/mod.rs
@@ -8,6 +8,7 @@ pub mod auth;
pub mod pages;
pub mod posts;
pub mod users;
+pub mod image;
pub fn router() -> Router {
let governor_conf = Box::new(
diff --git a/src/api/users.rs b/src/api/users.rs
index afcdddd..83a0d4e 100644
--- a/src/api/users.rs
+++ b/src/api/users.rs
@@ -1,9 +1,9 @@
use crate::types::{
- extract::{AuthorizedUser, Check, CheckResult, Json},
+ extract::{AuthorizedUser, Check, CheckResult, Json, Png},
http::ResponseCode,
user::User,
};
-use axum::{response::Response, routing::post, Router};
+use axum::{response::Response, routing::{post, put}, Router};
use serde::Deserialize;
#[derive(Deserialize)]
@@ -63,9 +63,33 @@ async fn load_self(AuthorizedUser(user): AuthorizedUser) -> Response {
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))
}