2 Commits

Author SHA1 Message Date
fa4665280d Can get user media 2025-02-26 21:06:00 +01:00
4589b3b339 Can get the name of a room through the API 2025-02-26 20:47:32 +01:00
5 changed files with 96 additions and 1 deletions

View File

@@ -57,6 +57,18 @@ async fn main() -> std::io::Result<()> {
.route("/api", web::get().to(api::api_home)) .route("/api", web::get().to(api::api_home))
.route("/api", web::post().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/account/whoami", web::get().to(api::account::who_am_i))
.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))) .service(web::resource("/api/ws").route(web::get().to(api::ws::ws)))
}) })
.workers(4) .workers(4)

28
src/server/api/media.rs Normal file
View File

@@ -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<MediaInfoInPath>) -> 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))
}

View File

@@ -3,6 +3,8 @@ use crate::server::HttpResult;
use actix_web::HttpResponse; use actix_web::HttpResponse;
pub mod account; pub mod account;
pub mod media;
pub mod room;
pub mod ws; pub mod ws;
/// API Home route /// API Home route

51
src/server/api/room.rs Normal file
View File

@@ -0,0 +1,51 @@
use crate::extractors::client_auth::APIClientAuth;
use crate::server::HttpResult;
use actix_web::{web, HttpResponse};
use ruma::api::client::state;
use ruma::events::StateEventType;
use ruma::OwnedRoomId;
#[derive(serde::Deserialize)]
pub struct RoomIDInPath {
room_id: OwnedRoomId,
}
#[derive(serde::Serialize)]
struct GetRoomNameResponse {
name: String,
}
/// Get room name
pub async fn name(auth: APIClientAuth, path: web::Path<RoomIDInPath>) -> HttpResult {
let res = auth
.send_request(state::get_state_events_for_key::v3::Request::new(
path.room_id.clone(),
StateEventType::RoomName,
String::default(),
))
.await?;
Ok(HttpResponse::Ok().json(GetRoomNameResponse {
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<RoomIDInPath>) -> 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 }))
}

View File

@@ -28,6 +28,8 @@ pub enum HttpFailure {
MatrixApiClientError(#[from] ruma::api::client::Error), MatrixApiClientError(#[from] ruma::api::client::Error),
#[error("a matrix client error occurred: {0}")] #[error("a matrix client error occurred: {0}")]
MatrixClientError(String), MatrixClientError(String),
#[error("a serde_json error occurred: {0}")]
SerdeJsonError(#[from] serde_json::error::Error),
} }
impl ResponseError for HttpFailure { impl ResponseError for HttpFailure {