Parse data from incoming request

This commit is contained in:
Alphonse Paix
2025-08-23 11:13:57 +02:00
parent 4d049a744a
commit 85ab04f254
9 changed files with 405 additions and 14 deletions

View File

@@ -1,3 +1,4 @@
use crate::domain::{NewSubscriber, SubscriberEmail, SubscriberName};
use axum::{Form, extract::State, http::StatusCode, response::IntoResponse};
use chrono::Utc;
use serde::Deserialize;
@@ -14,9 +15,16 @@ use uuid::Uuid;
)]
pub async fn subscribe(
State(connection): State<PgPool>,
form: Form<FormData>,
Form(form): Form<FormData>,
) -> impl IntoResponse {
if insert_subscriber(&connection, &form).await.is_err() {
let new_subscriber = match form.try_into() {
Ok(subscriber) => subscriber,
Err(_) => return StatusCode::BAD_REQUEST,
};
if insert_subscriber(&connection, &new_subscriber)
.await
.is_err()
{
StatusCode::INTERNAL_SERVER_ERROR
} else {
StatusCode::OK
@@ -25,11 +33,11 @@ pub async fn subscribe(
#[tracing::instrument(
name = "Saving new subscriber details in the database",
skip(connection, form)
skip(connection, new_subscriber)
)]
pub async fn insert_subscriber(
connection: &PgPool,
form: &Form<FormData>,
new_subscriber: &NewSubscriber,
) -> Result<(), sqlx::Error> {
sqlx::query!(
r#"
@@ -37,8 +45,8 @@ pub async fn insert_subscriber(
VALUES ($1, $2, $3, $4);
"#,
Uuid::new_v4(),
form.email,
form.name,
new_subscriber.email.as_ref(),
new_subscriber.name.as_ref(),
Utc::now()
)
.execute(connection)
@@ -56,3 +64,13 @@ pub struct FormData {
name: String,
email: String,
}
impl TryFrom<FormData> for NewSubscriber {
type Error = String;
fn try_from(value: FormData) -> Result<Self, Self::Error> {
let name = SubscriberName::parse(value.name)?;
let email = SubscriberEmail::parse(value.email)?;
Ok(Self { name, email })
}
}