пароль на семьи
This commit is contained in:
@@ -1,18 +1,44 @@
|
||||
use sea_orm::*;
|
||||
use argon2::{
|
||||
password_hash::{rand_core::OsRng, PasswordHasher, SaltString, PasswordVerifier, PasswordHash},
|
||||
Argon2,
|
||||
};
|
||||
use crate::models::family::{self, Entity as Family, Model as FamilyModel};
|
||||
|
||||
pub struct FamilyService;
|
||||
|
||||
impl FamilyService {
|
||||
pub async fn create(db: &DatabaseConnection, name: String) -> Result<FamilyModel, DbErr> {
|
||||
pub async fn create(db: &DatabaseConnection, name: String, password: String) -> Result<FamilyModel, DbErr> {
|
||||
let salt = SaltString::generate(&mut OsRng);
|
||||
let argon2 = Argon2::default();
|
||||
let password_hash = argon2
|
||||
.hash_password(password.as_bytes(), &salt)
|
||||
.map_err(|_| DbErr::Custom("Failed to hash password".to_string()))?
|
||||
.to_string();
|
||||
|
||||
let family = family::ActiveModel {
|
||||
name: Set(name),
|
||||
password_hash: Set(password_hash),
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
family.insert(db).await
|
||||
}
|
||||
|
||||
pub async fn verify_password(db: &DatabaseConnection, id: i32, password: String) -> Result<bool, DbErr> {
|
||||
let family = Family::find_by_id(id)
|
||||
.one(db)
|
||||
.await?
|
||||
.ok_or(DbErr::RecordNotFound("Family not found".to_string()))?;
|
||||
|
||||
let parsed_hash = PasswordHash::new(&family.password_hash)
|
||||
.map_err(|_| DbErr::Custom("Invalid password hash".to_string()))?;
|
||||
|
||||
Ok(Argon2::default()
|
||||
.verify_password(password.as_bytes(), &parsed_hash)
|
||||
.is_ok())
|
||||
}
|
||||
|
||||
pub async fn find_by_id(db: &DatabaseConnection, id: i32) -> Result<Option<FamilyModel>, DbErr> {
|
||||
Family::find_by_id(id).one(db).await
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user