Skip to main content

kellnr_webhooks/
lib.rs

1use chrono::{DateTime, Utc};
2use kellnr_common::canonical_name::CanonicalName;
3use kellnr_common::version::Version;
4use kellnr_common::webhook::WebhookEvent;
5use kellnr_db::DbProvider;
6use serde_json::json;
7
8mod client;
9pub mod endpoints;
10mod service;
11mod signature;
12mod target;
13#[cfg(test)]
14mod tests;
15mod types;
16
17pub use endpoints::{
18    delete_webhook, get_all_webhooks, get_webhook, register_webhook, test_webhook,
19};
20pub use service::run_webhook_service;
21
22/// Queue a webhook message for all webhooks of `event`. The payload contains
23/// the lowercase crate name as `crate_name` and the name the crate was
24/// published with as `original_name`.
25pub async fn notify_crate(
26    event: WebhookEvent,
27    timestamp: &DateTime<Utc>,
28    crate_name: &CanonicalName,
29    version: &Version,
30    db: &std::sync::Arc<dyn DbProvider>,
31) {
32    let original_name = match db.get_original_name(crate_name, version).await {
33        Ok(Some(original_name)) => original_name.to_string(),
34        Ok(None) => crate_name.to_string(),
35        Err(err) => {
36            tracing::error!("Cannot read the original name of {crate_name}: {err}");
37            crate_name.to_string()
38        }
39    };
40    let payload = json!({
41        "type": event,
42        "timestamp": timestamp,
43        "data": {
44            "crate_name": original_name.to_lowercase(),
45            "original_name": original_name,
46            "crate_version": version
47        }
48    });
49
50    if let Err(err) = db.add_webhook_queue(event, payload).await {
51        tracing::error!("Db: {err:?}");
52    }
53}