use std::net::SocketAddr;
use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::Arc;
use axum::{extract::State, http::StatusCode, routing::post, Json, Router};
use solid_pod_rs::notifications::ChangeNotification;
#[derive(Clone, Default)]
struct AppState {
received: Arc<AtomicU64>,
}
async fn hook(
State(state): State<AppState>,
Json(note): Json<ChangeNotification>,
) -> StatusCode {
let n = state.received.fetch_add(1, Ordering::Relaxed) + 1;
println!(
"[{kind}] {object} (id={id}) total_received={n}",
kind = note.kind,
object = note.object,
id = note.id,
);
StatusCode::NO_CONTENT
}
async fn health() -> StatusCode {
StatusCode::OK
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let state = AppState::default();
let app = Router::new()
.route("/hook", post(hook))
.route("/health", axum::routing::get(health))
.with_state(state);
let addr: SocketAddr = "127.0.0.1:8767".parse()?;
eprintln!("webhook receiver listening on http://{addr}/hook");
let listener = tokio::net::TcpListener::bind(addr).await?;
axum::serve(listener, app).await?;
Ok(())
}