use crate::{
core::{
error::LarkAPIError,
validation::{validate_and_sanitize_password, ValidateBuilder, ValidationResult},
SDKResult,
},
service::admin::models::PasswordResetRequest,
};
#[derive(Debug, Clone, Default)]
pub struct PasswordResetRequestBuilder {
request: PasswordResetRequest,
}
impl PasswordResetRequestBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn user_id(mut self, user_id: impl ToString) -> Self {
self.request.user_id = user_id.to_string();
self
}
pub fn password(mut self, password: impl ToString) -> Self {
self.request.password = password.to_string();
self
}
pub fn build(self) -> SDKResult<PasswordResetRequest> {
if self.request.user_id.is_empty() {
return Err(LarkAPIError::illegal_param(
"user_id is required".to_string(),
));
}
let (sanitized_password, validation_result) =
validate_and_sanitize_password(self.request.password, "password");
match validation_result {
ValidationResult::Valid => {
Ok(PasswordResetRequest {
user_id: self.request.user_id,
password: sanitized_password,
})
}
ValidationResult::Warning(msg) => {
log::warn!("Password validation warning: {}", msg);
Ok(PasswordResetRequest {
user_id: self.request.user_id,
password: sanitized_password,
})
}
ValidationResult::Invalid(msg) => {
Err(LarkAPIError::illegal_param(format!(
"Invalid password: {}",
msg
)))
}
}
}
}
impl ValidateBuilder for PasswordResetRequestBuilder {
fn validate(&self) -> ValidationResult {
if self.request.user_id.is_empty() {
return ValidationResult::Invalid("user_id is required".to_string());
}
validate_and_sanitize_password(self.request.password.clone(), "password").1
}
}
#[cfg(test)]
#[allow(unused_variables, unused_unsafe)]
mod tests {
use super::*;
#[test]
fn test_password_reset_request_builder_valid() {
let builder = PasswordResetRequestBuilder::new()
.user_id("test_user_id")
.password("SecurePass123!");
let result = builder.build();
assert!(result.is_ok());
let request = result.unwrap();
assert_eq!(request.user_id, "test_user_id");
assert_eq!(request.password, "SecurePass123!");
}
#[test]
fn test_password_reset_request_builder_invalid_password() {
let builder = PasswordResetRequestBuilder::new()
.user_id("test_user_id")
.password("weak");
let result = builder.build();
assert!(result.is_err());
}
#[test]
fn test_password_reset_request_builder_missing_user_id() {
let builder = PasswordResetRequestBuilder::new().password("SecurePass123!");
let result = builder.build();
assert!(result.is_err());
}
#[test]
fn test_password_sanitization() {
let builder = PasswordResetRequestBuilder::new()
.user_id("test_user_id")
.password(" SecurePass123! ");
let result = builder.build();
assert!(result.is_ok());
let request = result.unwrap();
assert_eq!(request.password, "SecurePass123!"); }
#[test]
fn test_validate_builder_trait() {
let builder = PasswordResetRequestBuilder::new()
.user_id("test_user_id")
.password("SecurePass123!");
assert!(builder.validate().is_valid());
let invalid_builder = PasswordResetRequestBuilder::new()
.user_id("test_user_id")
.password("weak");
assert!(!invalid_builder.validate().is_valid());
}
}