From 68d50b69dd2b0fb81c9e4fd34e64f8de784c7a7e Mon Sep 17 00:00:00 2001 From: realaravinth Date: Fri, 9 Sep 2022 19:51:54 +0530 Subject: [PATCH] feat: update sqlx and store form data --- Cargo.lock | 264 ++++-------------- Cargo.toml | 6 +- build.rs | 9 +- .../20220909135248_forms_submissions.sql | 7 + sqlx-data.json | 15 + src/api/v1/forms.rs | 15 +- src/db.rs | 39 ++- 7 files changed, 136 insertions(+), 219 deletions(-) create mode 100644 migrations/20220909135248_forms_submissions.sql diff --git a/Cargo.lock b/Cargo.lock index 1f20aa1..865aaae 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -50,7 +50,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "rand", - "sha1 0.10.1", + "sha1", "smallvec", "tracing", "zstd", @@ -166,7 +166,7 @@ dependencies = [ "serde_urlencoded", "smallvec", "socket2", - "time 0.3.13", + "time", "url", ] @@ -283,9 +283,9 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "atoi" -version = "0.4.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5" +checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" dependencies = [ "num-traits 0.2.15", ] @@ -307,12 +307,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "base-x" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" - [[package]] name = "base64" version = "0.13.0" @@ -463,12 +457,6 @@ dependencies = [ "yaml-rust", ] -[[package]] -name = "const_fn" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbdcdcb6d86f71c5e97409ad45898af11cbc995b4ee8112d59095a28d376c935" - [[package]] name = "constant_time_eq" version = "0.1.5" @@ -488,7 +476,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05" dependencies = [ "percent-encoding", - "time 0.3.13", + "time", "version_check", ] @@ -503,18 +491,18 @@ dependencies = [ [[package]] name = "crc" -version = "2.1.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" +checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "1.1.1" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" +checksum = "2d0165d2900ae6778e36e80bbc4da3b5eefccee9ba939761f9c2882a5d9af3ff" [[package]] name = "crc32fast" @@ -630,7 +618,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version 0.4.0", + "rustc_version", "syn", ] @@ -666,16 +654,13 @@ dependencies = [ ] [[package]] -name = "discard" -version = "1.0.4" +name = "dotenvy" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" - -[[package]] -name = "dotenv" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +checksum = "da3db6fcad7c1fc4abdd99bf5276a4db30d6a819127903a709ed41e5ff016e84" +dependencies = [ + "dirs", +] [[package]] name = "either" @@ -874,26 +859,20 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", ] -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - [[package]] name = "hashlink" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +checksum = "d452c155cb93fecdfb02a73dd57b5d8e442c2063bd7aac72f1bc5e4263a43086" dependencies = [ - "hashbrown 0.11.2", + "hashbrown", ] [[package]] @@ -1014,7 +993,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", - "hashbrown 0.12.3", + "hashbrown", ] [[package]] @@ -1445,12 +1424,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - [[package]] name = "proc-macro2" version = "1.0.43" @@ -1575,37 +1548,36 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e52c148ef37f8c375d49d5a73aa70713125b7f19095948a923f80afdeb22ec2" -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - [[package]] name = "rustc_version" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.13", + "semver", ] [[package]] name = "rustls" -version = "0.19.1" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" dependencies = [ - "base64", "log", "ring", "sct", "webpki", ] +[[package]] +name = "rustls-pemfile" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" +dependencies = [ + "base64", +] + [[package]] name = "ryu" version = "1.0.11" @@ -1620,35 +1592,20 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "sct" -version = "0.6.1" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" dependencies = [ "ring", "untrusted", ] -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - [[package]] name = "semver" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93f6841e709003d68bb2deee8c343572bf446003ec20a583e76f7b15cebf3711" -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "serde" version = "0.8.23" @@ -1721,15 +1678,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sha1" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" -dependencies = [ - "sha1_smol", -] - [[package]] name = "sha1" version = "0.10.1" @@ -1741,12 +1689,6 @@ dependencies = [ "digest", ] -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - [[package]] name = "sha2" version = "0.10.2" @@ -1817,9 +1759,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.5.13" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551873805652ba0d912fec5bbb0f8b4cdd96baf8e2ebf5970e5671092966019b" +checksum = "788841def501aabde58d3666fcea11351ec3962e6ea75dbcd05c84a71d68bcd1" dependencies = [ "sqlx-core", "sqlx-macros", @@ -1827,9 +1769,9 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.5.13" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48c61941ccf5ddcada342cd59e3e5173b007c509e1e8e990dafc830294d9dc5" +checksum = "8c21d3b5e7cadfe9ba7cdc1295f72cc556c750b4419c27c219c0693198901f8e" dependencies = [ "ahash", "atoi", @@ -1840,6 +1782,7 @@ dependencies = [ "crc", "crossbeam-queue", "dirs", + "dotenvy", "either", "event-listener", "futures-channel", @@ -1861,6 +1804,7 @@ dependencies = [ "percent-encoding", "rand", "rustls", + "rustls-pemfile", "serde 1.0.143", "serde_json", "sha-1", @@ -1870,21 +1814,20 @@ dependencies = [ "sqlx-rt", "stringprep", "thiserror", - "time 0.2.27", + "time", "tokio-stream", "url", - "webpki", "webpki-roots", "whoami", ] [[package]] name = "sqlx-macros" -version = "0.5.13" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0fba2b0cae21fc00fe6046f8baa4c7fcb49e379f0f592b04696607f69ed2e1" +checksum = "4adfd2df3557bddd3b91377fc7893e8fa899e9b4061737cbade4e1bb85f1b45c" dependencies = [ - "dotenv", + "dotenvy", "either", "heck", "hex", @@ -1902,80 +1845,21 @@ dependencies = [ [[package]] name = "sqlx-rt" -version = "0.5.13" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4db708cd3e459078f85f39f96a00960bd841f66ee2a669e90bf36907f5a79aae" +checksum = "7be52fc7c96c136cedea840ed54f7d446ff31ad670c9dea95ebcb998530971a3" dependencies = [ - "actix-rt", "once_cell", "tokio", "tokio-rustls", ] -[[package]] -name = "standback" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" -dependencies = [ - "version_check", -] - [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version 0.2.3", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -dependencies = [ - "proc-macro2", - "quote", - "serde 1.0.143", - "serde_derive", - "syn", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2", - "quote", - "serde 1.0.143", - "serde_derive", - "serde_json", - "sha1 0.6.1", - "syn", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" - [[package]] name = "string_cache" version = "0.8.4" @@ -2081,21 +1965,6 @@ dependencies = [ "syn", ] -[[package]] -name = "time" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" -dependencies = [ - "const_fn", - "libc", - "standback", - "stdweb", - "time-macros 0.1.1", - "version_check", - "winapi", -] - [[package]] name = "time" version = "0.3.13" @@ -2105,17 +1974,7 @@ dependencies = [ "itoa", "libc", "num_threads", - "time-macros 0.2.4", -] - -[[package]] -name = "time-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" -dependencies = [ - "proc-macro-hack", - "time-macros-impl", + "time-macros", ] [[package]] @@ -2124,19 +1983,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" -[[package]] -name = "time-macros-impl" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" -dependencies = [ - "proc-macro-hack", - "proc-macro2", - "quote", - "standback", - "syn", -] - [[package]] name = "tinyvec" version = "1.6.0" @@ -2174,9 +2020,9 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.22.0" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ "rustls", "tokio", @@ -2422,9 +2268,9 @@ dependencies = [ [[package]] name = "webpki" -version = "0.21.4" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" dependencies = [ "ring", "untrusted", @@ -2432,9 +2278,9 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.21.1" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf" dependencies = [ "webpki", ] diff --git a/Cargo.toml b/Cargo.toml index bdcd381..6703565 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,14 +23,14 @@ argon2-creds = { branch = "master", git = "https://github.com/realaravinth/argon config = "0.11" derive_more = "0.99.17" url = { version = "2.2.2", features = ["serde"]} -serde_json = "1" -sqlx = { version = "0.5.13", features = [ "runtime-actix-rustls", "postgres", "time", "offline" ] } +serde_json = { version ="1", features = ["raw_value"]} +sqlx = { version = "0.6.1", features = [ "runtime-actix-rustls", "postgres", "time", "offline", "json"] } clap = { vesrion = "3.2.20", features = ["derive"]} [build-dependencies] serde_json = "1" -sqlx = { version = "0.5.13", features = [ "runtime-actix-rustls", "postgres", "time", "offline"] } +sqlx = { version = "0.6.1", features = [ "runtime-actix-rustls", "postgres", "time", "offline"] } [dev-dependencies] actix-rt = "2.7.0" diff --git a/build.rs b/build.rs index 904577c..3880bf3 100644 --- a/build.rs +++ b/build.rs @@ -27,6 +27,11 @@ fn main() { let git_hash = String::from_utf8(output.stdout).unwrap(); println!("cargo:rustc-env=GIT_HASH={}", git_hash); - let now = OffsetDateTime::now_utc().format("%y-%m-%d"); - println!("cargo:rustc-env=COMPILED_DATE={}", &now); + let now = OffsetDateTime::now_utc(); + println!( + "cargo:rustc-env=COMPILED_DATE={}-{}-{}", + now.year(), + now.month(), + now.day() + ); } diff --git a/migrations/20220909135248_forms_submissions.sql b/migrations/20220909135248_forms_submissions.sql new file mode 100644 index 0000000..a859130 --- /dev/null +++ b/migrations/20220909135248_forms_submissions.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS forms_submissions ( + ID SERIAL PRIMARY KEY NOT NULL, + website_path VARCHAR(2500) NOT NULL, + value JSONB, + time timestamptz NOT NULL DEFAULT now(), + website_id INTEGER NOT NULL references forms_websites(ID) ON DELETE CASCADE +) diff --git a/sqlx-data.json b/sqlx-data.json index 96019db..e797f0e 100644 --- a/sqlx-data.json +++ b/sqlx-data.json @@ -1,5 +1,20 @@ { "db": "PostgreSQL", + "d104afb356962d24a0f950243db587a5bebeeb43edcac36da7eebe0ed3b27f5e": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Left": [ + "Varchar", + "Jsonb", + "Timestamptz", + "Text" + ] + } + }, + "query": "\n INSERT INTO forms_submissions (website_path, value, time, website_id)\n VALUES ($1, $2, $3, (SELECT ID from forms_websites WHERE hostname = $4));\n " + }, "d184df863185d97345d5de3b80823312053a7a38316fd8b3c8fdd32d9a29644a": { "describe": { "columns": [], diff --git a/src/api/v1/forms.rs b/src/api/v1/forms.rs index dd5731e..227254d 100644 --- a/src/api/v1/forms.rs +++ b/src/api/v1/forms.rs @@ -67,11 +67,13 @@ async fn upload( ctx: AppCtx, payload: web::Either, web::Form>, ) -> ServiceResult { - let c = req.connection_info(); - let host = c.host(); + let host = { + let c = req.connection_info(); + c.host().to_owned() + }; let path = req.uri(); - ctx.db.add_site(host).await.unwrap(); + //ctx.db.add_site(host).await.unwrap(); let data = match payload { web::Either::Left(json) => json.into_inner(), web::Either::Right(form) => { @@ -83,6 +85,11 @@ async fn upload( } }; + ctx.db + .add_form_submission(&data, &host, path.path()) + .await + .unwrap(); + println!("{:?}", data); //ctx.gitea.report(&payload).await; Ok(HttpResponse::Ok().json(data)) @@ -96,7 +103,6 @@ pub mod tests { }; use super::*; - use crate::*; #[derive(Serialize, Clone, Deserialize, PartialEq)] struct Foo { @@ -144,6 +150,7 @@ pub mod tests { let upload_form = test::call_service( &app, test::TestRequest::post() + .uri(API_V1_ROUTES.forms.submit) .uri(API_V1_ROUTES.forms.submit) .set_form(&foo) .to_request(), diff --git a/src/db.rs b/src/db.rs index 10203d7..4576b25 100644 --- a/src/db.rs +++ b/src/db.rs @@ -17,7 +17,8 @@ use std::str::FromStr; use sqlx::postgres::PgPoolOptions; -//use sqlx::types::time::OffsetDateTime; +use sqlx::types::time::OffsetDateTime; +//use sqlx::types::Json; use sqlx::ConnectOptions; use sqlx::PgPool; @@ -113,6 +114,38 @@ impl Database { // res.map_err(map_register_err)?; Ok(()) } + + pub async fn add_form_submission( + &self, + data: &serde_json::Value, + host: &str, + path: &str, + ) -> ServiceResult<()> { + let now = now_unix_time_stamp(); + self.add_site(host).await?; + + //let data = Json(data); + + sqlx::query!( + " + INSERT INTO forms_submissions (website_path, value, time, website_id) + VALUES ($1, $2, $3, (SELECT ID from forms_websites WHERE hostname = $4)); + ", + path, + data, + now, + host, + ) + .execute(&self.pool) + .await + .unwrap(); + + Ok(()) + } +} + +fn now_unix_time_stamp() -> OffsetDateTime { + OffsetDateTime::now_utc() } pub async fn get_db(settings: &crate::settings::Settings) -> Database { @@ -155,6 +188,10 @@ mod tests { db.add_site(url).await.unwrap(); // ensuring add_site doesn't fail when record exists db.add_site(url).await.unwrap(); + + db.add_form_submission(&serde_json::Value::default(), url, "/foo") + .await + .unwrap(); } } }