Skip to main content

tuwunel_api/client/backup/
version.rs

1use axum::extract::State;
2use ruma::api::client::backup::{create_backup_version, get_latest_backup_info};
3use tuwunel_core::{Result, err};
4
5use super::{get_count_etag, validate_algorithm_shape};
6use crate::Ruma;
7
8/// # `POST /_matrix/client/r0/room_keys/version`
9///
10/// Creates a new backup.
11pub(crate) async fn create_backup_version_route(
12	State(services): State<crate::State>,
13	body: Ruma<create_backup_version::v3::Request>,
14) -> Result<create_backup_version::v3::Response> {
15	validate_algorithm_shape(&body.algorithm)
16		.map_err(|e| err!(Request(BadJson("Invalid backup metadata: {e}"))))?;
17
18	let version = services
19		.key_backups
20		.create_backup(body.sender_user(), &body.algorithm)?;
21
22	Ok(create_backup_version::v3::Response { version })
23}
24
25/// # `GET /_matrix/client/r0/room_keys/version`
26///
27/// Get information about the latest backup version.
28pub(crate) async fn get_latest_backup_info_route(
29	State(services): State<crate::State>,
30	body: Ruma<get_latest_backup_info::v3::Request>,
31) -> Result<get_latest_backup_info::v3::Response> {
32	let (version, algorithm) = services
33		.key_backups
34		.get_latest_backup(body.sender_user())
35		.await
36		.map_err(|_| err!(Request(NotFound("Key backup does not exist."))))?;
37
38	validate_algorithm_shape(&algorithm)
39		.map_err(|e| err!(Request(NotFound("Key backup does not exist: {e}"))))?;
40
41	let (count, etag) = get_count_etag(&services, body.sender_user(), &version).await?;
42
43	Ok(get_latest_backup_info::v3::Response { algorithm, count, etag, version })
44}