From f267d6b2857a6359b241c6ad7ab0644dc7330287 Mon Sep 17 00:00:00 2001 From: Louis Hollingworth Date: Thu, 26 Oct 2023 12:58:06 +0100 Subject: [PATCH] (feat) Users can now be created. Having issues with fetching users; switch to sqlx? Signed-off-by: Louis Hollingworth --- Cargo.lock | 343 ++++++++++++++++-- Cargo.toml | 6 +- .../2023-10-15-172140_create_users/up.sql | 3 +- src/lib.rs | 14 + src/main.rs | 121 +++++- src/models.rs | 19 +- src/schema.rs | 6 +- 7 files changed, 470 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3de787b..46357d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -38,6 +38,18 @@ dependencies = [ "libc", ] +[[package]] +name = "argon2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ba4cac0a46bc1d2912652a751c47f2a9f3a7fe89bcae2275d418f5270402f9" +dependencies = [ + "base64ct", + "blake2", + "cpufeatures", + "password-hash", +] + [[package]] name = "async-trait" version = "0.1.74" @@ -139,10 +151,16 @@ dependencies = [ ] [[package]] -name = "bigdecimal" -version = "0.4.1" +name = "base64ct" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "454bca3db10617b88b566f205ed190aedb0e0e6dd4cad61d3988a72e8c5594cb" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bigdecimal" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06619be423ea5bb86c95f087d5707942791a08a85530df0db2209a3ecfb8bc9" dependencies = [ "autocfg", "libm", @@ -159,9 +177,27 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] [[package]] name = "bumpalo" @@ -218,10 +254,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] -name = "deranged" -version = "0.3.8" +name = "cpufeatures" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" +checksum = "3fbc60abd742b35f2492f808e1abbb83d45f72db402e14c55057edc9c7b1e9e4" +dependencies = [ + "libc", +] + +[[package]] +name = "crypto" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf1e6e5492f8f0830c37f301f6349e0dac8b2466e4fe89eef90e9eef906cd046" +dependencies = [ + "crypto-common", + "password-hash", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "deranged" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +dependencies = [ + "powerfmt", +] [[package]] name = "diesel" @@ -230,7 +298,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2268a214a6f118fce1838edba3d1561cf0e78d8de785475957a580a7f8c69d33" dependencies = [ "bigdecimal", - "bitflags 2.4.0", + "bitflags 2.4.1", "byteorder", "chrono", "diesel_derives", @@ -259,6 +327,17 @@ dependencies = [ "syn", ] +[[package]] +name = "diesel_migrations" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6036b3f0120c5961381b570ee20a02432d7e2d27ea60de9578799cf9156914ac" +dependencies = [ + "diesel", + "migrations_internals", + "migrations_macros", +] + [[package]] name = "diesel_table_macro_syntax" version = "0.1.0" @@ -268,20 +347,41 @@ dependencies = [ "syn", ] +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + [[package]] name = "dotenvy" version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "fediblog" version = "0.1.0" dependencies = [ + "argon2", "axum", "chrono", + "crypto", "diesel", + "diesel_migrations", "dotenvy", + "rand", "serde", "serde_json", "tokio", @@ -336,6 +436,16 @@ dependencies = [ "pin-utils", ] +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.2.10" @@ -353,6 +463,12 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +[[package]] +name = "hashbrown" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" + [[package]] name = "heck" version = "0.4.1" @@ -415,7 +531,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -424,16 +540,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows", + "windows-core", ] [[package]] @@ -445,6 +561,16 @@ dependencies = [ "cc", ] +[[package]] +name = "indexmap" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +dependencies = [ + "equivalent", + "hashbrown", +] + [[package]] name = "ipnetwork" version = "0.20.0" @@ -483,9 +609,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -509,6 +635,27 @@ version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +[[package]] +name = "migrations_internals" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f23f71580015254b020e856feac3df5878c2c7a8812297edd6c0a485ac9dada" +dependencies = [ + "serde", + "toml", +] + +[[package]] +name = "migrations_macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce3325ac70e67bbab5bd837a31cae01f1a6db64e0e744a33cb03a543469ef08" +dependencies = [ + "migrations_internals", + "proc-macro2", + "quote", +] + [[package]] name = "mime" version = "0.3.17" @@ -526,9 +673,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "wasi", @@ -602,9 +749,9 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", @@ -613,6 +760,17 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -651,6 +809,18 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "pq-sys" version = "0.4.8" @@ -690,10 +860,40 @@ dependencies = [ ] [[package]] -name = "redox_syscall" -version = "0.3.5" +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] @@ -772,6 +972,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -801,9 +1010,9 @@ checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", @@ -811,14 +1020,20 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", "windows-sys", ] +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + [[package]] name = "syn" version = "2.0.38" @@ -838,11 +1053,12 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "time" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426f806f4089c493dcac0d24c29c01e2c38baf8e30f1b716ee37e83d200b18fe" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ "deranged", + "powerfmt", "serde", "time-core", "time-macros", @@ -877,7 +1093,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.4", + "socket2 0.5.5", "tokio-macros", "windows-sys", ] @@ -893,6 +1109,40 @@ dependencies = [ "syn", ] +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + [[package]] name = "tower" version = "0.4.13" @@ -923,9 +1173,9 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.39" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2ef2af84856a50c1d430afce2fdded0a4ec7eda868db86409b4543df0797f9" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "log", "pin-project-lite", @@ -947,6 +1197,12 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "unicode-ident" version = "1.0.12" @@ -955,9 +1211,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "uuid" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" dependencies = [ "atomic", "getrandom", @@ -970,6 +1226,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "want" version = "0.3.1" @@ -1062,10 +1324,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows" -version = "0.48.0" +name = "windows-core" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ "windows-targets", ] @@ -1135,3 +1397,12 @@ name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "winnow" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" +dependencies = [ + "memchr", +] diff --git a/Cargo.toml b/Cargo.toml index 3a40bf2..5db528f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,10 +15,14 @@ edition = "2021" name = "fediblog" [dependencies] +argon2 = { version = "0.5.2", features = ["password-hash", "std"] } axum = {version = "0.6.20", features = ["macros"]} chrono = {version = "0.4.31", features = ["serde"]} -diesel = { version = "2.1.3", features = ["postgres", "extras", "uuid"] } +crypto = { version = "0.5.1", features = ["password-hash"] } +diesel = { version = "2.1.3", features = ["postgres", "extras", "uuid", "r2d2"] } +diesel_migrations = { version = "2.1.0", features = ["postgres"] } dotenvy = "0.15.7" +rand = "0.8.5" serde = { version = "1.0.189", features = ["derive"] } serde_json = "1.0.107" tokio = { version = "1.33.0", features = ["full"] } diff --git a/migrations/2023-10-15-172140_create_users/up.sql b/migrations/2023-10-15-172140_create_users/up.sql index 1f5e9a2..91b91f9 100644 --- a/migrations/2023-10-15-172140_create_users/up.sql +++ b/migrations/2023-10-15-172140_create_users/up.sql @@ -12,6 +12,7 @@ CREATE TABLE users ( pass VARCHAR NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW(), updated_at TIMESTAMP NOT NULL DEFAULT NOW(), - main_fedi TEXT + main_fedi TEXT, + UNIQUE(username, epost) ); SELECT diesel_manage_updated_at('users'); diff --git a/src/lib.rs b/src/lib.rs index ab924a0..aca851b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,6 +5,8 @@ pub mod models; pub mod schema; use diesel::prelude::*; +pub type DbPool = diesel::r2d2::Pool>; + pub fn establish_connection() -> diesel::pg::PgConnection { dotenvy::dotenv().ok(); @@ -12,3 +14,15 @@ pub fn establish_connection() -> diesel::pg::PgConnection { diesel::pg::PgConnection::establish(&database_url) .unwrap_or_else(|_| panic!("Error connecting to {}", database_url)) } + +pub fn connection_pool() -> DbPool { + dotenvy::dotenv().ok(); + + let database_url = std::env::var("DATABASE_URL").expect("DATABASE_URL must be set"); + let manager = diesel::r2d2::ConnectionManager::::new(database_url); + + diesel::r2d2::Pool::builder() + .test_on_check_out(true) + .build(manager) + .expect("Could not build connection pool") +} diff --git a/src/main.rs b/src/main.rs index 43aec32..858508e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,11 +3,19 @@ * * SPDX-License-Identifier: AGPL-3.0-or-later */ -use axum::{routing::get, Router}; +use argon2::password_hash::{PasswordHasher, SaltString}; +use axum::{routing::{get, post}, Router, response::Json, extract::State}; +use diesel::prelude::*; #[tokio::main] async fn main() { - let app = Router::new().route("/health", get(health_check)); + let pool: fediblog::DbPool = fediblog::connection_pool(); + + let app = Router::new() + .route("/health", get(health_check)) + .route("/api/v0/user", post(create_user)) + .route("/api/v0/user", get(get_user)) + .with_state(pool); axum::Server::bind(&"0.0.0.0:7654".parse().unwrap()) .serve(app.into_make_service()) @@ -15,6 +23,115 @@ async fn main() { .unwrap(); } +#[axum::debug_handler] +async fn create_user( + State(pool): State, + Json(new_user): Json, +) -> Result, (axum::http::StatusCode, String)> { + use fediblog::schema::users::dsl::*; + let argon = argon2::Argon2::default(); + let salt = SaltString::generate(&mut rand::thread_rng()); + let hashed_pass: String = match argon.hash_password(&new_user.pass.into_bytes(), &salt) { + Err(_) => { + return Err(( + axum::http::StatusCode::INTERNAL_SERVER_ERROR, + "Error hashing password".to_string(), + )) + } + Ok(pswd) => pswd.to_string(), + }; + diesel::insert_into(users) + .values(( + username.eq(new_user.username.clone()), + epost.eq(new_user.epost.clone()), + pass.eq(hashed_pass), + )) + .execute(&mut pool.get().unwrap()) + .expect("Error saving new user"); + + let uid = get_userid_from_name(new_user.username.clone(), &mut pool.get().unwrap()); + + match uid { + None => return Err((axum::http::StatusCode::INTERNAL_SERVER_ERROR, "There was an error creating this account".to_string())), + Some(user_id) => return Ok(Json( + UserResponse { + id: user_id, + username: new_user.username, + epost: Some(new_user.epost.to_string()), + main_fedi: None + } + )) + } +} + +fn get_userid_from_name(username: String, pool: &mut diesel::r2d2::PooledConnection>) -> Option { + let uv: Result, diesel::result::Error> = pool.build_transaction().read_only().run(|conn| { + let userv = fediblog::schema::users::dsl::users + .select((fediblog::schema::users::dsl::id, fediblog::schema::users::dsl::username)) + .load::(conn); + Ok(userv.unwrap()) + }); + + find_userid_from_base_user(uv.unwrap(), username) +} + +fn find_userid_from_base_user(usrs: Vec, usrn: String) -> Option { + for u in usrs { + if u.username == usrn { + return Some(u.id); + } + } + None +} + + +async fn get_user( + State(pool): State, + Json(auth_user): Json +) ->Result, (axum::http::StatusCode, String)> { + let conn = &mut pool.get().unwrap(); + + let uid = get_userid_from_name(auth_user.username, conn).unwrap(); + + + let userv = diesel::sql_query(format!("SELECT * FROM users WHERE id = {}", uid.to_string())).load::(conn); + + match userv { + Ok(usrs) => return Ok(Json(UserResponse{ + id: usrs[0].id, + + })) + } + + Ok(Json(UserResponse{ + id: user.id, + username: user.username.clone(), + epost: None, + main_fedi: None + })) +} + async fn health_check() -> &'static str { "Saluton, amiko! Looks like we are running!" } + +#[derive(Clone, serde::Deserialize, serde::Serialize)] +struct NewUser { + username: String, + epost: String, + pass: String, +} + +#[derive(Clone, serde::Deserialize, serde::Serialize)] +struct AuthUser { + username: String, + pass: String, +} + +#[derive(serde::Deserialize, serde::Serialize)] +struct UserResponse { + id: uuid::Uuid, + username: String, + epost: Option, + main_fedi: Option, +} diff --git a/src/models.rs b/src/models.rs index 3463d7d..3923450 100644 --- a/src/models.rs +++ b/src/models.rs @@ -6,7 +6,9 @@ use diesel::prelude::*; use serde::{Deserialize, Serialize}; use uuid::Uuid; -#[derive(Queryable, Selectable, Identifiable, Debug, PartialEq, Serialize, Deserialize)] +#[derive( + Selectable, Debug, Queryable, QueryableByName +)] #[diesel(table_name = crate::schema::users)] #[diesel(check_for_backend(diesel::pg::Pg))] pub struct User { @@ -19,6 +21,21 @@ pub struct User { pub main_fedi: Option, } +#[derive(Queryable, PartialEq, Debug)] +#[diesel(table_name = crate::schema::users)] +pub struct BaseUser { + pub id: Uuid, + pub username: String, +} + +#[derive(Insertable, Debug, Selectable)] +#[diesel(table_name = crate::schema::users)] +pub struct NewUser { + pub username: String, + pub epost: String, + pub pass: String +} + #[derive( Queryable, Selectable, Identifiable, Associations, Debug, PartialEq, Serialize, Deserialize, )] diff --git a/src/schema.rs b/src/schema.rs index c05913f..9614c14 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -47,4 +47,8 @@ diesel::joinable!(blogs -> users (user_id)); diesel::joinable!(posts -> blogs (blog_id)); diesel::joinable!(posts -> users (user_id)); -diesel::allow_tables_to_appear_in_same_query!(blogs, posts, users,); +diesel::allow_tables_to_appear_in_same_query!( + blogs, + posts, + users, +);