commit 4559255a840fe7ca7833b337b208af6baa42fbae
parent 76ec658906e231b9c015321ceb5f22efb8284fe5
Author: Jackson G. Kaindume <seestem@merely.tech>
Date: Mon, 29 Aug 2022 11:34:36 +0200
[phora] remove registration input validation from Account to RegistrationData
Diffstat:
3 files changed, 46 insertions(+), 29 deletions(-)
diff --git a/phora/src/account.rs b/phora/src/account.rs
@@ -1,4 +1,5 @@
-use crate::validate::{Validate, ValidationError};
+use crate::data::RegistrationData;
+use crate::validate::ValidationError;
/// An account
pub struct Account {
@@ -11,37 +12,17 @@ pub struct Account {
}
impl Account {
- /// Register new user
- pub fn register(
- username: &str,
- password: &str,
- email: Option<&str>,
- ) -> Result<Self, ValidationError> {
- let mut validated_email: Option<String> = None;
+ /// Create new account
+ pub fn create(payload: RegistrationData) -> Result<Self, ValidationError> {
+ payload.is_valid()?;
- if !Validate::username(username) {
- return Err(ValidationError::Username);
- }
-
- if !Validate::password(password) {
- return Err(ValidationError::Email);
- }
-
- if let Some(email) = email {
- if !Validate::email(email) {
- return Err(ValidationError::Email);
- }
- validated_email = Some(email.to_string());
-
- // TODO: email verification code
- }
-
- // TODO: database registration code
+ // TODO: email verification
+ // TODO: database registration
Ok(Account {
- username: username.to_string(),
- email: validated_email,
- password: password.to_string(),
+ username: payload.username,
+ email: payload.email,
+ password: payload.password,
})
}
}
diff --git a/phora/src/data.rs b/phora/src/data.rs
@@ -0,0 +1,35 @@
+use crate::validate::{Validate, ValidationError};
+use serde::Deserialize;
+
+/// User registration Data
+#[derive(Deserialize)]
+pub struct RegistrationData {
+ pub username: String,
+ pub password: String,
+ pub retyped_password: String,
+ pub email: Option<String>,
+}
+
+impl RegistrationData {
+ pub fn is_valid(&self) -> Result<(), ValidationError> {
+ if self.password != self.retyped_password {
+ return Err(ValidationError::Password);
+ }
+
+ if !Validate::username(&self.username) {
+ return Err(ValidationError::Username);
+ }
+
+ if !Validate::password(&self.password) {
+ return Err(ValidationError::Password);
+ }
+
+ if let Some(email) = &self.email {
+ if !Validate::email(email) {
+ return Err(ValidationError::Email);
+ }
+ }
+
+ Ok(())
+ }
+}
diff --git a/phora/src/lib.rs b/phora/src/lib.rs
@@ -1,3 +1,4 @@
mod account;
mod crypto;
+mod data;
mod validate;