Skip to content

Commit

Permalink
fix: combine involved-in and review-requested searches
Browse files Browse the repository at this point in the history
  • Loading branch information
Ben Nagy committed May 1, 2024
1 parent 32c6957 commit 45ebe4f
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 15 deletions.
2 changes: 1 addition & 1 deletion src/components/pull_request_list.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,11 +71,11 @@ impl PullRequestList {
tokio::spawn(async move {
if username.is_empty() {
tx.send(Action::GetCurrentUser)?;
tx.send(Action::GetRepos)?;
}

match GraphQLGithubClient::get_pull_requests(username).await {
Ok(pull_requests) => tx.send(Action::GetReposResult(pull_requests)),
// TODO: handle case when the PAT token is invalid or expired
Err(err) => tx.send(Action::Error(err.to_string())),
}
});
Expand Down
73 changes: 59 additions & 14 deletions src/github/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use color_eyre::{
};
use graphql_client::GraphQLQuery;
use octocrab::Octocrab;
use tracing::debug;

use crate::{
action::Action,
Expand All @@ -27,20 +28,61 @@ impl GithubClient for GraphQLGithubClient {
}

async fn get_pull_requests(username: String) -> Result<Vec<PullRequest>> {
let token = std::env::var("GITHUB_TOKEN").expect("GITHUB_TOKEN must be set");
let oc = Octocrab::builder().personal_token(token).build().expect("Failed to create Octocrab client");
let username2 = username.clone();
let t1 = tokio::spawn(async move {
let token = std::env::var("GITHUB_TOKEN").expect("GITHUB_TOKEN must be set");
let oc = Octocrab::builder().personal_token(token).build().expect("Failed to create Octocrab client");
let response: graphql_client::Response<pull_requests_query::ResponseData> = oc
.graphql(&PullRequestsQuery::build_query(pull_requests_query::Variables {
first: 20,
query: format!("is:pr involves:{} state:open", username),
}))
.await
.expect("Failed to get pull requests (involves)");
response
});

let t2 = tokio::spawn(async move {
let token = std::env::var("GITHUB_TOKEN").expect("GITHUB_TOKEN must be set");
let oc = Octocrab::builder().personal_token(token).build().expect("Failed to create Octocrab client");
let response: graphql_client::Response<pull_requests_query::ResponseData> = oc
.graphql(&PullRequestsQuery::build_query(pull_requests_query::Variables {
first: 20,
query: format!("is:pr review-requested:{} state:open", username2),
}))
.await
.expect("Failed to get pull requests (review-requested)");
response
});

let pr_involves = t1.await?;
let pr_review_requested = t2.await?;

let r1 = pr_involves
.data
.ok_or(eyre!("Response data is empty"))?
.search
.edges
.ok_or(eyre!("Search data is empty"))?;
let r2 = pr_review_requested
.data
.ok_or(eyre!("Response data is empty"))?
.search
.edges
.ok_or(eyre!("Search data is empty"))?;

let pull_requests_involves: Vec<PullRequest> = r1
.iter()
.map(|v: &Option<pull_requests_query::PullRequestsQuerySearchEdges>| {
let inner = v.as_ref().unwrap().node.as_ref().unwrap();
match inner {
pull_requests_query::PullRequestsQuerySearchEdgesNode::PullRequest(pr) => pr.into(),
_ => panic!("Unexpected node type: {:?}", inner),
}
})
.collect();

let response: graphql_client::Response<pull_requests_query::ResponseData> = oc
.graphql(&PullRequestsQuery::build_query(pull_requests_query::Variables {
first: 10,
query: format!("is:pr involves:{} state:open", username),
}))
.await?;

log::debug!("{:#?}", response);
let r =
response.data.ok_or(eyre!("Response data is empty"))?.search.edges.ok_or(eyre!("Search data is empty"))?;
let pull_requests: Vec<PullRequest> = r
let pull_requests_review_requested: Vec<PullRequest> = r2
.iter()
.map(|v: &Option<pull_requests_query::PullRequestsQuerySearchEdges>| {
let inner = v.as_ref().unwrap().node.as_ref().unwrap();
Expand All @@ -50,6 +92,9 @@ impl GithubClient for GraphQLGithubClient {
}
})
.collect();
Ok(pull_requests)

let pull_requests =
pull_requests_involves.into_iter().chain(pull_requests_review_requested.into_iter()).collect();
Ok((pull_requests))
}
}

0 comments on commit 45ebe4f

Please sign in to comment.