-
Notifications
You must be signed in to change notification settings - Fork 45
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
SM-417: Add project create, update, and delete commands #53
Changes from all commits
d4a33fc
21b8749
4664037
0eb10cd
a651815
793d89b
544a525
ec5e8a7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,14 @@ | ||
use bitwarden_api_api::models::{ProjectCreateRequestModel, ProjectUpdateRequestModel}; | ||
|
||
use crate::{ | ||
client::Client, | ||
error::{Error, Result}, | ||
sdk::{ | ||
request::projects_request::{ProjectGetRequest, ProjectsListRequest}, | ||
response::projects_response::{ProjectResponse, ProjectsResponse}, | ||
request::projects_request::{ | ||
ProjectCreateRequest, ProjectGetRequest, ProjectPutRequest, ProjectsDeleteRequest, | ||
ProjectsListRequest, | ||
}, | ||
response::projects_response::{ProjectResponse, ProjectsDeleteResponse, ProjectsResponse}, | ||
}, | ||
}; | ||
|
||
|
@@ -23,6 +28,37 @@ pub(crate) async fn get_project( | |
ProjectResponse::process_response(res, enc) | ||
} | ||
|
||
pub(crate) async fn create_project( | ||
client: &mut Client, | ||
input: &ProjectCreateRequest, | ||
) -> Result<ProjectResponse> { | ||
let enc = client | ||
.get_encryption_settings() | ||
.as_ref() | ||
.ok_or(Error::VaultLocked)?; | ||
|
||
let org_id = Some(input.organization_id); | ||
|
||
let project = Some(ProjectCreateRequestModel { | ||
name: enc.encrypt(input.name.as_bytes(), org_id)?.to_string(), | ||
}); | ||
|
||
let config = client.get_api_configurations().await; | ||
let res = bitwarden_api_api::apis::projects_api::organizations_organization_id_projects_post( | ||
&config.api, | ||
input.organization_id, | ||
project, | ||
) | ||
.await?; | ||
|
||
let enc = client | ||
.get_encryption_settings() | ||
.as_ref() | ||
.ok_or(Error::VaultLocked)?; | ||
|
||
ProjectResponse::process_response(res, enc) | ||
} | ||
|
||
pub(crate) async fn list_projects( | ||
client: &mut Client, | ||
input: &ProjectsListRequest, | ||
|
@@ -41,3 +77,43 @@ pub(crate) async fn list_projects( | |
|
||
ProjectsResponse::process_response(res, enc) | ||
} | ||
|
||
pub(crate) async fn update_project( | ||
client: &mut Client, | ||
input: &ProjectPutRequest, | ||
) -> Result<ProjectResponse> { | ||
let enc = client | ||
.get_encryption_settings() | ||
.as_ref() | ||
.ok_or(Error::VaultLocked)?; | ||
|
||
let org_id = Some(input.organization_id); | ||
|
||
let project = Some(ProjectUpdateRequestModel { | ||
name: enc.encrypt(input.name.as_bytes(), org_id)?.to_string(), | ||
}); | ||
|
||
let config = client.get_api_configurations().await; | ||
let res = | ||
bitwarden_api_api::apis::projects_api::projects_id_put(&config.api, input.id, project) | ||
.await?; | ||
|
||
let enc = client | ||
.get_encryption_settings() | ||
.as_ref() | ||
.ok_or(Error::VaultLocked)?; | ||
Comment on lines
+101
to
+104
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same as here There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Update here |
||
|
||
ProjectResponse::process_response(res, enc) | ||
} | ||
|
||
pub(crate) async fn delete_projects( | ||
client: &mut Client, | ||
input: ProjectsDeleteRequest, | ||
) -> Result<ProjectsDeleteResponse> { | ||
let config = client.get_api_configurations().await; | ||
let res = | ||
bitwarden_api_api::apis::projects_api::projects_delete_post(&config.api, Some(input.ids)) | ||
.await?; | ||
|
||
ProjectsDeleteResponse::process_response(res) | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,9 +9,36 @@ pub struct ProjectGetRequest { | |
pub id: Uuid, | ||
} | ||
|
||
#[derive(Serialize, Deserialize, Debug, JsonSchema)] | ||
#[serde(rename_all = "camelCase", deny_unknown_fields)] | ||
pub struct ProjectCreateRequest { | ||
/// Organization where the project will be created | ||
pub organization_id: Uuid, | ||
|
||
pub name: String, | ||
} | ||
|
||
#[derive(Serialize, Deserialize, Debug, JsonSchema)] | ||
#[serde(rename_all = "camelCase", deny_unknown_fields)] | ||
pub struct ProjectPutRequest { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should this be called updateRequest? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This was to follow the convention in secrets_request.rs which uses There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Discussed this, we will address this in a separate PR |
||
/// ID of the project to modify | ||
pub id: Uuid, | ||
/// Organization ID of the project to modify | ||
pub organization_id: Uuid, | ||
|
||
pub name: String, | ||
} | ||
|
||
#[derive(Serialize, Deserialize, Debug, JsonSchema)] | ||
#[serde(rename_all = "camelCase", deny_unknown_fields)] | ||
pub struct ProjectsListRequest { | ||
/// Organization to retrieve all the projects from | ||
pub organization_id: Uuid, | ||
} | ||
|
||
#[derive(Serialize, Deserialize, Debug, JsonSchema)] | ||
#[serde(rename_all = "camelCase", deny_unknown_fields)] | ||
pub struct ProjectsDeleteRequest { | ||
/// IDs of the projects to delete | ||
pub ids: Vec<Uuid>, | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isn't
enc
already defined above? I think we can reuse it.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, any recommendations on a better way to do this? By removing it we break one of the borrowing rules. With it removed we have the following error, the compiler delineates the following:
cannot borrow *client as mutable because it is also borrowed as immutable
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Discussed with @dani-garcia, addressing this in this PR: #70