tuwunel_api/client/rendezvous/
create.rs1use 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}