From 5f36b535a23ded26524c1e7751b1265a259db271 Mon Sep 17 00:00:00 2001 From: Matthias Lodner Date: Fri, 16 Jan 2026 03:27:07 +0100 Subject: [PATCH] Added db to backend. --- Cargo.lock | 4 ++-- common/src/models/article.rs | 3 ++- common/src/models/variant.rs | 3 ++- server/Cargo.toml | 5 ++--- server/migrations/20260116005924_init.sql | 1 + server/migrations/README.md | 21 +++++++++++++++++++++ server/src/main.rs | 15 ++++++++++++++- 7 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 server/migrations/20260116005924_init.sql create mode 100644 server/migrations/README.md diff --git a/Cargo.lock b/Cargo.lock index 3245620..eebeecc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -376,9 +376,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", "js-sys", diff --git a/common/src/models/article.rs b/common/src/models/article.rs index 5314339..9fd31e4 100644 --- a/common/src/models/article.rs +++ b/common/src/models/article.rs @@ -1,8 +1,9 @@ use serde::{Deserialize, Serialize}; +use sqlx::FromRow; use crate::models::origin::Origin; use crate::models::variant::Variant; -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, FromRow)] pub struct Article { pub id: usize, pub name: String, diff --git a/common/src/models/variant.rs b/common/src/models/variant.rs index ab37008..8c03ba4 100644 --- a/common/src/models/variant.rs +++ b/common/src/models/variant.rs @@ -1,6 +1,7 @@ use serde::{Deserialize, Serialize}; +use sqlx::FromRow; -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, FromRow)] pub struct Variant { pub id: usize, diff --git a/server/Cargo.toml b/server/Cargo.toml index d63c908..ea99600 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -17,7 +17,6 @@ http = "1.4.0" tracing = "=0.1.44" tracing-subscriber = "0.3.22" - serde = { version = "1.0.228", features = ["derive"] } serde_json = "1.0.149" @@ -25,8 +24,8 @@ serde_json = "1.0.149" env_logger = "0.11.8" # Database -sqlx = { version = "0.8.6", features = [ "runtime-async-std-native-tls", "postgres", "chrono" ] } +sqlx = { version = "0.8.6", features = [ "runtime-async-std-native-tls", "postgres", "chrono", "macros" ] } # Etc. dotenv = "0.15.0" -chrono = { version = "0.4.42" } +chrono = { version = "0.4.43" } diff --git a/server/migrations/20260116005924_init.sql b/server/migrations/20260116005924_init.sql new file mode 100644 index 0000000..8ddc1d3 --- /dev/null +++ b/server/migrations/20260116005924_init.sql @@ -0,0 +1 @@ +-- Add migration script here diff --git a/server/migrations/README.md b/server/migrations/README.md new file mode 100644 index 0000000..a3c8f4f --- /dev/null +++ b/server/migrations/README.md @@ -0,0 +1,21 @@ +# Migration scripts + +## Installation +````bash +cargo install sqlx-cli +```` + +## Create database + +````bash +sqlx database setup +```` + +## Use migration +````bash +# Creating new script file. +sqlx migrate add + +# Run migration +sqlx migrate run +```` diff --git a/server/src/main.rs b/server/src/main.rs index 49d267a..9384e7e 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -4,8 +4,12 @@ use axum::{ http::StatusCode, Json, Router, }; +use axum::extract::State; use dotenv::dotenv; +use env_logger::fmt::style::Reset; use common::models::article::Article; +use common::models::origin::Origin; +use sqlx::{ postgres::PgPoolOptions, PgPool }; #[tokio::main] async fn main() { @@ -20,12 +24,20 @@ async fn main() { // initialize tracing tracing_subscriber::fmt().init(); + let pool = PgPoolOptions::new() + .max_connections(50) + .connect(&database) + .await + .expect(&format!("Can't connect to database: {}", &database)); + sqlx::migrate!().run(&pool).await.expect("Migrations failed"); + // build our application with a route let app = Router::new() // `GET /` goes to `root` .route("/", get(root)) // `POST /users` goes to `create_user` - .route("/article", post(create_article)); + .route("/article", post(create_article)) + .with_state(pool); // run our app with hyper, listening globally on port 3000 let listener = tokio::net::TcpListener::bind(addr).await.unwrap(); @@ -39,6 +51,7 @@ async fn root() -> &'static str { #[tracing::instrument(ret)] async fn create_article( + State(pool): State, Json(payload): Json
, ) -> (StatusCode, Json
) { let article = Article {