use crate::Result;
use crate::UptrakitClient;
use crate::types_impl::batch_actions::{BatchActionRequest, BatchActionResponse};
use crate::types_impl::pagination::{PaginatedResponse, PaginationParams};
use crate::types_impl::plugin_configs::{
CreatePluginConfigRequest, PluginConfigResponse, PluginTypeInfo, UpdatePluginConfigRequest,
};
use uuid::Uuid;
impl UptrakitClient {
pub async fn list_plugin_types(&self) -> Result<Vec<PluginTypeInfo>> {
self.get(crate::paths::plugin_configs::PLUGIN_TYPES).await
}
pub async fn create_plugin_config(
&self,
req: &CreatePluginConfigRequest,
) -> Result<PluginConfigResponse> {
self.post_json(crate::paths::plugin_configs::BASE, req)
.await
}
pub async fn list_plugin_configs(
&self,
params: &PaginationParams,
) -> Result<PaginatedResponse<PluginConfigResponse>> {
self.get_with_query(crate::paths::plugin_configs::BASE, params)
.await
}
pub async fn list_all_plugin_configs(&self) -> Result<Vec<PluginConfigResponse>> {
let base = PaginationParams {
page: None,
per_page: None,
};
self.fetch_all_pages(crate::paths::plugin_configs::BASE, &base)
.await
}
pub async fn get_plugin_config(&self, id: &Uuid) -> Result<(PluginConfigResponse, String)> {
self.get_with_etag(&crate::paths::plugin_configs::by_id(id))
.await
}
pub async fn update_plugin_config(
&self,
id: &Uuid,
req: &UpdatePluginConfigRequest,
etag: &str,
) -> Result<(PluginConfigResponse, String)> {
self.put_json_with_etag(&crate::paths::plugin_configs::by_id(id), req, etag)
.await
}
pub async fn delete_plugin_config(&self, id: &Uuid) -> Result<()> {
self.delete(&crate::paths::plugin_configs::by_id(id)).await
}
pub async fn batch_plugin_configs(
&self,
req: &BatchActionRequest,
) -> Result<BatchActionResponse> {
self.post_json(crate::paths::plugin_configs::BATCH, req)
.await
}
pub async fn test_plugin_config(
&self,
req: &crate::types_impl::plugin_config_test::TestPluginConfigRequest,
) -> Result<crate::types_impl::plugin_config_test::TestPluginConfigResponse> {
self.post_json(crate::paths::plugin_configs::TEST, req)
.await
}
}
#[cfg(test)]
mod tests {
use crate::shared_types_impl::plugin_ids;
use crate::types_impl::pagination::PaginationParams;
use crate::types_impl::plugin_configs::{CreatePluginConfigRequest, UpdatePluginConfigRequest};
#[test]
fn create_plugin_config_request_serialization() {
let req = CreatePluginConfigRequest {
name: "GitHub Releases".to_string(),
plugin_type: plugin_ids::RELEASES_GITHUB.clone(),
config: serde_json::json!({"tag_strip_prefix": "v", "include_prereleases": false}),
enabled: true,
};
let json = serde_json::to_value(&req).expect("serialize");
assert_eq!(json["name"], "GitHub Releases");
assert_eq!(json["plugin_type"], "releases.github");
assert_eq!(json["config"]["tag_strip_prefix"], "v");
assert_eq!(json["enabled"], true);
}
#[test]
fn update_plugin_config_request_serialization() {
let req = UpdatePluginConfigRequest {
name: Some("Updated Config".to_string()),
config: Some(serde_json::json!({"key": "value"})),
enabled: Some(false),
};
let json = serde_json::to_value(&req).expect("serialize");
assert_eq!(json["name"], "Updated Config");
assert_eq!(json["config"]["key"], "value");
assert_eq!(json["enabled"], false);
}
#[test]
fn pagination_params_for_plugin_configs() {
let params = PaginationParams {
page: Some(1),
per_page: Some(25),
};
let qs = serde_urlencoded::to_string(¶ms).expect("serialize");
assert!(qs.contains("page=1"));
assert!(qs.contains("per_page=25"));
}
}