Skip to main content

tuwunel_api/client/rendezvous/
create.rs

1use axum::{
2	Json,
3	extract::{Request, State},
4	response::{IntoResponse, Response},
5};
6use http::StatusCode;
7use serde::Serialize;
8use tuwunel_core::Result;
9
10use super::{ensure_enabled, read_plain_body, session_headers};
11
12#[derive(Serialize)]
13struct CreateResponse {
14	url: String,
15}
16
17#[tracing::instrument(level = "debug", skip_all)]
18pub(crate) async fn create_rendezvous_route(
19	State(services): State<crate::State>,
20	request: Request,
21) -> Result<Response> {
22	ensure_enabled(&services)?;
23
24	let oidc = services.oauth.get_server()?;
25	let base = oidc.issuer_url()?;
26	let base = base.trim_end_matches('/');
27	let max_bytes = services.config.rendezvous_session_max_bytes;
28	let (parts, body) = request.into_parts();
29	let data = read_plain_body(&parts.headers, body, max_bytes).await?;
30	let (id, meta) = services.rendezvous.create(data);
31	let url = format!("{base}/_matrix/client/unstable/org.matrix.msc4108/rendezvous/{id}");
32	let mut response = (StatusCode::CREATED, Json(CreateResponse { url })).into_response();
33
34	session_headers(response.headers_mut(), &meta)?;
35
36	Ok(response)
37}