From 68e825c942f04b3916138813ea5d4794e9563566 Mon Sep 17 00:00:00 2001 From: Sandro Eiler Date: Sun, 28 Jan 2024 22:22:29 +0100 Subject: [PATCH] feat: provide connection pool to routes --- Cargo.lock | 9 +++++++++ Cargo.toml | 15 ++++++++------- src/routes/subscriptions.rs | 34 ++++++++++++++++++++++++---------- src/startup.rs | 3 +-- tests/health_check.rs | 2 +- 5 files changed, 43 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6f72d4d..22418c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -249,7 +249,10 @@ checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", + "serde", + "wasm-bindgen", "windows-targets 0.48.1", ] @@ -986,6 +989,7 @@ name = "learn_axum" version = "0.1.0" dependencies = [ "axum", + "chrono", "config", "hyper 1.1.0", "reqwest", @@ -993,6 +997,7 @@ dependencies = [ "serde_json", "sqlx", "tokio", + "uuid", ] [[package]] @@ -2365,6 +2370,10 @@ name = "uuid" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +dependencies = [ + "getrandom", + "rand", +] [[package]] name = "vcpkg" diff --git a/Cargo.toml b/Cargo.toml index 0e81187..6cd0a26 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,18 +28,19 @@ config = "0.13" # lazy-regex = "3" # async-trait = "0.1" # strum_macros = "0.25" -# uuid = { version = "1", features = ["v4", "fast-rng"] } +uuid = { version = "1", features = ["v4", "fast-rng"] } +chrono = { version = "0.4", features = ["serde"] } [dependencies.sqlx] version = "0.7" default-features = false features = [ - "runtime-tokio-rustls", - "macros", - "postgres", - "uuid", - "chrono", - "migrate" + "runtime-tokio-rustls", + "macros", + "postgres", + "uuid", + "chrono", + "migrate", ] [dev-dependencies] diff --git a/src/routes/subscriptions.rs b/src/routes/subscriptions.rs index ebb1c5f..a040d10 100644 --- a/src/routes/subscriptions.rs +++ b/src/routes/subscriptions.rs @@ -1,8 +1,11 @@ -use axum::Form; -use axum::http::StatusCode; +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 { @@ -10,14 +13,25 @@ struct FormData { name: String, } -async fn subscribe(Form(params): Form) { - // println!("Params are: {params:?}"); - // if params.name.is_empty() || params.email.is_empty() { - // return StatusCode::NOT_ACCEPTABLE; - // } - // StatusCode::OK +async fn subscribe(State(pool): State, Form(form): Form) { + let _ = 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; } -pub fn routes_subscriptions() -> Router { - Router::new().route("/subscriptions", post(subscribe)) +pub fn routes_subscriptions(pool: PgPool) -> Router { + Router::new() + .route("/subscriptions", post(subscribe)) + .with_state(pool) } diff --git a/src/startup.rs b/src/startup.rs index 10dbb10..d471be6 100644 --- a/src/startup.rs +++ b/src/startup.rs @@ -7,9 +7,8 @@ use tokio::net::TcpListener; /// API routing pub fn app(connection: PgPool) -> Router { Router::new() - .with_state(connection) .merge(crate::routes::routes_health_check()) - .merge(crate::routes::routes_subscriptions()) + .merge(crate::routes::routes_subscriptions(connection)) } /// Start the server diff --git a/tests/health_check.rs b/tests/health_check.rs index 6a40b0a..7e1e9f9 100644 --- a/tests/health_check.rs +++ b/tests/health_check.rs @@ -1,7 +1,7 @@ use std::time::Duration; use learn_axum::configuration::get_configuration; -use sqlx::{Connection, PgConnection, postgres::PgPoolOptions}; +use sqlx::{postgres::PgPoolOptions, Connection, PgConnection}; use tokio::net::TcpListener; struct TestApp {