feat(db): Add LookupOrCreateUser message

Adds a message to look up a user in the database based on their email
address. If the user does not exist, it is created.
This commit is contained in:
Vincent Ambo 2018-05-01 21:37:37 +02:00 committed by Vincent Ambo
parent 1e57b879fb
commit 095293e8e3
2 changed files with 50 additions and 0 deletions

View file

@ -52,6 +52,49 @@ impl Handler<ListThreads> for DbExecutor {
}
}
/// Message used to look up a user based on their email-address. If
/// the user does not exist, it is created.
pub struct LookupOrCreateUser {
pub email: String,
pub name: String,
}
message!(LookupOrCreateUser, Result<User>);
impl Handler<LookupOrCreateUser> for DbExecutor {
type Result = <LookupOrCreateUser as Message>::Result;
fn handle(&mut self,
msg: LookupOrCreateUser,
_: &mut Self::Context) -> Self::Result {
use schema::users;
use schema::users::dsl::*;
let conn = self.0.get()?;
let opt_user = users
.filter(email.eq(&msg.email))
.first(&conn).optional()?;
if let Some(user) = opt_user {
Ok(user)
} else {
let new_user = NewUser {
email: msg.email,
name: msg.name,
};
let user: User = diesel::insert_into(users::table)
.values(&new_user)
.get_result(&conn)?;
info!("Created new user {} with ID {}", new_user.email, user.id);
Ok(user)
}
}
}
/// Message used to fetch a specific thread. Returns the thread and
/// its posts.
pub struct GetThread(pub i32);

View file

@ -88,6 +88,13 @@ pub struct NewThread {
pub user_id: i32,
}
#[derive(Deserialize, Insertable)]
#[table_name="users"]
pub struct NewUser {
pub email: String,
pub name: String,
}
#[derive(Deserialize, Insertable)]
#[table_name="posts"]
pub struct NewPost {