use super::defaults::*;
use crate::Permissions;
use crate::UserStatus;
use crate::Validatable;
use crate::error::IggyError;
use secrecy::{ExposeSecret, SecretString};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CreateUser {
pub username: String,
#[serde(serialize_with = "crate::utils::serde_secret::serialize_secret")]
pub password: SecretString,
pub status: UserStatus,
pub permissions: Option<Permissions>,
}
impl Default for CreateUser {
fn default() -> Self {
CreateUser {
username: "user".to_string(),
password: SecretString::from("secret"),
status: UserStatus::Active,
permissions: None,
}
}
}
impl Validatable<IggyError> for CreateUser {
fn validate(&self) -> Result<(), IggyError> {
if self.username.is_empty()
|| self.username.len() > MAX_USERNAME_LENGTH
|| self.username.len() < MIN_USERNAME_LENGTH
{
return Err(IggyError::InvalidUsername);
}
let password = self.password.expose_secret();
if password.is_empty()
|| password.len() > MAX_PASSWORD_LENGTH
|| password.len() < MIN_PASSWORD_LENGTH
{
return Err(IggyError::InvalidPassword);
}
Ok(())
}
}