Add pull request and repository browsing

This commit is contained in:
Georg Bauer
2026-07-30 16:12:22 +02:00
parent 73b6882b47
commit c7de716b8e
12 changed files with 2793 additions and 975 deletions

170
crates/app/src/api.rs Normal file
View 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())?,
})
}