Add communication with user actor
This commit is contained in:
@ -1,7 +1,21 @@
|
||||
use actix::{Actor, Context};
|
||||
use actix::{Actor, Context, Handler, Message, MessageResult};
|
||||
|
||||
use crate::data::entity_manager::EntityManager;
|
||||
use crate::data::user::User;
|
||||
use crate::data::user::{User, verify_password};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum LoginResult {
|
||||
AccountNotFound,
|
||||
InvalidPassword,
|
||||
Success(User),
|
||||
}
|
||||
|
||||
#[derive(Message)]
|
||||
#[rtype(LoginResult)]
|
||||
pub struct LoginRequest {
|
||||
pub login: String,
|
||||
pub password: String,
|
||||
}
|
||||
|
||||
pub struct UsersActor {
|
||||
manager: EntityManager<User>,
|
||||
@ -15,4 +29,21 @@ impl UsersActor {
|
||||
|
||||
impl Actor for UsersActor {
|
||||
type Context = Context<Self>;
|
||||
}
|
||||
|
||||
impl Handler<LoginRequest> for UsersActor {
|
||||
type Result = MessageResult<LoginRequest>;
|
||||
|
||||
fn handle(&mut self, msg: LoginRequest, _ctx: &mut Self::Context) -> Self::Result {
|
||||
match self.manager.find_by_username_or_email(&msg.login) {
|
||||
None => MessageResult(LoginResult::AccountNotFound),
|
||||
Some(user) => {
|
||||
if !verify_password(msg.password, &user.password) {
|
||||
return MessageResult(LoginResult::InvalidPassword);
|
||||
}
|
||||
|
||||
MessageResult(LoginResult::Success(user))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user