diff options
-rw-r--r-- | src/db.rs | 43 | ||||
-rw-r--r-- | src/models.rs | 7 |
2 files changed, 50 insertions, 0 deletions
diff --git a/src/db.rs b/src/db.rs index a04b3382447a..bfbdd193c4c7 100644 --- a/src/db.rs +++ b/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); diff --git a/src/models.rs b/src/models.rs index 5c7bbb12d36a..3ad4a5ed9d7d 100644 --- a/src/models.rs +++ b/src/models.rs @@ -89,6 +89,13 @@ pub struct NewThread { } #[derive(Deserialize, Insertable)] +#[table_name="users"] +pub struct NewUser { + pub email: String, + pub name: String, +} + +#[derive(Deserialize, Insertable)] #[table_name="posts"] pub struct NewPost { pub thread_id: i32, |