tuwunel_api/client/backup/
keys_room.rs1use axum::extract::State;
2use ruma::api::client::backup::{
3 add_backup_keys_for_room::{self, v3::Response as AddResponse},
4 delete_backup_keys_for_room::{self, v3::Response as DeleteResponse},
5 get_backup_keys_for_room::{self, v3::Response as GetResponse},
6};
7use tuwunel_core::{Result, utils::stream::IterStream};
8
9use super::format_count_etag;
10use crate::Ruma;
11
12pub(crate) async fn add_backup_keys_for_room_route(
21 State(services): State<crate::State>,
22 body: Ruma<add_backup_keys_for_room::v3::Request>,
23) -> Result<add_backup_keys_for_room::v3::Response> {
24 let keys = body
25 .sessions
26 .iter()
27 .map(|(session_id, key_data)| (body.room_id.as_ref(), session_id.as_str(), key_data))
28 .stream();
29
30 let metadata = services
31 .key_backups
32 .add_keys(body.sender_user(), &body.version, keys)
33 .await?;
34
35 let (count, etag) = format_count_etag(metadata)?;
36
37 Ok(AddResponse { count, etag })
38}
39
40pub(crate) async fn get_backup_keys_for_room_route(
44 State(services): State<crate::State>,
45 body: Ruma<get_backup_keys_for_room::v3::Request>,
46) -> Result<get_backup_keys_for_room::v3::Response> {
47 let sessions = services
48 .key_backups
49 .get_room(body.sender_user(), &body.version, &body.room_id)
50 .await;
51
52 Ok(GetResponse { sessions })
53}
54
55pub(crate) async fn delete_backup_keys_for_room_route(
59 State(services): State<crate::State>,
60 body: Ruma<delete_backup_keys_for_room::v3::Request>,
61) -> Result<delete_backup_keys_for_room::v3::Response> {
62 let metadata = services
63 .key_backups
64 .delete_room_keys(body.sender_user(), &body.version, &body.room_id)
65 .await?;
66
67 let (count, etag) = format_count_etag(metadata)?;
68
69 Ok(DeleteResponse { count, etag })
70}