use axum::{Json, http::StatusCode, response::IntoResponse};
use serde::Deserialize;
use std::sync::Arc;
use crate::notifications::WebhookManager;
#[derive(Debug, Clone, Deserialize)]
pub struct WebhookPayload {
pub event: String,
pub data: serde_json::Value,
}
pub struct WebhookHandler {
#[allow(dead_code)]
manager: Arc<WebhookManager>,
}
impl WebhookHandler {
pub fn new(manager: Arc<WebhookManager>) -> Self {
Self { manager }
}
}
pub async fn webhook_handler(
axum::extract::State(_handler): axum::extract::State<Arc<WebhookHandler>>,
Json(payload): Json<WebhookPayload>,
) -> impl IntoResponse {
tracing::info!("Received webhook event: {}", payload.event);
match payload.event.as_str() {
"ping" => (StatusCode::OK, Json(serde_json::json!({"status": "pong"}))),
_ => {
tracing::warn!("Unknown webhook event: {}", payload.event);
(
StatusCode::BAD_REQUEST,
Json(serde_json::json!({"error": "Unknown event type"})),
)
}
}
}