Add pull request and repository browsing
This commit is contained in:
170
crates/app/src/api.rs
Normal file
170
crates/app/src/api.rs
Normal file
@@ -0,0 +1,170 @@
|
||||
use gotcha_gitea::{Client, apis, models};
|
||||
|
||||
use crate::{
|
||||
domain::{HomeData, RepositoryData, Server},
|
||||
view::compact_date,
|
||||
};
|
||||
|
||||
pub async fn load_repositories(server: &Server) -> Result<Vec<RepositoryData>, String> {
|
||||
let client =
|
||||
Client::new(&server.url, Some(&server.token)).map_err(|error| error.to_string())?;
|
||||
let configuration = client.configuration();
|
||||
let user = client
|
||||
.current_user()
|
||||
.await
|
||||
.map_err(|error| error.to_string())?;
|
||||
let login = user.login.unwrap_or_default();
|
||||
let repositories = apis::user_api::user_current_list_repos(&configuration, Some(1), Some(100))
|
||||
.await
|
||||
.map_err(|error| error.to_string())?;
|
||||
Ok(repositories
|
||||
.into_iter()
|
||||
.filter(|repository| {
|
||||
repository
|
||||
.owner
|
||||
.as_ref()
|
||||
.and_then(|owner| owner.login.as_deref())
|
||||
== Some(login.as_str())
|
||||
})
|
||||
.filter_map(|repository| {
|
||||
Some(RepositoryData {
|
||||
owner: repository.owner?.login?,
|
||||
name: repository.name?,
|
||||
description: repository
|
||||
.description
|
||||
.filter(|text| !text.is_empty())
|
||||
.unwrap_or_else(|| "No description".into()),
|
||||
language: repository
|
||||
.language
|
||||
.filter(|text| !text.is_empty())
|
||||
.unwrap_or_else(|| "Unknown language".into()),
|
||||
open_issues: repository.open_issues_count.unwrap_or_default(),
|
||||
updated: compact_date(repository.updated_at.as_deref()),
|
||||
})
|
||||
})
|
||||
.collect())
|
||||
}
|
||||
|
||||
pub async fn load_issues(
|
||||
server: &Server,
|
||||
owner: &str,
|
||||
repository: &str,
|
||||
status: &str,
|
||||
) -> Result<Vec<models::Issue>, String> {
|
||||
let client =
|
||||
Client::new(&server.url, Some(&server.token)).map_err(|error| error.to_string())?;
|
||||
apis::issue_api::issue_list_issues(
|
||||
&client.configuration(),
|
||||
owner,
|
||||
repository,
|
||||
Some(status),
|
||||
None,
|
||||
None,
|
||||
Some("issues"),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
Some(1),
|
||||
Some(100),
|
||||
)
|
||||
.await
|
||||
.map_err(|error| error.to_string())
|
||||
}
|
||||
|
||||
pub async fn load_pulls(server: &Server, status: &str) -> Result<Vec<models::Issue>, String> {
|
||||
let client =
|
||||
Client::new(&server.url, Some(&server.token)).map_err(|error| error.to_string())?;
|
||||
let configuration = client.configuration();
|
||||
let owner = client
|
||||
.current_user()
|
||||
.await
|
||||
.map_err(|error| error.to_string())?
|
||||
.login
|
||||
.ok_or("The server account has no username.")?;
|
||||
let mut pulls = Vec::new();
|
||||
for page in 1.. {
|
||||
let batch = apis::issue_api::issue_search_issues(
|
||||
&configuration,
|
||||
Some(status),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
Some("pulls"),
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
Some(&owner),
|
||||
None,
|
||||
Some(page),
|
||||
Some(100),
|
||||
)
|
||||
.await
|
||||
.map_err(|error| error.to_string())?;
|
||||
if batch.is_empty() {
|
||||
break;
|
||||
}
|
||||
pulls.extend(batch);
|
||||
}
|
||||
Ok(pulls)
|
||||
}
|
||||
|
||||
pub async fn load_commits(
|
||||
server: &Server,
|
||||
owner: &str,
|
||||
repository: &str,
|
||||
) -> Result<Vec<models::Commit>, String> {
|
||||
let client =
|
||||
Client::new(&server.url, Some(&server.token)).map_err(|error| error.to_string())?;
|
||||
apis::repository_api::repo_get_all_commits(
|
||||
&client.configuration(),
|
||||
owner,
|
||||
repository,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
None,
|
||||
Some(false),
|
||||
Some(1),
|
||||
Some(100),
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.map_err(|error| error.to_string())
|
||||
}
|
||||
|
||||
pub async fn load_home(server: &Server) -> Result<HomeData, String> {
|
||||
let client =
|
||||
Client::new(&server.url, Some(&server.token)).map_err(|error| error.to_string())?;
|
||||
let configuration = client.configuration();
|
||||
let login = client
|
||||
.current_user()
|
||||
.await
|
||||
.map_err(|error| error.to_string())?
|
||||
.login
|
||||
.ok_or("The server account has no username.")?;
|
||||
let (activities, heatmap) = tokio::join!(
|
||||
apis::user_api::user_list_activity_feeds(
|
||||
&configuration,
|
||||
&login,
|
||||
Some(true),
|
||||
None,
|
||||
Some(1),
|
||||
Some(40),
|
||||
),
|
||||
apis::user_api::user_get_heatmap_data(&configuration, &login),
|
||||
);
|
||||
Ok(HomeData {
|
||||
activities: activities.map_err(|error| error.to_string())?,
|
||||
heatmap: heatmap.map_err(|error| error.to_string())?,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user