use actix_web::{web, HttpResponse}; use chrono::Utc; use sqlx::PgPool; use tracing::Instrument; use uuid::Uuid; #[derive(serde::Deserialize)] pub struct FormData { email: String, name: String, } pub async fn subscribe_route( form: web::Form, db_conn_pool: web::Data, ) -> HttpResponse { let request_id = Uuid::new_v4(); let request_span = tracing::info_span!( "Adding new subscriber", %request_id, subscriber_email = %form.email, subscriber_name = %form.name ); let _request_span_guard = request_span.enter(); let query_span = tracing::info_span!("Adding new subscriber in PostgreSQL"); 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() ) .execute(db_conn_pool.get_ref()) .instrument(query_span) .await { Ok(_) => HttpResponse::Ok().finish(), Err(err) => { tracing::error!( "request_id {} - Failed to execute query: {:?}", request_id, err ); HttpResponse::InternalServerError().finish() } } }