use crate as github;
use git_next_core::{git, server::RepoListenUrl, WebhookId};
pub async fn list(
github: &github::Github,
repo_listen_url: &RepoListenUrl,
) -> git::forge::webhook::Result<Vec<WebhookId>> {
let mut ids: Vec<WebhookId> = vec![];
let repo_details = &github.repo_details;
let hostname = &repo_details.forge.hostname();
let net = &github.net;
let mut page = 1;
loop {
let result = net
.get(format!(
"https://api.{hostname}/repos/{}/hooks?page={page}",
repo_details.repo_path,
))
.headers(github::webhook::headers(repo_details.forge.token()))
.send()
.await;
match result {
Ok(response) => match response.json::<Vec<github::GithubHook>>().await {
Err(err) => {
tracing::warn!(?err, "failed");
return Err(git::forge::webhook::Error::NetworkResponseEmpty);
}
Ok(list) => {
if list.is_empty() {
return Ok(ids);
}
for hook in list {
if hook
.url()
.as_ref()
.starts_with(&repo_listen_url.to_string())
{
ids.push(hook.id());
}
}
page += 1;
}
},
Err(e) => {
return Err(git::forge::webhook::Error::Network(e));
}
};
}
}