use axum::extract::State; use axum::routing::post; use axum::Form; use axum::Router; use chrono::Utc; use serde::Deserialize; use sqlx::PgPool; use uuid::Uuid; #[derive(Debug, Deserialize)] struct FormData { email: String, name: String, } async fn subscribe(State(pool): State, Form(form): Form) { let request_id = Uuid::new_v4(); tracing::info!( "request_id {} - Adding '{}' '{}' as a new subscriber.", request_id, form.email, form.name ); tracing::info!( "request_id {} - Saving new subscriber details in the database", request_id ); match sqlx::query!( r#" INSERT INTO subscriptions (id, email, name, subscribed_at) VALUES ($1, $2, $3, $4) "#, Uuid::new_v4(), form.email, form.name, Utc::now() ) // We use `get_ref` to get an immutable reference to the `PgConnection` // wrapped by `web::Data`. .execute(&pool) .await { Ok(_) => { tracing::info!( "request_id {} - New subscriber details have been saved", request_id ); } Err(e) => { tracing::error!( "request_id {} - Failed to execute query: {:?}", request_id, e ); } }; } pub fn routes_subscriptions(pool: PgPool) -> Router { Router::new() .route("/subscriptions", post(subscribe)) .with_state(pool) }