bitwarden_sm/secrets/
sync.rs1use bitwarden_api_api::models::SecretsSyncResponseModel;
2use bitwarden_core::{Client, key_management::KeyIds, require};
3use bitwarden_crypto::KeyStoreContext;
4use chrono::{DateTime, Utc};
5use schemars::JsonSchema;
6use serde::{Deserialize, Serialize};
7use uuid::Uuid;
8
9use crate::{error::SecretsManagerError, secrets::SecretResponse};
10
11#[allow(missing_docs)]
12#[derive(Serialize, Deserialize, Debug, JsonSchema)]
13#[serde(rename_all = "camelCase", deny_unknown_fields)]
14pub struct SecretsSyncRequest {
15 pub organization_id: Uuid,
17 pub last_synced_date: Option<DateTime<Utc>>,
19}
20
21pub(crate) async fn sync_secrets(
22 client: &Client,
23 input: &SecretsSyncRequest,
24) -> Result<SecretsSyncResponse, SecretsManagerError> {
25 let config = client.internal.get_api_configurations().await;
26 let last_synced_date = input.last_synced_date.map(|date| date.to_rfc3339());
27
28 let res = config
29 .api_client
30 .secrets_api()
31 .get_secrets_sync(input.organization_id, last_synced_date)
32 .await?;
33
34 let key_store = client.internal.get_key_store();
35
36 SecretsSyncResponse::process_response(res, &mut key_store.context())
37}
38
39#[allow(missing_docs)]
40#[derive(Serialize, Deserialize, Debug, JsonSchema)]
41#[serde(rename_all = "camelCase", deny_unknown_fields)]
42pub struct SecretsSyncResponse {
43 pub has_changes: bool,
44 pub secrets: Option<Vec<SecretResponse>>,
45}
46
47impl SecretsSyncResponse {
48 pub(crate) fn process_response(
49 response: SecretsSyncResponseModel,
50 ctx: &mut KeyStoreContext<KeyIds>,
51 ) -> Result<SecretsSyncResponse, SecretsManagerError> {
52 let has_changes = require!(response.has_changes);
53
54 if has_changes {
55 let secrets = require!(response.secrets)
56 .data
57 .unwrap_or_default()
58 .into_iter()
59 .map(|r| SecretResponse::process_base_response(r, ctx))
60 .collect::<Result<_, _>>()?;
61 return Ok(SecretsSyncResponse {
62 has_changes,
63 secrets: Some(secrets),
64 });
65 }
66
67 Ok(SecretsSyncResponse {
68 has_changes: false,
69 secrets: None,
70 })
71 }
72}