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
22pub 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}