use quokka::{helper::database::BaseRepository, state::FromState};
use crate::entity::user::{User, UserRepository};
#[derive(Clone, FromState)]
pub struct UserService {
user_repository: UserRepository,
}
pub struct UserRegistration {
pub username: String,
pub password: String,
pub email: String,
}
impl UserService {
pub async fn register_user(
&self,
UserRegistration {
username,
mut password,
email,
}: UserRegistration,
) -> quokka::Result<User> {
use argon2::PasswordHasher;
let salt = argon2::password_hash::SaltString::generate(
&mut argon2::password_hash::rand_core::OsRng,
);
password = argon2::Argon2::default()
.hash_password(password.as_bytes(), &salt)
.map_err(quokka::Error::wrap_error("Unable to hash password", 500))?
.to_string();
self.user_repository
.create_entity(User {
id: -1,
username,
password,
email,
created_at: time::OffsetDateTime::now_utc(),
updated_at: time::OffsetDateTime::now_utc(),
})
.await
}
}