forked from kemitix/git-next
55 lines
1.8 KiB
Rust
55 lines
1.8 KiB
Rust
|
//
|
||
|
use git_next_config as config;
|
||
|
use git_next_git as git;
|
||
|
use kxio::network;
|
||
|
|
||
|
use crate::webhook::Hook;
|
||
|
|
||
|
pub async fn list(
|
||
|
repo_details: &git::RepoDetails,
|
||
|
webhook_url: &config::server::WebhookUrl,
|
||
|
net: &network::Network,
|
||
|
) -> git::forge::webhook::Result<Vec<config::WebhookId>> {
|
||
|
let mut ids: Vec<config::WebhookId> = vec![];
|
||
|
let hostname = &repo_details.forge.hostname();
|
||
|
let repo_path = &repo_details.repo_path;
|
||
|
let mut page = 1;
|
||
|
loop {
|
||
|
use secrecy::ExposeSecret;
|
||
|
let token = &repo_details.forge.token().expose_secret();
|
||
|
let url =
|
||
|
format!("https://{hostname}/api/v1/repos/{repo_path}/hooks?page={page}&token={token}");
|
||
|
let net_url = network::NetUrl::new(url);
|
||
|
let request = network::NetRequest::new(
|
||
|
network::RequestMethod::Get,
|
||
|
net_url,
|
||
|
network::NetRequestHeaders::new(),
|
||
|
network::RequestBody::None,
|
||
|
network::ResponseType::Json,
|
||
|
None,
|
||
|
network::NetRequestLogging::None,
|
||
|
);
|
||
|
let result = net.get::<Vec<Hook>>(request).await;
|
||
|
match result {
|
||
|
Ok(response) => {
|
||
|
if let Some(list) = response.response_body() {
|
||
|
if list.is_empty() {
|
||
|
return Ok(ids);
|
||
|
}
|
||
|
for hook in list {
|
||
|
if let Some(existing_url) = hook.config.get("url") {
|
||
|
if existing_url.starts_with(webhook_url.as_ref()) {
|
||
|
ids.push(hook.id());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
page += 1;
|
||
|
}
|
||
|
}
|
||
|
Err(e) => {
|
||
|
return Err(git::forge::webhook::Error::Network(e));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
}
|