From 55b992b5c474cfe6c6470e36d0a981aff6dbbbf9 Mon Sep 17 00:00:00 2001 From: Robert Garrett Date: Fri, 12 Sep 2025 09:29:33 -0500 Subject: [PATCH] Impl the list_packages API function --- src/api/packages.rs | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/api/packages.rs b/src/api/packages.rs index 4f347dc..aaaf8da 100644 --- a/src/api/packages.rs +++ b/src/api/packages.rs @@ -1,4 +1,40 @@ -pub fn list_packages() {} +use crate::structs::package::{Package, PackageType}; + +/// Gets all packages of an owner +/// +/// https://github.com/go-gitea/gitea/blob/main/routers/api/v1/packages/package.go#L22 +/// +/// Matches the route `GET /packages/{owner}` +pub async fn list_packages( + client: &reqwest::Client, + gitea_url: &str, + owner: &str, + pkg_type: Option, +) -> crate::Result> { + let request_url = format!("{gitea_url}/api/v1/packages/{owner}"); + // add the query parameter only when a package type filter has been set. + let request_url = if let Some(pkg_type) = pkg_type { + let pkg_type = pkg_type.to_string(); + format!("{request_url}?type={pkg_type}") + } else { + request_url + }; + let req = client.get(request_url).send().await; + let response = req.map_err(crate::Error::WrappedReqwestErr)?; + + if response.status().is_success() { + let release_list = response + .json::>() + .await + .map_err(crate::Error::WrappedReqwestErr)?; + return Ok(release_list); + } else if response.status().is_client_error() { + let mesg = crate::decode_client_error(response).await?; + return Err(crate::Error::ApiErrorMessage(mesg)); + } + panic!("Reached the end of `api::list_packages()` without matching a return pathway."); +} + pub fn get_packages() {} pub fn delete_package() {} pub fn list_package_files() {}