From 6fb17a18c6ecbc18d51c9ba6a13b6d94ffb699e8 Mon Sep 17 00:00:00 2001 From: RGBCube Date: Fri, 24 Nov 2023 15:22:55 +0300 Subject: [PATCH] Add basic db logic --- Cargo.lock | 14 ++++++++++++++ Cargo.toml | 2 +- src/main.rs | 23 ++++++++++++++++++++++- src/submit.rs | 29 +++++++++++++++++++++++++++-- 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0fee49f..ea16e9d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1589,6 +1589,8 @@ dependencies = [ "smallvec", "sqlformat", "thiserror", + "tokio", + "tokio-stream", "tracing", "url", ] @@ -1628,6 +1630,7 @@ dependencies = [ "sqlx-sqlite", "syn 1.0.109", "tempfile", + "tokio", "url", ] @@ -1881,6 +1884,17 @@ dependencies = [ "syn 2.0.39", ] +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.10" diff --git a/Cargo.toml b/Cargo.toml index 059f4e2..121d18f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ edition = "2021" actix-web = "4.4.0" maud = { version = "0.25.0", features = [ "actix-web" ] } serde = { version = "1.0.192", features = [ "derive" ] } -sqlx = { version = "0.7.3", features = ["sqlite"] } +sqlx = { version = "0.7.3", features = ["sqlite", "runtime-tokio"] } tokio = { version = "1.34.0", features = [ "full" ] } [profile.dev] diff --git a/src/main.rs b/src/main.rs index 845420c..07681a1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,11 +4,32 @@ mod submit; use std::io; use actix_web as web; +use sqlx::{ + sqlite::SqliteConnectOptions, + SqlitePool, +}; #[web::main] async fn main() -> io::Result<()> { - web::HttpServer::new(|| { + let db = SqlitePool::connect_with(SqliteConnectOptions::new().filename("data.db")) + .await + .unwrap(); + + sqlx::query( + r" + CREATE TABLE IF NOT EXISTS reminders ( + date TEXT, + message TEXT + ) + ", + ) + .execute(&db) + .await + .unwrap(); + + web::HttpServer::new(move || { web::App::new() + .app_data(web::web::Data::new(db.clone())) .service(index::index) .service(submit::submit) .service(submit::submit_form) diff --git a/src/submit.rs b/src/submit.rs index 6da58ee..69a5e61 100644 --- a/src/submit.rs +++ b/src/submit.rs @@ -1,10 +1,14 @@ use actix_web as web; -use actix_web::web::Query; +use actix_web::web::{ + Data, + Query, +}; use maud::{ html, Markup, DOCTYPE, }; +use sqlx::SqlitePool; #[derive(Debug, serde::Deserialize)] pub struct Reminder { @@ -13,12 +17,33 @@ pub struct Reminder { } #[web::get("/submit-form")] -async fn submit_form(Query(reminder): Query) -> web::Result { +async fn submit_form( + data: Data, + Query(reminder): Query, +) -> web::Result { println!("{reminder:?}"); + sqlx::query( + r" + INSERT INTO + reminders (date, message) + VALUES + (?, ?) + ", + ) + .bind(reminder.date) + .bind(reminder.message) + .execute(&**data) + .await + .expect("Failed to save reminder."); + Ok(html! { (DOCTYPE) h1 { "Kaydedildi." } + p { "Ana sayfaya geri yönlendiriliyorsun..." } + script type="text/javascript" {r#" + setTimeout(() => window.location.href = "/", 5000); + "#} }) }