Skip to main content

tuwunel_api/client/backup/
version.rs

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