notify: api: add get_targets

This method allows us to get a list of all notification targets.

Signed-off-by: Lukas Wagner <l.wagner@proxmox.com>
Reviewed-by: Fiona Ebner <f.ebner@proxmox.com>
This commit is contained in:
Lukas Wagner 2024-04-19 16:17:11 +02:00 committed by Thomas Lamprecht
parent e83269be1d
commit 87f7dfa111

View File

@ -3,6 +3,7 @@ use std::collections::HashSet;
use serde::{Deserialize, Serialize};
use proxmox_http_error::HttpError;
use proxmox_schema::api;
use crate::{Config, Origin};
@ -39,6 +40,82 @@ macro_rules! http_bail {
pub use http_bail;
pub use http_err;
#[api]
#[derive(Clone, Debug, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd)]
#[serde(rename_all = "kebab-case")]
/// Type of the endpoint.
pub enum EndpointType {
/// Sendmail endpoint
#[cfg(feature = "sendmail")]
Sendmail,
/// SMTP endpoint
#[cfg(feature = "smtp")]
Smtp,
/// Gotify endpoint
#[cfg(feature = "gotify")]
Gotify,
}
#[api]
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd)]
#[serde(rename_all = "kebab-case")]
/// Target information
pub struct Target {
/// Name of the endpoint
name: String,
/// Origin of the endpoint
origin: Origin,
/// Type of the endpoint
#[serde(rename = "type")]
endpoint_type: EndpointType,
/// Target is disabled
#[serde(skip_serializing_if = "Option::is_none")]
disable: Option<bool>,
/// Comment
#[serde(skip_serializing_if = "Option::is_none")]
comment: Option<String>,
}
/// Get a list of all notification targets.
pub fn get_targets(config: &Config) -> Result<Vec<Target>, HttpError> {
let mut targets = Vec::new();
#[cfg(feature = "gotify")]
for endpoint in gotify::get_endpoints(config)? {
targets.push(Target {
name: endpoint.name,
origin: endpoint.origin.unwrap_or(Origin::UserCreated),
endpoint_type: EndpointType::Gotify,
disable: endpoint.disable,
comment: endpoint.comment,
})
}
#[cfg(feature = "sendmail")]
for endpoint in sendmail::get_endpoints(config)? {
targets.push(Target {
name: endpoint.name,
origin: endpoint.origin.unwrap_or(Origin::UserCreated),
endpoint_type: EndpointType::Sendmail,
disable: endpoint.disable,
comment: endpoint.comment,
})
}
#[cfg(feature = "smtp")]
for endpoint in smtp::get_endpoints(config)? {
targets.push(Target {
name: endpoint.name,
origin: endpoint.origin.unwrap_or(Origin::UserCreated),
endpoint_type: EndpointType::Smtp,
disable: endpoint.disable,
comment: endpoint.comment,
})
}
Ok(targets)
}
fn verify_digest(config: &Config, digest: Option<&[u8]>) -> Result<(), HttpError> {
if let Some(digest) = digest {
if config.digest != *digest {