Skip to content

Commit e00c6d9

Browse files
committed
Add list and get
1 parent a4f489f commit e00c6d9

File tree

5 files changed

+78
-11
lines changed

5 files changed

+78
-11
lines changed

crates/bitwarden-vault/src/folder/edit.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,14 @@ use thiserror::Error;
77
#[cfg(feature = "wasm")]
88
use wasm_bindgen::prelude::*;
99

10-
use crate::{Folder, FolderAddEditRequest, FolderView, VaultParseError};
11-
12-
/// Item does not already exist error.
13-
#[derive(Debug, thiserror::Error)]
14-
#[error("Item does not already exist")]
15-
pub struct ItemDoesNotExistError;
10+
use crate::{Folder, FolderAddEditRequest, FolderView, ItemNotFoundError, VaultParseError};
1611

1712
#[allow(missing_docs)]
1813
#[bitwarden_error(flat)]
1914
#[derive(Debug, Error)]
2015
pub enum EditFolderError {
2116
#[error(transparent)]
22-
ItemDoesNotExist(#[from] ItemDoesNotExistError),
17+
ItemNotFound(#[from] ItemNotFoundError),
2318
#[error(transparent)]
2419
Crypto(#[from] CryptoError),
2520
#[error(transparent)]
@@ -45,7 +40,7 @@ pub(super) async fn edit_folder<R: Repository<Folder> + ?Sized>(
4540
repository
4641
.get(folder_id.to_owned())
4742
.await?
48-
.ok_or(ItemDoesNotExistError)?;
43+
.ok_or(ItemNotFoundError)?;
4944

5045
let folder_request = key_store.encrypt(request)?;
5146

@@ -172,7 +167,7 @@ mod tests {
172167
assert!(result.is_err());
173168
assert!(matches!(
174169
result.unwrap_err(),
175-
EditFolderError::ItemDoesNotExist(_)
170+
EditFolderError::ItemNotFound(_)
176171
));
177172
}
178173

crates/bitwarden-vault/src/folder/folder_client.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use wasm_bindgen::prelude::*;
77

88
use crate::{
99
error::{DecryptError, EncryptError},
10-
folder::{create_folder, edit_folder},
11-
CreateFolderError, EditFolderError, Folder, FolderAddEditRequest, FolderView,
10+
folder::{create_folder, edit_folder, get_folder, list_folders},
11+
CreateFolderError, EditFolderError, Folder, FolderAddEditRequest, FolderView, GetFolderError,
1212
};
1313

1414
/// Wrapper for folder specific functionality.
@@ -40,6 +40,22 @@ impl FoldersClient {
4040
Ok(views)
4141
}
4242

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+
4359
/// Create a new [Folder] and save it to the server.
4460
pub async fn create(
4561
&self,

crates/bitwarden-vault/src/folder/folder_models.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ pub struct FolderView {
3939
pub revision_date: DateTime<Utc>,
4040
}
4141

42+
impl wasm_bindgen::__rt::VectorIntoJsValue for FolderView {
43+
fn vector_into_jsvalue(
44+
vector: wasm_bindgen::__rt::std::boxed::Box<[Self]>,
45+
) -> wasm_bindgen::JsValue {
46+
wasm_bindgen::__rt::js_value_vector_into_jsvalue(vector)
47+
}
48+
}
49+
4250
impl IdentifyKey<SymmetricKeyId> for Folder {
4351
fn key_identifier(&self) -> SymmetricKeyId {
4452
SymmetricKeyId::User
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
use bitwarden_core::key_management::KeyIds;
2+
use bitwarden_crypto::{CryptoError, KeyStore};
3+
use bitwarden_error::bitwarden_error;
4+
use bitwarden_state::repository::{Repository, RepositoryError};
5+
use thiserror::Error;
6+
7+
use crate::{Folder, FolderView, ItemNotFoundError};
8+
9+
#[allow(missing_docs)]
10+
#[bitwarden_error(flat)]
11+
#[derive(Debug, Error)]
12+
pub enum GetFolderError {
13+
#[error(transparent)]
14+
ItemDoesNotExist(#[from] ItemNotFoundError),
15+
#[error(transparent)]
16+
Crypto(#[from] CryptoError),
17+
#[error(transparent)]
18+
RepositoryError(#[from] RepositoryError),
19+
}
20+
21+
pub(super) async fn get_folder(
22+
store: &KeyStore<KeyIds>,
23+
repository: &dyn Repository<Folder>,
24+
id: &str,
25+
) -> Result<FolderView, GetFolderError> {
26+
let folder = repository
27+
.get(id.to_string())
28+
.await?
29+
.ok_or(ItemNotFoundError)?;
30+
31+
Ok(store.decrypt(&folder)?)
32+
}
33+
34+
pub(super) async fn list_folders(
35+
store: &KeyStore<KeyIds>,
36+
repository: &dyn Repository<Folder>,
37+
) -> Result<Vec<FolderView>, GetFolderError> {
38+
let folders = repository.list().await?;
39+
let views = store.decrypt_list(&folders)?;
40+
Ok(views)
41+
}

crates/bitwarden-vault/src/folder/mod.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,15 @@ mod create;
22
mod edit;
33
mod folder_client;
44
mod folder_models;
5+
mod get_list;
56

67
pub use create::*;
78
pub use edit::*;
89
pub use folder_client::*;
910
pub use folder_models::*;
11+
pub use get_list::*;
12+
13+
/// Item does not exist error.
14+
#[derive(Debug, thiserror::Error)]
15+
#[error("Item does not exist")]
16+
pub struct ItemNotFoundError;

0 commit comments

Comments
 (0)