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