Parse data from incoming request
This commit is contained in:
@@ -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 })
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user