|
|
@@ -1,9 +1,10 @@
|
|
|
use actix_web::{HttpResponse, web, post};
|
|
|
-use serde::Serialize;
|
|
|
+use serde::Deserialize;
|
|
|
use serde_json::json;
|
|
|
use sqlx::PgPool;
|
|
|
use email_address::EmailAddress;
|
|
|
use uuid::Uuid;
|
|
|
+use chrono::{DateTime, Utc, Duration};
|
|
|
use argon2::{
|
|
|
Argon2,
|
|
|
password_hash::{
|
|
|
@@ -17,7 +18,7 @@ use crate::{
|
|
|
models::user::User
|
|
|
};
|
|
|
|
|
|
-#[derive(Serialize)]
|
|
|
+#[derive(Deserialize)]
|
|
|
struct Body {
|
|
|
name: String,
|
|
|
email: String,
|
|
|
@@ -27,6 +28,7 @@ struct Body {
|
|
|
time: Option<String>,
|
|
|
}
|
|
|
|
|
|
+#[post("/user")]
|
|
|
pub async fn route(
|
|
|
db: web::Data<PgPool>,
|
|
|
body: web::Json<Body>
|
|
|
@@ -35,17 +37,17 @@ pub async fn route(
|
|
|
return Ok(HttpResponse::Ok().json(json!({"success": true})));
|
|
|
}
|
|
|
valid_password(&body.password, &body.confirm_password)?;
|
|
|
- let pass_hash = hash_password(body.password)?;
|
|
|
- let email = validate_email(body.email)?;
|
|
|
+ let pass_hash = hash_password(&body.password)?;
|
|
|
+ let email = validate_email(&body.email)?;
|
|
|
let user = create_user(body.into_inner(), email, pass_hash);
|
|
|
user.insert(&db).await?;
|
|
|
- Ok(HttpResponse::Ok(user.response_user()))
|
|
|
+ Ok(HttpResponse::Ok().json(user.response_user()))
|
|
|
}
|
|
|
|
|
|
fn is_bot(url: &Option<String>, time: &Option<String>) -> bool {
|
|
|
match url {
|
|
|
Some(u) => {
|
|
|
- if url != "https://" {return true}
|
|
|
+ if u != "https://" {return true}
|
|
|
},
|
|
|
None => {return true}
|
|
|
}
|
|
|
@@ -72,9 +74,11 @@ fn valid_password(pass: &String, confirm_pass: &String) -> Result<(), AppError>
|
|
|
if pass.chars().count() < 12 {
|
|
|
return Err(AppError::invalid_input("Password must contain at least 12 characters"));
|
|
|
}
|
|
|
+
|
|
|
+ Ok(())
|
|
|
}
|
|
|
|
|
|
-fn validate_email(email: String) -> Result<String, AppError> {
|
|
|
+fn validate_email(email: &String) -> Result<String, AppError> {
|
|
|
if !EmailAddress::is_valid(email) {
|
|
|
return Err(AppError::invalid_input("Invalid email address"));
|
|
|
}
|
|
|
@@ -82,12 +86,12 @@ fn validate_email(email: String) -> Result<String, AppError> {
|
|
|
Ok(email.to_lowercase())
|
|
|
}
|
|
|
|
|
|
-fn hash_password(pass: String) -> Result<String, AppError> {
|
|
|
+fn hash_password(pass: &String) -> Result<String, AppError> {
|
|
|
let salt = SaltString::generate(&mut OsRng);
|
|
|
let argon2 = Argon2::default();
|
|
|
match argon2.hash_password(pass.as_bytes(), &salt) {
|
|
|
Ok(h) => Ok(h.to_string()),
|
|
|
- Err(_) => Err(AppError::InternalError)
|
|
|
+ Err(e) => Err(AppError::InternalError(e.to_string()))
|
|
|
}
|
|
|
}
|
|
|
|