From 6234cf18e89ff82b32e092ab87ec88cbd71e41fb Mon Sep 17 00:00:00 2001 From: kjuulh Date: Mon, 3 Oct 2022 23:00:31 +0200 Subject: [PATCH] Add initial services --- Cargo.lock | 726 +++++++++++++++++- Cargo.toml | 2 +- como_bin/Cargo.toml | 4 + como_bin/src/graphql.rs | 71 +- como_bin/src/main.rs | 1 + como_core/Cargo.toml | 22 + como_core/src/items/mod.rs | 8 + como_core/src/lib.rs | 5 +- como_core/src/projects/mod.rs | 8 + como_core/src/users/mod.rs | 8 + como_infrastructure/Cargo.toml | 36 + .../20220808220223_initial_migration.sql | 0 como_infrastructure/src/configs/mod.rs | 18 + como_infrastructure/src/database/mod.rs | 33 + como_infrastructure/src/lib.rs | 5 + como_infrastructure/src/register.rs | 38 + como_infrastructure/src/repositories/mod.rs | 0 .../src/services/item_service.rs | 11 + como_infrastructure/src/services/mod.rs | 3 + .../src/services/project_service.rs | 11 + .../src/services/user_service.rs | 11 + scripts/migrate_como.sh | 2 +- 22 files changed, 932 insertions(+), 91 deletions(-) create mode 100644 como_core/src/items/mod.rs create mode 100644 como_core/src/projects/mod.rs create mode 100644 como_core/src/users/mod.rs create mode 100644 como_infrastructure/Cargo.toml rename {como_bin/db => como_infrastructure}/migrations/20220808220223_initial_migration.sql (100%) create mode 100644 como_infrastructure/src/configs/mod.rs create mode 100644 como_infrastructure/src/database/mod.rs create mode 100644 como_infrastructure/src/lib.rs create mode 100644 como_infrastructure/src/register.rs create mode 100644 como_infrastructure/src/repositories/mod.rs create mode 100644 como_infrastructure/src/services/item_service.rs create mode 100644 como_infrastructure/src/services/mod.rs create mode 100644 como_infrastructure/src/services/project_service.rs create mode 100644 como_infrastructure/src/services/user_service.rs diff --git a/Cargo.lock b/Cargo.lock index 2b54c4c..0d43380 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -135,6 +135,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + [[package]] name = "ascii_utils" version = "0.9.3" @@ -305,6 +311,15 @@ dependencies = [ "syn", ] +[[package]] +name = "atoi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5" +dependencies = [ + "num-traits", +] + [[package]] name = "atoi" version = "1.0.0" @@ -314,6 +329,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + [[package]] name = "autocfg" version = "1.1.0" @@ -405,6 +431,12 @@ dependencies = [ "tracing", ] +[[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" @@ -441,6 +473,17 @@ dependencies = [ "digest 0.10.3", ] +[[package]] +name = "blake2b_simd" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72936ee4afc7f8f736d1c38383b56480b5497b4617b4a77bdbf1d2ababc76127" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "constant_time_eq", +] + [[package]] name = "blake3" version = "0.3.8" @@ -448,7 +491,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3" dependencies = [ "arrayref", - "arrayvec", + "arrayvec 0.5.2", "cc", "cfg-if 0.1.10", "constant_time_eq", @@ -557,6 +600,45 @@ dependencies = [ "inout", ] +[[package]] +name = "clap" +version = "3.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86447ad904c7fb335a790c9d7fe3d0d971dc523b8ccd1561a520de9a85302750" +dependencies = [ + "atty", + "bitflags", + "clap_derive", + "clap_lex", + "indexmap", + "once_cell", + "strsim", + "termcolor", + "textwrap", +] + +[[package]] +name = "clap_derive" +version = "3.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "como_bin" version = "0.1.0" @@ -568,12 +650,15 @@ dependencies = [ "axum", "axum-extra", "axum-sessions", + "como_core", + "como_domain", + "como_infrastructure", "cookie", "dotenv", "rand_core", "serde", "serde_json", - "sqlx", + "sqlx 0.6.1", "tokio", "tower-http", "tracing", @@ -584,6 +669,24 @@ dependencies = [ [[package]] name = "como_core" version = "0.1.0" +dependencies = [ + "anyhow", + "async-trait", + "axum", + "clap", + "dotenv", + "mockall", + "rust-argon2", + "serde", + "serde_json", + "sqlx 0.5.13", + "thiserror", + "time 0.2.27", + "tokio", + "tracing", + "tracing-subscriber", + "validator", +] [[package]] name = "como_domain" @@ -595,6 +698,39 @@ dependencies = [ "uuid", ] +[[package]] +name = "como_infrastructure" +version = "0.1.0" +dependencies = [ + "anyhow", + "argon2", + "async-graphql", + "async-graphql-axum", + "axum", + "axum-extra", + "axum-sessions", + "clap", + "como_core", + "como_domain", + "cookie", + "dotenv", + "rand_core", + "serde", + "serde_json", + "sqlx 0.6.1", + "tokio", + "tower-http", + "tracing", + "tracing-subscriber", + "uuid", +] + +[[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" @@ -615,7 +751,7 @@ dependencies = [ "rand", "sha2 0.10.2", "subtle", - "time", + "time 0.3.14", "version_check", ] @@ -634,15 +770,30 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" +dependencies = [ + "crc-catalog 1.1.1", +] + [[package]] name = "crc" version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" dependencies = [ - "crc-catalog", + "crc-catalog 2.1.0", ] +[[package]] +name = "crc-catalog" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" + [[package]] name = "crc-catalog" version = "2.1.0" @@ -753,6 +904,12 @@ dependencies = [ "syn", ] +[[package]] +name = "difflib" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" + [[package]] name = "digest" version = "0.9.0" @@ -793,6 +950,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "discard" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" + [[package]] name = "dotenv" version = "0.15.0" @@ -808,6 +971,12 @@ dependencies = [ "dirs", ] +[[package]] +name = "downcast" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" + [[package]] name = "either" version = "1.7.0" @@ -860,6 +1029,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + [[package]] name = "fnv" version = "1.0.7" @@ -876,6 +1054,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fragile" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85dcb89d2b10c5f6133de2efd8c11959ce9dbb46a2f7a4cab208c4eeda6ce1ab" + [[package]] name = "futures" version = "0.3.24" @@ -1007,6 +1191,15 @@ dependencies = [ "polyval", ] +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1016,13 +1209,22 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashlink" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +dependencies = [ + "hashbrown 0.11.2", +] + [[package]] name = "hashlink" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d452c155cb93fecdfb02a73dd57b5d8e442c2063bd7aac72f1bc5e4263a43086" dependencies = [ - "hashbrown", + "hashbrown 0.12.3", ] [[package]] @@ -1038,7 +1240,7 @@ dependencies = [ "http", "httpdate", "mime", - "sha1", + "sha1 0.10.4", ] [[package]] @@ -1195,6 +1397,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "if_chain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" + [[package]] name = "indexmap" version = "1.9.1" @@ -1202,7 +1410,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", "serde", ] @@ -1367,6 +1575,33 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "mockall" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2be9a9090bc1cac2930688fa9478092a64c6a92ddc6ae0692d46b37d9cab709" +dependencies = [ + "cfg-if 1.0.0", + "downcast", + "fragile", + "lazy_static", + "mockall_derive", + "predicates", + "predicates-tree", +] + +[[package]] +name = "mockall_derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86d702a0530a0141cf4ed147cf5ec7be6f2c187d4e37fcbefc39cf34116bfe8f" +dependencies = [ + "cfg-if 1.0.0", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "multer" version = "2.0.3" @@ -1395,6 +1630,12 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "normalize-line-endings" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" + [[package]] name = "num-integer" version = "0.1.45" @@ -1445,6 +1686,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "os_str_bytes" +version = "6.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" + [[package]] name = "parking_lot" version = "0.11.2" @@ -1576,6 +1823,36 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" +[[package]] +name = "predicates" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c" +dependencies = [ + "difflib", + "float-cmp", + "itertools", + "normalize-line-endings", + "predicates-core", + "regex", +] + +[[package]] +name = "predicates-core" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da1c2388b1513e1b605fcec39a95e0a9e8ef088f71443ef37099fa9ae6673fcb" + +[[package]] +name = "predicates-tree" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032" +dependencies = [ + "predicates-core", + "termtree", +] + [[package]] name = "proc-macro-crate" version = "1.2.1" @@ -1587,6 +1864,36 @@ dependencies = [ "toml", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "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" @@ -1705,6 +2012,40 @@ dependencies = [ "winapi", ] +[[package]] +name = "rust-argon2" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50162d19404029c1ceca6f6980fe40d45c8b369f6f44446fa14bb39573b5bb9" +dependencies = [ + "base64", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils", +] + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64", + "log", + "ring", + "sct 0.6.1", + "webpki 0.21.4", +] + [[package]] name = "rustls" version = "0.20.6" @@ -1713,8 +2054,8 @@ checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" dependencies = [ "log", "ring", - "sct", - "webpki", + "sct 0.7.0", + "webpki 0.22.0", ] [[package]] @@ -1738,6 +2079,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "sct" version = "0.7.0" @@ -1748,6 +2099,21 @@ dependencies = [ "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-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + [[package]] name = "serde" version = "1.0.142" @@ -1802,6 +2168,15 @@ dependencies = [ "digest 0.10.3", ] +[[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.4" @@ -1813,6 +2188,12 @@ dependencies = [ "digest 0.10.3", ] +[[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.9.9" @@ -1903,39 +2284,48 @@ dependencies = [ "unicode_categories", ] +[[package]] +name = "sqlx" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "551873805652ba0d912fec5bbb0f8b4cdd96baf8e2ebf5970e5671092966019b" +dependencies = [ + "sqlx-core 0.5.13", + "sqlx-macros 0.5.13", +] + [[package]] name = "sqlx" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "788841def501aabde58d3666fcea11351ec3962e6ea75dbcd05c84a71d68bcd1" dependencies = [ - "sqlx-core", - "sqlx-macros", + "sqlx-core 0.6.1", + "sqlx-macros 0.6.1", ] [[package]] name = "sqlx-core" -version = "0.6.1" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d3b5e7cadfe9ba7cdc1295f72cc556c750b4419c27c219c0693198901f8e" +checksum = "e48c61941ccf5ddcada342cd59e3e5173b007c509e1e8e990dafc830294d9dc5" dependencies = [ "ahash", - "atoi", + "atoi 0.4.0", "base64", "bitflags", "byteorder", "bytes", - "crc", + "crc 2.1.0", "crossbeam-queue", "dirs", - "dotenvy", "either", "event-listener", "futures-channel", "futures-core", "futures-intrusive", "futures-util", - "hashlink", + "hashlink 0.7.0", "hex", "hkdf", "hmac 0.12.1", @@ -1949,7 +2339,61 @@ dependencies = [ "paste", "percent-encoding", "rand", - "rustls", + "rustls 0.19.1", + "serde", + "serde_json", + "sha-1", + "sha2 0.10.2", + "smallvec", + "sqlformat", + "sqlx-rt 0.5.13", + "stringprep", + "thiserror", + "time 0.2.27", + "tokio-stream", + "url", + "webpki 0.21.4", + "webpki-roots 0.21.1", + "whoami", +] + +[[package]] +name = "sqlx-core" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c21d3b5e7cadfe9ba7cdc1295f72cc556c750b4419c27c219c0693198901f8e" +dependencies = [ + "ahash", + "atoi 1.0.0", + "base64", + "bitflags", + "byteorder", + "bytes", + "crc 3.0.0", + "crossbeam-queue", + "dirs", + "dotenvy", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-util", + "hashlink 0.8.0", + "hex", + "hkdf", + "hmac 0.12.1", + "indexmap", + "itoa", + "libc", + "log", + "md-5", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "rand", + "rustls 0.20.6", "rustls-pemfile", "serde", "serde_json", @@ -1957,16 +2401,35 @@ dependencies = [ "sha2 0.10.2", "smallvec", "sqlformat", - "sqlx-rt", + "sqlx-rt 0.6.1", "stringprep", "thiserror", "tokio-stream", "url", "uuid", - "webpki-roots", + "webpki-roots 0.22.4", "whoami", ] +[[package]] +name = "sqlx-macros" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc0fba2b0cae21fc00fe6046f8baa4c7fcb49e379f0f592b04696607f69ed2e1" +dependencies = [ + "dotenv", + "either", + "heck", + "once_cell", + "proc-macro2", + "quote", + "sha2 0.10.2", + "sqlx-core 0.5.13", + "sqlx-rt 0.5.13", + "syn", + "url", +] + [[package]] name = "sqlx-macros" version = "0.6.1" @@ -1983,12 +2446,23 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.2", - "sqlx-core", - "sqlx-rt", + "sqlx-core 0.6.1", + "sqlx-rt 0.6.1", "syn", "url", ] +[[package]] +name = "sqlx-rt" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4db708cd3e459078f85f39f96a00960bd841f66ee2a669e90bf36907f5a79aae" +dependencies = [ + "once_cell", + "tokio", + "tokio-rustls 0.22.0", +] + [[package]] name = "sqlx-rt" version = "0.6.1" @@ -1997,7 +2471,16 @@ checksum = "7be52fc7c96c136cedea840ed54f7d446ff31ad670c9dea95ebcb998530971a3" dependencies = [ "once_cell", "tokio", - "tokio-rustls", + "tokio-rustls 0.23.4", +] + +[[package]] +name = "standback" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" +dependencies = [ + "version_check", ] [[package]] @@ -2006,6 +2489,55 @@ 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", + "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", + "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", + "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 = "stringprep" version = "0.1.2" @@ -2059,6 +2591,27 @@ dependencies = [ "winapi", ] +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "termtree" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b" + +[[package]] +name = "textwrap" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16" + [[package]] name = "thiserror" version = "1.0.32" @@ -2088,6 +2641,21 @@ dependencies = [ "once_cell", ] +[[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.14" @@ -2097,7 +2665,17 @@ dependencies = [ "itoa", "libc", "num_threads", - "time-macros", + "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", ] [[package]] @@ -2106,6 +2684,19 @@ 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" @@ -2153,15 +2744,26 @@ dependencies = [ "syn", ] +[[package]] +name = "tokio-rustls" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +dependencies = [ + "rustls 0.19.1", + "tokio", + "webpki 0.21.4", +] + [[package]] name = "tokio-rustls" version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ - "rustls", + "rustls 0.20.6", "tokio", - "webpki", + "webpki 0.22.0", ] [[package]] @@ -2455,6 +3057,48 @@ dependencies = [ "serde", ] +[[package]] +name = "validator" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f07b0a1390e01c0fc35ebb26b28ced33c9a3808f7f9fbe94d3cc01e233bfeed5" +dependencies = [ + "idna", + "lazy_static", + "regex", + "serde", + "serde_derive", + "serde_json", + "url", + "validator_derive", +] + +[[package]] +name = "validator_derive" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea7ed5e8cf2b6bdd64a6c4ce851da25388a89327b17b88424ceced6bd5017923" +dependencies = [ + "if_chain", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", + "regex", + "syn", + "validator_types", +] + +[[package]] +name = "validator_types" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ddf34293296847abfc1493b15c6e2f5d3cd19f57ad7d22673bf4c6278da329" +dependencies = [ + "proc-macro2", + "syn", +] + [[package]] name = "valuable" version = "0.1.0" @@ -2547,6 +3191,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "webpki" version = "0.22.0" @@ -2557,13 +3211,22 @@ dependencies = [ "untrusted", ] +[[package]] +name = "webpki-roots" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +dependencies = [ + "webpki 0.21.4", +] + [[package]] name = "webpki-roots" version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf" dependencies = [ - "webpki", + "webpki 0.22.0", ] [[package]] @@ -2592,6 +3255,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 37ecdb0..64a846e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,2 +1,2 @@ [workspace] -members = ["como_bin", "como_core", "como_domain"] +members = ["como_bin", "como_core", "como_domain", "como_infrastructure"] diff --git a/como_bin/Cargo.toml b/como_bin/Cargo.toml index ccc41cd..a3b4516 100644 --- a/como_bin/Cargo.toml +++ b/como_bin/Cargo.toml @@ -6,6 +6,10 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +como_core = { path = "../como_core" } +como_domain = { path = "../como_domain" } +como_infrastructure = { path = "../como_infrastructure" } + async-graphql = "4.0.6" async-graphql-axum = "*" axum = "0.5.13" diff --git a/como_bin/src/graphql.rs b/como_bin/src/graphql.rs index bbc78b0..ceda14b 100644 --- a/como_bin/src/graphql.rs +++ b/como_bin/src/graphql.rs @@ -1,7 +1,6 @@ -use async_graphql::{Context, EmptySubscription, Object, Schema, SimpleObject}; +use async_graphql::{Context, EmptySubscription, Object, Schema}; - -use uuid::Uuid; +use como_domain::item::{requests::CreateItemDto, responses::CreatedItemDto}; use crate::services::users_service::UserService; @@ -40,67 +39,19 @@ impl MutationRoot { Ok(user_id) } + + async fn create_item( + &self, + ctx: &Context<'_>, + item: CreateItemDto, + ) -> anyhow::Result { + let services_register = ctx.data_unchecked::() + } } pub struct QueryRoot; #[Object] impl QueryRoot { - async fn get_upcoming(&self, _ctx: &Context<'_>) -> Vec { - vec![Event::new( - None, - "Some-name".into(), - None, - None, - EventDate::new(2022, 08, 08, 23, 51), - )] - } -} - -#[derive(SimpleObject)] -pub struct Event { - pub id: String, - pub name: String, - pub description: Option>, - pub location: Option, - pub date: EventDate, -} - -impl Event { - pub fn new( - id: Option, - name: String, - description: Option>, - location: Option, - date: EventDate, - ) -> Self { - Self { - id: id.unwrap_or_else(|| Uuid::new_v4().to_string()), - name, - description, - location, - date, - } - } -} - -#[derive(SimpleObject)] -pub struct EventDate { - pub year: u32, - pub month: u32, - pub day: u32, - pub hour: u32, - pub minute: u32, -} - -impl EventDate { - pub fn new(year: u32, month: u32, day: u32, hour: u32, minute: u32) -> Self { - Self { - year, - month, - day, - hour, - minute, - } - } + async fn get_upcoming(&self, _ctx: &Context<'_>) -> Vec {} } diff --git a/como_bin/src/main.rs b/como_bin/src/main.rs index 1b394a9..71a0f40 100644 --- a/como_bin/src/main.rs +++ b/como_bin/src/main.rs @@ -41,6 +41,7 @@ async fn graphql_handler( req: GraphQLRequest, ) -> Result { let req = req.into_inner(); + //if let Some(user_id) = session.get::("userId") { // req = req.data(user_id); return Ok(schema.execute(req).await.into()); diff --git a/como_core/Cargo.toml b/como_core/Cargo.toml index 9beac69..dd72add 100644 --- a/como_core/Cargo.toml +++ b/como_core/Cargo.toml @@ -6,3 +6,25 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +tokio = { version = "1", features = ["full"] } +axum = "0.5.1" + +# utilty crates +serde = { version = "1.0.136", features = ["derive"] } +sqlx = { version = "0.5", features = [ + "runtime-tokio-rustls", + "postgres", + "time", +] } +serde_json = "1.0.81" +dotenv = "0.15.0" +tracing = "0.1" +tracing-subscriber = "0.3" +anyhow = "1" +validator = { version = "0.15", features = ["derive"] } +async-trait = "0.1" +thiserror = "1" +rust-argon2 = "1.0" +clap = { version = "3", features = ["derive", "env"] } +mockall = "0.11.1" +time = "0.2" diff --git a/como_core/src/items/mod.rs b/como_core/src/items/mod.rs new file mode 100644 index 0000000..f274129 --- /dev/null +++ b/como_core/src/items/mod.rs @@ -0,0 +1,8 @@ +use std::sync::Arc; + +use async_trait::async_trait; + +pub type DynItemService = Arc; + +#[async_trait] +pub trait ItemService {} diff --git a/como_core/src/lib.rs b/como_core/src/lib.rs index 139597f..e6c9402 100644 --- a/como_core/src/lib.rs +++ b/como_core/src/lib.rs @@ -1,2 +1,3 @@ - - +pub mod items; +pub mod projects; +pub mod users; diff --git a/como_core/src/projects/mod.rs b/como_core/src/projects/mod.rs new file mode 100644 index 0000000..a203790 --- /dev/null +++ b/como_core/src/projects/mod.rs @@ -0,0 +1,8 @@ +use std::sync::Arc; + +use async_trait::async_trait; + +pub type DynProjectService = Arc; + +#[async_trait] +pub trait ProjectService {} diff --git a/como_core/src/users/mod.rs b/como_core/src/users/mod.rs new file mode 100644 index 0000000..a9ca003 --- /dev/null +++ b/como_core/src/users/mod.rs @@ -0,0 +1,8 @@ +use std::sync::Arc; + +use async_trait::async_trait; + +pub type DynUserService = Arc; + +#[async_trait] +pub trait UserService {} diff --git a/como_infrastructure/Cargo.toml b/como_infrastructure/Cargo.toml new file mode 100644 index 0000000..7c22b00 --- /dev/null +++ b/como_infrastructure/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "como_infrastructure" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +como_core = { path = "../como_core" } +como_domain = { path = "../como_domain" } + +async-graphql = "4.0.6" +async-graphql-axum = "*" +axum = "0.5.13" +axum-extra = { version = "*", features = ["cookie", "cookie-private"] } +axum-sessions = { version = "*" } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0.68" +tokio = { version = "1.20.1", features = ["full"] } +uuid = { version = "1.1.2", features = ["v4", "fast-rng"] } +sqlx = { version = "0.6", features = [ + "runtime-tokio-rustls", + "postgres", + "migrate", + "uuid", + "offline", +] } +anyhow = "1.0.60" +dotenv = "0.15.0" +tracing = "0.1.36" +tracing-subscriber = { version = "0.3.15", features = ["env-filter"] } +tower-http = { version = "0.3.4", features = ["full"] } +argon2 = "0.4" +rand_core = { version = "0.6", features = ["std"] } +cookie = { version = "0.16", features = ["secure", "percent-encode"] } +clap = { version = "3", features = ["derive", "env"] } diff --git a/como_bin/db/migrations/20220808220223_initial_migration.sql b/como_infrastructure/migrations/20220808220223_initial_migration.sql similarity index 100% rename from como_bin/db/migrations/20220808220223_initial_migration.sql rename to como_infrastructure/migrations/20220808220223_initial_migration.sql diff --git a/como_infrastructure/src/configs/mod.rs b/como_infrastructure/src/configs/mod.rs new file mode 100644 index 0000000..f34043d --- /dev/null +++ b/como_infrastructure/src/configs/mod.rs @@ -0,0 +1,18 @@ +#[derive(clap::Parser)] +pub struct AppConfig { + #[clap(long, env)] + pub database_url: String, + #[clap(long, env)] + pub rust_log: String, + #[clap(long, env)] + pub token_secret: String, + #[clap(long, env)] + pub port: u32, + #[clap(long, env)] + pub run_migrations: bool, + #[clap(long, env)] + pub seed: bool, + #[clap(long, env)] + pub cors_origin: String, +} + diff --git a/como_infrastructure/src/database/mod.rs b/como_infrastructure/src/database/mod.rs new file mode 100644 index 0000000..8ed0a25 --- /dev/null +++ b/como_infrastructure/src/database/mod.rs @@ -0,0 +1,33 @@ +use anyhow::Context; +use sqlx::{postgres::PgPoolOptions, Pool, Postgres}; +use tracing::log::info; + +pub type ConnectionPool = Pool; + +pub struct ConnectionPoolManager; + +impl ConnectionPoolManager { + pub async fn new_pool( + connection_string: &str, + run_migrations: bool, + ) -> anyhow::Result { + info!("initializing the database connection pool"); + let pool = PgPoolOptions::new() + .max_connections(5) + .connect(connection_string) + .await + .context("error while initializing the database connection pool")?; + + if run_migrations { + info!("migrations enabled"); + info!("migrating database"); + + sqlx::migrate!() + .run(&pool) + .await + .context("error while running database migrations"); + } + + Ok(pool) + } +} diff --git a/como_infrastructure/src/lib.rs b/como_infrastructure/src/lib.rs new file mode 100644 index 0000000..57c08eb --- /dev/null +++ b/como_infrastructure/src/lib.rs @@ -0,0 +1,5 @@ +pub mod configs; +pub mod database; +pub mod register; +pub mod repositories; +pub mod services; diff --git a/como_infrastructure/src/register.rs b/como_infrastructure/src/register.rs new file mode 100644 index 0000000..88ec1e8 --- /dev/null +++ b/como_infrastructure/src/register.rs @@ -0,0 +1,38 @@ +use std::sync::Arc; + +use como_core::{items::DynItemService, projects::DynProjectService, users::DynUserService}; +use tracing::log::info; + +use crate::{ + configs::AppConfig, + database::ConnectionPool, + services::{ + item_service::DefaultItemService, project_service::DefaultProjectService, + user_service::DefaultUserService, + }, +}; + +#[derive(Clone)] +pub struct ServiceRegister { + pub item_service: DynItemService, + pub project_service: DynProjectService, + pub user_service: DynUserService, +} + +impl ServiceRegister { + pub fn new(_pool: ConnectionPool, _config: AppConfig) -> Self { + info!("creating services"); + + let item_service = Arc::new(DefaultItemService::new()) as DynItemService; + let project_service = Arc::new(DefaultProjectService::new()) as DynProjectService; + let user_service = Arc::new(DefaultUserService::new()) as DynUserService; + + info!("services created succesfully"); + + return Self { + item_service, + user_service, + project_service, + }; + } +} diff --git a/como_infrastructure/src/repositories/mod.rs b/como_infrastructure/src/repositories/mod.rs new file mode 100644 index 0000000..e69de29 diff --git a/como_infrastructure/src/services/item_service.rs b/como_infrastructure/src/services/item_service.rs new file mode 100644 index 0000000..e29094a --- /dev/null +++ b/como_infrastructure/src/services/item_service.rs @@ -0,0 +1,11 @@ +use como_core::items::ItemService; + +pub struct DefaultItemService {} + +impl DefaultItemService { + pub fn new() -> Self { + Self {} + } +} + +impl ItemService for DefaultItemService {} diff --git a/como_infrastructure/src/services/mod.rs b/como_infrastructure/src/services/mod.rs new file mode 100644 index 0000000..4e60f07 --- /dev/null +++ b/como_infrastructure/src/services/mod.rs @@ -0,0 +1,3 @@ +pub mod item_service; +pub mod project_service; +pub mod user_service; diff --git a/como_infrastructure/src/services/project_service.rs b/como_infrastructure/src/services/project_service.rs new file mode 100644 index 0000000..23e7384 --- /dev/null +++ b/como_infrastructure/src/services/project_service.rs @@ -0,0 +1,11 @@ +use como_core::projects::ProjectService; + +pub struct DefaultProjectService {} + +impl DefaultProjectService { + pub fn new() -> Self { + Self {} + } +} + +impl ProjectService for DefaultProjectService {} diff --git a/como_infrastructure/src/services/user_service.rs b/como_infrastructure/src/services/user_service.rs new file mode 100644 index 0000000..5869b7f --- /dev/null +++ b/como_infrastructure/src/services/user_service.rs @@ -0,0 +1,11 @@ +use como_core::users::UserService; + +pub struct DefaultUserService {} + +impl DefaultUserService { + pub fn new() -> Self { + Self {} + } +} + +impl UserService for DefaultUserService {} diff --git a/scripts/migrate_como.sh b/scripts/migrate_como.sh index 2a49ce8..1c4b17a 100755 --- a/scripts/migrate_como.sh +++ b/scripts/migrate_como.sh @@ -2,5 +2,5 @@ export $(cat .env | xargs) -cargo sqlx migrate run --source como_bin/db/migrations --database-url=$DATABASE_URL +cargo sqlx migrate run --source como_infrastructure/migrations --database-url=$DATABASE_URL