tuwunel_api/client/backup/
version.rs1use 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
11pub(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
29pub(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}