From 0188a0187192023f5523a8861b33771c6678e938 Mon Sep 17 00:00:00 2001 From: strawberry Date: Mon, 13 May 2024 23:13:55 -0400 Subject: [PATCH] feat(media): add `/_matrix/media/v1/create` endpoint https://spec.matrix.org/latest/client-server-api/#post_matrixmediav1create Signed-off-by: strawberry --- src/api/client_server/media.rs | 25 ++++++++++++++++++++++++- src/router/routes.rs | 1 + 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/api/client_server/media.rs b/src/api/client_server/media.rs index b294fec2..d7f7185a 100644 --- a/src/api/client_server/media.rs +++ b/src/api/client_server/media.rs @@ -6,7 +6,7 @@ use reqwest::Url; use ruma::api::client::{ error::{ErrorKind, RetryAfter}, media::{ - create_content, get_content, get_content_as_filename, get_content_thumbnail, get_media_config, + create_content, create_mxc_uri, get_content, get_content_as_filename, get_content_thumbnail, get_media_config, get_media_preview, }, }; @@ -59,6 +59,29 @@ pub(crate) async fn get_media_config_v1_route( get_media_config_route(body).await.map(RumaResponse) } +/// # `POST /_matrix/media/v1/create` +/// +/// Creates a MXC URI. +/// +/// +/// +/// TODO: implement `unused_expires_at`, prevent MXC URI creation spam by +/// keeping track of created MXC URIs with no content pushed to them per-user +pub(crate) async fn create_mxc_uri(body: Ruma) -> Result { + let _sender_user = body.sender_user.as_ref().expect("user is authenticated"); + + let mxc = format!( + "mxc://{}/{}", + services().globals.server_name(), + utils::random_string(MXC_LENGTH) + ); + + Ok(create_mxc_uri::v1::Response { + content_uri: mxc.into(), + unused_expires_at: None, + }) +} + /// # `GET /_matrix/media/v3/preview_url` /// /// Returns URL preview. diff --git a/src/router/routes.rs b/src/router/routes.rs index d8b73b4f..8c77d02a 100644 --- a/src/router/routes.rs +++ b/src/router/routes.rs @@ -133,6 +133,7 @@ pub(crate) fn routes(config: &Config) -> Router { .ruma_route(client_server::get_media_config_route) .ruma_route(client_server::get_media_preview_route) .ruma_route(client_server::create_content_route) + .ruma_route(client_server::create_mxc_uri) // legacy v1 media routes .route( "/_matrix/media/v1/preview_url",