Skip to main content

bitwarden_sm/projects/
list.rs

1use bitwarden_api_api::models::ProjectResponseModelListResponseModel;
2use bitwarden_core::key_management::KeyIds;
3use bitwarden_crypto::KeyStoreContext;
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6use uuid::Uuid;
7
8use crate::{SecretsManagerClient, error::SecretsManagerError, projects::ProjectResponse};
9
10#[allow(missing_docs)]
11#[derive(Serialize, Deserialize, Debug, JsonSchema)]
12#[serde(rename_all = "camelCase", deny_unknown_fields)]
13pub struct ProjectsListRequest {
14    /// Organization to retrieve all the projects from
15    pub organization_id: Uuid,
16}
17
18pub(crate) async fn list_projects(
19    client: &SecretsManagerClient,
20    input: &ProjectsListRequest,
21) -> Result<ProjectsResponse, SecretsManagerError> {
22    let client = client.client();
23    let config = client.internal.get_api_configurations();
24    let res = config
25        .api_client
26        .projects_api()
27        .list_by_organization(input.organization_id)
28        .await?;
29
30    let key_store = client.internal.get_key_store();
31
32    ProjectsResponse::process_response(res, &mut key_store.context())
33}
34
35#[allow(missing_docs)]
36#[derive(Serialize, Deserialize, Debug, JsonSchema)]
37#[serde(rename_all = "camelCase", deny_unknown_fields)]
38pub struct ProjectsResponse {
39    pub data: Vec<ProjectResponse>,
40}
41
42impl ProjectsResponse {
43    pub(crate) fn process_response(
44        response: ProjectResponseModelListResponseModel,
45        ctx: &mut KeyStoreContext<KeyIds>,
46    ) -> Result<Self, SecretsManagerError> {
47        let data = response.data.unwrap_or_default();
48
49        Ok(ProjectsResponse {
50            data: data
51                .into_iter()
52                .map(|r| ProjectResponse::process_response(r, ctx))
53                .collect::<Result<_, _>>()?,
54        })
55    }
56}