Fix error when loading users without github user ids from the db

This commit is contained in:
Max Brunsfeld 2022-09-21 10:20:11 -07:00
parent 20ec933e23
commit 7a049f1404
3 changed files with 28 additions and 17 deletions

View file

@ -11,7 +11,7 @@ mod db;
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
struct GitHubUser { struct GitHubUser {
id: usize, id: i32,
login: String, login: String,
email: Option<String>, email: Option<String>,
} }
@ -26,8 +26,11 @@ async fn main() {
let github_token = std::env::var("GITHUB_TOKEN").expect("missing GITHUB_TOKEN env var"); let github_token = std::env::var("GITHUB_TOKEN").expect("missing GITHUB_TOKEN env var");
let client = reqwest::Client::new(); let client = reqwest::Client::new();
let current_user = let mut current_user =
fetch_github::<GitHubUser>(&client, &github_token, "https://api.github.com/user").await; fetch_github::<GitHubUser>(&client, &github_token, "https://api.github.com/user").await;
current_user
.email
.get_or_insert_with(|| "placeholder@example.com".to_string());
let staff_users = fetch_github::<Vec<GitHubUser>>( let staff_users = fetch_github::<Vec<GitHubUser>>(
&client, &client,
&github_token, &github_token,
@ -64,16 +67,24 @@ async fn main() {
let mut zed_user_ids = Vec::<UserId>::new(); let mut zed_user_ids = Vec::<UserId>::new();
for (github_user, admin) in zed_users { for (github_user, admin) in zed_users {
if let Some(user) = db if let Some(user) = db
.get_user_by_github_login(&github_user.login) .get_user_by_github_account(&github_user.login, Some(github_user.id))
.await .await
.expect("failed to fetch user") .expect("failed to fetch user")
{ {
zed_user_ids.push(user.id); zed_user_ids.push(user.id);
} else { } else if let Some(email) = &github_user.email {
zed_user_ids.push( zed_user_ids.push(
db.create_user(&github_user.login, github_user.email.as_deref(), admin) db.create_user(
.await email,
.expect("failed to insert user"), admin,
db::NewUserParams {
github_login: github_user.login,
github_user_id: github_user.id,
invite_count: 5,
},
)
.await
.expect("failed to insert user"),
); );
} }
} }

View file

@ -1563,7 +1563,7 @@ id_type!(UserId);
pub struct User { pub struct User {
pub id: UserId, pub id: UserId,
pub github_login: String, pub github_login: String,
pub github_user_id: i32, pub github_user_id: Option<i32>,
pub email_address: Option<String>, pub email_address: Option<String>,
pub admin: bool, pub admin: bool,
pub invite_code: Option<String>, pub invite_code: Option<String>,
@ -1795,7 +1795,7 @@ mod test {
User { User {
id: user_id, id: user_id,
github_login: params.github_login, github_login: params.github_login,
github_user_id: params.github_user_id, github_user_id: Some(params.github_user_id),
email_address: Some(email_address.to_string()), email_address: Some(email_address.to_string()),
admin, admin,
invite_code: None, invite_code: None,
@ -1838,12 +1838,12 @@ mod test {
self.background.simulate_random_delay().await; self.background.simulate_random_delay().await;
if let Some(github_user_id) = github_user_id { if let Some(github_user_id) = github_user_id {
for user in self.users.lock().values_mut() { for user in self.users.lock().values_mut() {
if user.github_user_id == github_user_id { if user.github_user_id == Some(github_user_id) {
user.github_login = github_login.into(); user.github_login = github_login.into();
return Ok(Some(user.clone())); return Ok(Some(user.clone()));
} }
if user.github_login == github_login { if user.github_login == github_login {
user.github_user_id = github_user_id; user.github_user_id = Some(github_user_id);
return Ok(Some(user.clone())); return Ok(Some(user.clone()));
} }
} }

View file

@ -69,7 +69,7 @@ async fn test_get_users_by_ids() {
User { User {
id: user1, id: user1,
github_login: "u1".to_string(), github_login: "u1".to_string(),
github_user_id: 1, github_user_id: Some(1),
email_address: Some("u1@example.com".to_string()), email_address: Some("u1@example.com".to_string()),
admin: false, admin: false,
..Default::default() ..Default::default()
@ -77,7 +77,7 @@ async fn test_get_users_by_ids() {
User { User {
id: user2, id: user2,
github_login: "u2".to_string(), github_login: "u2".to_string(),
github_user_id: 2, github_user_id: Some(2),
email_address: Some("u2@example.com".to_string()), email_address: Some("u2@example.com".to_string()),
admin: false, admin: false,
..Default::default() ..Default::default()
@ -85,7 +85,7 @@ async fn test_get_users_by_ids() {
User { User {
id: user3, id: user3,
github_login: "u3".to_string(), github_login: "u3".to_string(),
github_user_id: 3, github_user_id: Some(3),
email_address: Some("u3@example.com".to_string()), email_address: Some("u3@example.com".to_string()),
admin: false, admin: false,
..Default::default() ..Default::default()
@ -93,7 +93,7 @@ async fn test_get_users_by_ids() {
User { User {
id: user4, id: user4,
github_login: "u4".to_string(), github_login: "u4".to_string(),
github_user_id: 4, github_user_id: Some(4),
email_address: Some("u4@example.com".to_string()), email_address: Some("u4@example.com".to_string()),
admin: false, admin: false,
..Default::default() ..Default::default()
@ -142,7 +142,7 @@ async fn test_get_user_by_github_account() {
.unwrap(); .unwrap();
assert_eq!(user.id, user_id1); assert_eq!(user.id, user_id1);
assert_eq!(&user.github_login, "login1"); assert_eq!(&user.github_login, "login1");
assert_eq!(user.github_user_id, 101); assert_eq!(user.github_user_id, Some(101));
assert!(db assert!(db
.get_user_by_github_account("non-existent-login", None) .get_user_by_github_account("non-existent-login", None)
@ -157,7 +157,7 @@ async fn test_get_user_by_github_account() {
.unwrap(); .unwrap();
assert_eq!(user.id, user_id2); assert_eq!(user.id, user_id2);
assert_eq!(&user.github_login, "the-new-login2"); assert_eq!(&user.github_login, "the-new-login2");
assert_eq!(user.github_user_id, 102); assert_eq!(user.github_user_id, Some(102));
} }
} }