use actix_web::{web, HttpResponse}; use chrono::Utc; use sqlx::PgPool; use uuid::Uuid; #[derive(serde::Deserialize)] pub struct FormData { email: String, name: String, } #[tracing::instrument( name = "Adding a new subscriber", // functions args isn't really relevant to the span skip(form, db_conn_pool), fields( request_id = %Uuid::new_v4(), subscriber_email = %form.email, subscriber_name = %form.name ) )] pub async fn subscribe_route( form: web::Form, db_conn_pool: web::Data, ) -> HttpResponse { match insert_subscriber(&db_conn_pool, &form).await { Ok(_) => HttpResponse::Ok().finish(), Err(_) => HttpResponse::InternalServerError().finish(), } } #[tracing::instrument( name = "Saving new subscriber details in the database", skip(form, pool) )] pub async fn insert_subscriber(pool: &PgPool, form: &FormData) -> Result<(), sqlx::Error> { 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(pool) .await .map_err(|e| { tracing::error!("Failed to execute query: {:?}", e); e // Using the `?` operator to return early // if the function failed, returning a sqlx::Error // We will talk about error handling in depth later! })?; Ok(()) }