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:
parent
1e57b879fb
commit
095293e8e3
2 changed files with 50 additions and 0 deletions
43
src/db.rs
43
src/db.rs
|
@ -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);
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue