From 7061cd02105ca7bb544b3ad25ff3f720cc526a32 Mon Sep 17 00:00:00 2001 From: pfvatterott Date: Fri, 28 Mar 2025 14:28:00 -0600 Subject: [PATCH] Add Migrate User Password API --- src/apis/user_service_api.rs | 67 +++++++++++++++++++ .../bad_migrate_user_password_request.rs | 31 +++++++++ src/models/migrate_user_password_request.rs | 26 +++++++ src/models/mod.rs | 4 ++ src/propelauth/errors.rs | 17 ++++- src/propelauth/user.rs | 35 +++++++++- 6 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 src/models/bad_migrate_user_password_request.rs create mode 100644 src/models/migrate_user_password_request.rs diff --git a/src/apis/user_service_api.rs b/src/apis/user_service_api.rs index 303bbb2..af637a4 100644 --- a/src/apis/user_service_api.rs +++ b/src/apis/user_service_api.rs @@ -116,6 +116,12 @@ pub struct MigrateUserParams { pub migrate_user_request: crate::models::MigrateUserRequest, } +/// struct for passing parameters to the method [`migrate_user_password`] +#[derive(Clone, Debug, Default)] +pub struct MigrateUserPasswordParams { + pub migrate_user_password_request: crate::models::MigrateUserPasswordRequest, +} + /// struct for passing parameters to the method [`update_user_email`] #[derive(Clone, Debug, Default)] pub struct UpdateUserEmailParams { @@ -283,6 +289,15 @@ pub enum MigrateUserError { UnknownValue(serde_json::Value), } +/// struct for typed errors of method [`migrate_user_password`] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(untagged)] +pub enum MigrateUserPasswordError { + Status400(crate::models::BadMigrateUserPasswordRequest), + Status401(serde_json::Value), + UnknownValue(serde_json::Value), +} + /// struct for typed errors of method [`update_user_email`] #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(untagged)] @@ -1207,6 +1222,58 @@ pub async fn migrate_user( } } +pub async fn migrate_user_password( + configuration: &configuration::Configuration, + params: MigrateUserPasswordParams, +) -> Result> { + let local_var_configuration = configuration; + + // unbox the parameters + let migrate_user_password_request = params.migrate_user_password_request; + + let local_var_client = &local_var_configuration.client; + + let local_var_uri_str = format!( + "{}/api/backend/v1/migrate_user/password", + local_var_configuration.base_path + ); + let mut local_var_req_builder = + local_var_client.request(reqwest::Method::POST, local_var_uri_str.as_str()); + + if let Some(ref local_var_user_agent) = local_var_configuration.user_agent { + local_var_req_builder = + local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone()); + } + if let Some(ref local_var_token) = local_var_configuration.bearer_access_token { + local_var_req_builder = local_var_req_builder.bearer_auth(local_var_token.to_owned()); + }; + local_var_req_builder = local_var_req_builder.header( + AUTH_HOSTNAME_HEADER, + local_var_configuration.auth_hostname.to_owned(), + ); + + local_var_req_builder = local_var_req_builder.json(&migrate_user_password_request); + + let local_var_req = local_var_req_builder.build()?; + let local_var_resp = local_var_client.execute(local_var_req).await?; + + let local_var_status = local_var_resp.status(); + let local_var_content = local_var_resp.text().await?; + + if !local_var_status.is_client_error() && !local_var_status.is_server_error() { + serde_json::from_str(&local_var_content).map_err(Error::from) + } else { + let local_var_entity: Option = + serde_json::from_str(&local_var_content).ok(); + let local_var_error = ResponseContent { + status: local_var_status, + content: local_var_content, + entity: local_var_entity, + }; + Err(Error::ResponseError(local_var_error)) + } +} + pub async fn update_user_email( configuration: &configuration::Configuration, params: UpdateUserEmailParams, diff --git a/src/models/bad_migrate_user_password_request.rs b/src/models/bad_migrate_user_password_request.rs new file mode 100644 index 0000000..c1cd310 --- /dev/null +++ b/src/models/bad_migrate_user_password_request.rs @@ -0,0 +1,31 @@ +/* + * propelauth + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 0.1.0 + * + * Generated by: https://openapi-generator.tech + */ + + + + +#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)] +pub struct BadMigrateUserPasswordRequest { + #[serde(rename = "user_id", skip_serializing_if = "Option::is_none")] + pub user_id: Option>, + #[serde(rename = "password_hash", skip_serializing_if = "Option::is_none")] + pub password_hash: Option>, +} + +impl BadMigrateUserPasswordRequest { + pub fn new() -> BadMigrateUserPasswordRequest { + BadMigrateUserPasswordRequest { + user_id: None, + password_hash: None, + } + } +} + + diff --git a/src/models/migrate_user_password_request.rs b/src/models/migrate_user_password_request.rs new file mode 100644 index 0000000..7dd854e --- /dev/null +++ b/src/models/migrate_user_password_request.rs @@ -0,0 +1,26 @@ +/* + * propelauth + * + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * The version of the OpenAPI document: 0.1.0 + * + * Generated by: https://openapi-generator.tech + */ + +#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)] +pub struct MigrateUserPasswordRequest { + #[serde(rename = "user_id")] + pub user_id: String, + #[serde(rename = "password_hash")] + pub password_hash: String, +} + +impl MigrateUserPasswordRequest { + pub fn new(user_id: String, password_hash: String) -> MigrateUserPasswordRequest { + MigrateUserPasswordRequest { + user_id, + password_hash, + } + } +} diff --git a/src/models/mod.rs b/src/models/mod.rs index 228974c..c8740de 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -24,6 +24,8 @@ pub mod bad_fetch_users_in_org_query; pub use self::bad_fetch_users_in_org_query::BadFetchUsersInOrgQuery; pub mod bad_migrate_user_request; pub use self::bad_migrate_user_request::BadMigrateUserRequest; +pub mod bad_migrate_user_password_request; +pub use self::bad_migrate_user_password_request::BadMigrateUserPasswordRequest; pub mod bad_update_org_request; pub use self::bad_update_org_request::BadUpdateOrgRequest; pub mod bad_update_password_request; @@ -67,6 +69,8 @@ pub mod magic_link; pub use self::magic_link::MagicLink; pub mod migrate_user_request; pub use self::migrate_user_request::MigrateUserRequest; +pub mod migrate_user_password_request; +pub use self::migrate_user_password_request::MigrateUserPasswordRequest; pub mod remove_user_from_org_request; pub use self::remove_user_from_org_request::RemoveUserFromOrgRequest; pub mod subscribe_org_to_role_mapping_request; diff --git a/src/propelauth/errors.rs b/src/propelauth/errors.rs index f5e8bad..99e20e6 100644 --- a/src/propelauth/errors.rs +++ b/src/propelauth/errors.rs @@ -1,7 +1,7 @@ use crate::models::{ BadCreateAccessTokenError, BadCreateMagicLinkRequest, BadCreateOrgRequest, BadCreateUserRequest, BadFetchOrgQuery, BadFetchUsersByQuery, BadFetchUsersInOrgQuery, - BadMigrateUserRequest, BadUpdateOrgRequest, BadUpdatePasswordRequest, + BadMigrateUserRequest, BadMigrateUserPasswordRequest, BadUpdateOrgRequest, BadUpdatePasswordRequest, BadUpdateUserEmailRequest, BadUpdateUserMetadataRequest, }; use thiserror::Error; @@ -183,6 +183,21 @@ pub enum MigrateUserError { UnexpectedException, } +#[derive(Error, Debug, PartialEq, Clone)] +pub enum MigrateUserPasswordError { + #[error("Invalid API Key")] + InvalidApiKey, + + #[error("Rate limited by PropelAuth")] + PropelAuthRateLimit, + + #[error("Bad request")] + BadRequest(BadMigrateUserPasswordRequest), + + #[error("Unexpected exception, please try again")] + UnexpectedException, +} + #[derive(Error, Debug, PartialEq, Clone)] pub enum CreateMagicLinkError { #[error("Invalid API Key")] diff --git a/src/propelauth/user.rs b/src/propelauth/user.rs index 577d77b..90ca8aa 100644 --- a/src/propelauth/user.rs +++ b/src/propelauth/user.rs @@ -4,16 +4,16 @@ use crate::apis::user_service_api::{ DisableUserParams, EnableUserParams, FetchUserByEmailParams, FetchUserByIdParams, FetchUserByUsernameParams, FetchUsersByEmailsError, FetchUsersByEmailsParams, FetchUsersByIdsError, FetchUsersByIdsParams, FetchUsersByQueryError, FetchUsersByQueryParams, - FetchUsersByUsernamesError, FetchUsersByUsernamesParams, MigrateUserParams, + FetchUsersByUsernamesError, FetchUsersByUsernamesParams, MigrateUserParams, MigrateUserPasswordParams, UpdateUserEmailParams, UpdateUserMetadataParams, UpdateUserPasswordParams, }; use crate::models::{ - CreateMagicLinkRequest, CreateUserRequest, CreatedUserResponse, MagicLink, MigrateUserRequest, + CreateMagicLinkRequest, CreateUserRequest, CreatedUserResponse, MagicLink, MigrateUserRequest, MigrateUserPasswordRequest, UserMetadata, UserPagedResponse, }; use crate::propelauth::errors::{ BatchFetchError, ClearPasswordError, CreateMagicLinkError, CreateUserError, ErrorsWithNotFound, - FetchByQueryError, MigrateUserError, ResendEmailConfirmationError, UpdatePasswordError, + FetchByQueryError, MigrateUserError, MigrateUserPasswordError, ResendEmailConfirmationError, UpdatePasswordError, UpdateUserEmailError, UpdateUserMetadataError, }; use crate::propelauth::helpers::{is_valid_id, map_autogenerated_error}; @@ -543,6 +543,35 @@ impl UserService<'_> { }) } + pub async fn migrate_user_password( + &self, + migrate_user_password_request: MigrateUserPasswordRequest, + ) -> Result<(), MigrateUserPasswordError> { + let params = MigrateUserPasswordParams { + migrate_user_password_request, + }; + crate::apis::user_service_api::migrate_user_password(&self.config, params) + .await + .map_err(|err| { + map_autogenerated_error( + err, + MigrateUserPasswordError::UnexpectedException, + |status_code, err_entity| match (status_code.as_u16(), err_entity) { + ( + _, + Some(crate::apis::user_service_api::MigrateUserPasswordError::Status400( + bad_request, + )), + ) => MigrateUserPasswordError::BadRequest(bad_request), + (401, _) => MigrateUserPasswordError::InvalidApiKey, + (429, _) => MigrateUserPasswordError::PropelAuthRateLimit, + _ => MigrateUserPasswordError::UnexpectedException, + }, + ) + })?; + Ok(()) + } + pub async fn create_magic_link( &self, create_magic_link_request: CreateMagicLinkRequest,