From fa4665280ded306734b8c0968e1e5a05974d5dc9 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Wed, 26 Feb 2025 21:06:00 +0100 Subject: [PATCH] Can get user media --- src/main.rs | 13 ++++++++++++- src/server/api/media.rs | 28 ++++++++++++++++++++++++++++ src/server/api/mod.rs | 3 ++- src/server/api/{rooms.rs => room.rs} | 20 ++++++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 src/server/api/media.rs rename src/server/api/{rooms.rs => room.rs} (59%) diff --git a/src/main.rs b/src/main.rs index 5e09b38..042ab74 100644 --- a/src/main.rs +++ b/src/main.rs @@ -57,7 +57,18 @@ async fn main() -> std::io::Result<()> { .route("/api", web::get().to(api::api_home)) .route("/api", web::post().to(api::api_home)) .route("/api/account/whoami", web::get().to(api::account::who_am_i)) - .route("/api/room/{room_id}/name", web::get().to(api::rooms::name)) + .route("/api/room/{room_id}/name", web::get().to(api::room::name)) + .route( + "/api/room/{room_id}/avatar", + web::get().to(api::room::avatar), + ) + .route( + "/api/media/{server_name}/{media_id}/download", + web::get().to(api::media::download), + ) + // TODO : handle media thumbnail + // TODO : handle space + // TODO : handle user information .service(web::resource("/api/ws").route(web::get().to(api::ws::ws))) }) .workers(4) diff --git a/src/server/api/media.rs b/src/server/api/media.rs new file mode 100644 index 0000000..9da0e6c --- /dev/null +++ b/src/server/api/media.rs @@ -0,0 +1,28 @@ +use crate::extractors::client_auth::APIClientAuth; +use crate::server::HttpResult; +use actix_web::{web, HttpResponse}; +use ruma::api::client::{ media}; +use ruma::OwnedServerName; + +#[derive(serde::Deserialize)] +pub struct MediaInfoInPath { + server_name: OwnedServerName, + media_id: String, +} + +/// Download a media +pub async fn download(auth: APIClientAuth, path: web::Path) -> HttpResult { + let res = auth + .send_request(media::get_content::v3::Request::new( + path.media_id.clone(), + path.server_name.clone(), + )) + .await?; + + let mut http_res = HttpResponse::Ok(); + if let Some(content_type) = res.content_type { + http_res.content_type(content_type); + } + + Ok(http_res.body(res.file)) +} diff --git a/src/server/api/mod.rs b/src/server/api/mod.rs index 80192f2..4023782 100644 --- a/src/server/api/mod.rs +++ b/src/server/api/mod.rs @@ -3,7 +3,8 @@ use crate::server::HttpResult; use actix_web::HttpResponse; pub mod account; -pub mod rooms; +pub mod media; +pub mod room; pub mod ws; /// API Home route diff --git a/src/server/api/rooms.rs b/src/server/api/room.rs similarity index 59% rename from src/server/api/rooms.rs rename to src/server/api/room.rs index 50ff801..4e1a91c 100644 --- a/src/server/api/rooms.rs +++ b/src/server/api/room.rs @@ -29,3 +29,23 @@ pub async fn name(auth: APIClientAuth, path: web::Path) -> HttpRes name: res.content.get_field("name")?.unwrap_or("").to_string(), })) } + +#[derive(serde::Serialize)] +struct GetRoomAvatarResponse { + url: String, +} + +/// Get room avatar +pub async fn avatar(auth: APIClientAuth, path: web::Path) -> HttpResult { + let res = auth + .send_request(state::get_state_events_for_key::v3::Request::new( + path.room_id.clone(), + StateEventType::RoomAvatar, + String::default(), + )) + .await?; + + let avatar_url = res.content.get_field("url")?.unwrap_or("").to_string(); + + Ok(HttpResponse::Ok().json(GetRoomAvatarResponse { url: avatar_url })) +}