collab: Update user email and name when signing in (#24694)
This PR updates the `GET /user` endpoint to update the user's email and name from the provided GitHub profile information on sign-in. Currently, these fields were only set when the user was first created. Release Notes: - N/A
This commit is contained in:
parent
a2592a3a37
commit
7da913c801
1 changed files with 43 additions and 18 deletions
|
@ -133,26 +133,23 @@ impl Database {
|
||||||
initial_channel_id: Option<ChannelId>,
|
initial_channel_id: Option<ChannelId>,
|
||||||
tx: &DatabaseTransaction,
|
tx: &DatabaseTransaction,
|
||||||
) -> Result<User> {
|
) -> Result<User> {
|
||||||
if let Some(user_by_github_user_id) = user::Entity::find()
|
if let Some(existing_user) = self
|
||||||
.filter(user::Column::GithubUserId.eq(github_user_id))
|
.get_user_by_github_user_id_or_github_login(github_user_id, github_login, tx)
|
||||||
.one(tx)
|
|
||||||
.await?
|
.await?
|
||||||
{
|
{
|
||||||
let mut user_by_github_user_id = user_by_github_user_id.into_active_model();
|
let mut existing_user = existing_user.into_active_model();
|
||||||
user_by_github_user_id.github_login = ActiveValue::set(github_login.into());
|
existing_user.github_login = ActiveValue::set(github_login.into());
|
||||||
user_by_github_user_id.github_user_created_at =
|
existing_user.github_user_created_at = ActiveValue::set(Some(github_user_created_at));
|
||||||
ActiveValue::set(Some(github_user_created_at));
|
|
||||||
Ok(user_by_github_user_id.update(tx).await?)
|
if let Some(github_email) = github_email {
|
||||||
} else if let Some(user_by_github_login) = user::Entity::find()
|
existing_user.email_address = ActiveValue::set(Some(github_email.into()));
|
||||||
.filter(user::Column::GithubLogin.eq(github_login))
|
}
|
||||||
.one(tx)
|
|
||||||
.await?
|
if let Some(github_name) = github_name {
|
||||||
{
|
existing_user.name = ActiveValue::set(Some(github_name.into()));
|
||||||
let mut user_by_github_login = user_by_github_login.into_active_model();
|
}
|
||||||
user_by_github_login.github_user_id = ActiveValue::set(github_user_id);
|
|
||||||
user_by_github_login.github_user_created_at =
|
Ok(existing_user.update(tx).await?)
|
||||||
ActiveValue::set(Some(github_user_created_at));
|
|
||||||
Ok(user_by_github_login.update(tx).await?)
|
|
||||||
} else {
|
} else {
|
||||||
let user = user::Entity::insert(user::ActiveModel {
|
let user = user::Entity::insert(user::ActiveModel {
|
||||||
email_address: ActiveValue::set(github_email.map(|email| email.into())),
|
email_address: ActiveValue::set(github_email.map(|email| email.into())),
|
||||||
|
@ -183,6 +180,34 @@ impl Database {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Tries to retrieve a user, first by their GitHub user ID, and then by their GitHub login.
|
||||||
|
///
|
||||||
|
/// Returns `None` if a user is not found with this GitHub user ID or GitHub login.
|
||||||
|
pub async fn get_user_by_github_user_id_or_github_login(
|
||||||
|
&self,
|
||||||
|
github_user_id: i32,
|
||||||
|
github_login: &str,
|
||||||
|
tx: &DatabaseTransaction,
|
||||||
|
) -> Result<Option<User>> {
|
||||||
|
if let Some(user_by_github_user_id) = user::Entity::find()
|
||||||
|
.filter(user::Column::GithubUserId.eq(github_user_id))
|
||||||
|
.one(tx)
|
||||||
|
.await?
|
||||||
|
{
|
||||||
|
return Ok(Some(user_by_github_user_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(user_by_github_login) = user::Entity::find()
|
||||||
|
.filter(user::Column::GithubLogin.eq(github_login))
|
||||||
|
.one(tx)
|
||||||
|
.await?
|
||||||
|
{
|
||||||
|
return Ok(Some(user_by_github_login));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(None)
|
||||||
|
}
|
||||||
|
|
||||||
/// get_all_users returns the next page of users. To get more call again with
|
/// get_all_users returns the next page of users. To get more call again with
|
||||||
/// the same limit and the page incremented by 1.
|
/// the same limit and the page incremented by 1.
|
||||||
pub async fn get_all_users(&self, page: u32, limit: u32) -> Result<Vec<User>> {
|
pub async fn get_all_users(&self, page: u32, limit: u32) -> Result<Vec<User>> {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue