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, ToSchema)]
6pub struct Webhook {
7    pub id: Option<String>,
8    pub event: WebhookEvent,
9    pub callback_url: String,
10    pub name: Option<String>,
11}
12
13#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
14pub struct WebhookQueue {
15    pub id: String,
16    pub callback_url: String,
17    pub payload: serde_json::Value,
18    pub last_attempt: Option<DateTime<Utc>>,
19    pub next_attempt: DateTime<Utc>,
20}
21
22#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
23#[allow(clippy::enum_variant_names)]
24pub enum WebhookEvent {
25    #[serde(rename = "crate_add")]
26    CrateAdd,
27    #[serde(rename = "crate_update")]
28    CrateUpdate,
29    #[serde(rename = "crate_yank")]
30    CrateYank,
31    #[serde(rename = "crate_unyank")]
32    CrateUnyank,
33}
34impl From<WebhookEvent> for &str {
35    fn from(value: WebhookEvent) -> Self {
36        match value {
37            WebhookEvent::CrateAdd => "crate_add",
38            WebhookEvent::CrateUpdate => "crate_update",
39            WebhookEvent::CrateYank => "crate_yank",
40            WebhookEvent::CrateUnyank => "crate_unyank",
41        }
42    }
43}
44impl TryFrom<&str> for WebhookEvent {
45    type Error = String;
46    fn try_from(value: &str) -> Result<Self, Self::Error> {
47        match value {
48            "crate_add" => Ok(Self::CrateAdd),
49            "crate_update" => Ok(Self::CrateUpdate),
50            "crate_yank" => Ok(Self::CrateYank),
51            "crate_unyank" => Ok(Self::CrateUnyank),
52            a => Err(format!("'{a}' is not a valid webhook event")),
53        }
54    }
55}