Skip to main content

kellnr_common/
webhook.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use utoipa::ToSchema;
4
5#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
6pub struct Webhook {
7    pub id: Option<String>,
8    pub event: WebhookEvent,
9    pub callback_url: String,
10    pub name: Option<String>,
11    /// Secret used to sign deliveries. Never serialized, so it cannot leak
12    /// through an API response.
13    #[serde(default, skip_serializing)]
14    pub secret: Option<String>,
15}
16
17#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
18pub struct WebhookQueue {
19    pub id: String,
20    pub callback_url: String,
21    pub payload: serde_json::Value,
22    pub last_attempt: Option<DateTime<Utc>>,
23    pub next_attempt: DateTime<Utc>,
24    #[serde(default, skip_serializing)]
25    pub secret: Option<String>,
26}
27
28#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
29#[allow(clippy::enum_variant_names)]
30pub enum WebhookEvent {
31    #[serde(rename = "crate_add")]
32    CrateAdd,
33    #[serde(rename = "crate_update")]
34    CrateUpdate,
35    #[serde(rename = "crate_yank")]
36    CrateYank,
37    #[serde(rename = "crate_unyank")]
38    CrateUnyank,
39}
40impl From<WebhookEvent> for &str {
41    fn from(value: WebhookEvent) -> Self {
42        match value {
43            WebhookEvent::CrateAdd => "crate_add",
44            WebhookEvent::CrateUpdate => "crate_update",
45            WebhookEvent::CrateYank => "crate_yank",
46            WebhookEvent::CrateUnyank => "crate_unyank",
47        }
48    }
49}
50impl TryFrom<&str> for WebhookEvent {
51    type Error = String;
52    fn try_from(value: &str) -> Result<Self, Self::Error> {
53        match value {
54            "crate_add" => Ok(Self::CrateAdd),
55            "crate_update" => Ok(Self::CrateUpdate),
56            "crate_yank" => Ok(Self::CrateYank),
57            "crate_unyank" => Ok(Self::CrateUnyank),
58            a => Err(format!("'{a}' is not a valid webhook event")),
59        }
60    }
61}