bitwarden_vault/folder/
folder_client.rs

1use std::sync::Arc;
2
3use bitwarden_core::Client;
4use bitwarden_state::repository::{Repository, RepositoryError};
5#[cfg(feature = "wasm")]
6use wasm_bindgen::prelude::*;
7
8use crate::{
9    CreateFolderError, EditFolderError, Folder, FolderAddEditRequest, FolderId, FolderView,
10    GetFolderError,
11    error::{DecryptError, EncryptError},
12    folder::{create_folder, edit_folder, get_folder, list_folders},
13};
14
15/// Wrapper for folder specific functionality.
16#[cfg_attr(feature = "wasm", wasm_bindgen)]
17pub struct FoldersClient {
18    pub(crate) client: Client,
19}
20
21#[cfg_attr(feature = "wasm", wasm_bindgen)]
22impl FoldersClient {
23    /// Encrypt a [FolderView] to a [Folder].
24    pub fn encrypt(&self, folder_view: FolderView) -> Result<Folder, EncryptError> {
25        let key_store = self.client.internal.get_key_store();
26        let folder = key_store.encrypt(folder_view)?;
27        Ok(folder)
28    }
29
30    /// Encrypt a [Folder] to [FolderView].
31    pub fn decrypt(&self, folder: Folder) -> Result<FolderView, DecryptError> {
32        let key_store = self.client.internal.get_key_store();
33        let folder_view = key_store.decrypt(&folder)?;
34        Ok(folder_view)
35    }
36
37    /// Decrypt a list of [Folder]s to a list of [FolderView]s.
38    pub fn decrypt_list(&self, folders: Vec<Folder>) -> Result<Vec<FolderView>, DecryptError> {
39        let key_store = self.client.internal.get_key_store();
40        let views = key_store.decrypt_list(&folders)?;
41        Ok(views)
42    }
43
44    /// Get all folders from state and decrypt them to a list of [FolderView].
45    pub async fn list(&self) -> Result<Vec<FolderView>, GetFolderError> {
46        let key_store = self.client.internal.get_key_store();
47        let repository = self.get_repository()?;
48
49        list_folders(key_store, repository.as_ref()).await
50    }
51
52    /// Get a specific [Folder] by its ID from state and decrypt it to a [FolderView].
53    pub async fn get(&self, folder_id: FolderId) -> Result<FolderView, GetFolderError> {
54        let key_store = self.client.internal.get_key_store();
55        let repository = self.get_repository()?;
56
57        get_folder(key_store, repository.as_ref(), folder_id).await
58    }
59
60    /// Create a new [Folder] and save it to the server.
61    pub async fn create(
62        &self,
63        request: FolderAddEditRequest,
64    ) -> Result<FolderView, CreateFolderError> {
65        let key_store = self.client.internal.get_key_store();
66        let config = self.client.internal.get_api_configurations().await;
67        let repository = self.get_repository()?;
68
69        create_folder(key_store, &config.api_client, repository.as_ref(), request).await
70    }
71
72    /// Edit the [Folder] and save it to the server.
73    pub async fn edit(
74        &self,
75        folder_id: FolderId,
76        request: FolderAddEditRequest,
77    ) -> Result<FolderView, EditFolderError> {
78        let key_store = self.client.internal.get_key_store();
79        let config = self.client.internal.get_api_configurations().await;
80        let repository = self.get_repository()?;
81
82        edit_folder(
83            key_store,
84            &config.api_client,
85            repository.as_ref(),
86            folder_id,
87            request,
88        )
89        .await
90    }
91}
92
93impl FoldersClient {
94    /// Helper for getting the repository for folders.
95    fn get_repository(&self) -> Result<Arc<dyn Repository<Folder>>, RepositoryError> {
96        Ok(self
97            .client
98            .platform()
99            .state()
100            .get_client_managed::<Folder>()?)
101    }
102}