Compare commits
No commits in common. "422182f20a0ae354fcc9a534ae8111d46c56f37e" and "ec7fbc07a021d05f0107b2c2ada37b8150f533c4" have entirely different histories.
422182f20a
...
ec7fbc07a0
@ -1,10 +0,0 @@
|
|||||||
**/target/
|
|
||||||
**/.vscode/
|
|
||||||
**/.env
|
|
||||||
**/.git/
|
|
||||||
**/.dockerignore
|
|
||||||
**/Dockerfile
|
|
||||||
**/compose.yaml
|
|
||||||
**/LICENSE
|
|
||||||
**/README.md
|
|
||||||
files/
|
|
104
Cargo.lock
generated
104
Cargo.lock
generated
@ -107,7 +107,7 @@ checksum = "6e0c28dcc82d7c8ead5cb13beb15405b57b8546e93215673ff8ca0349a028107"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -220,7 +220,7 @@ dependencies = [
|
|||||||
"heck 0.4.1",
|
"heck 0.4.1",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -321,13 +321,12 @@ checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.1.12"
|
version = "1.1.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "68064e60dbf1f17005c2fde4d07c16d8baa506fd7ffed8ccab702d93617975c7"
|
checksum = "e9e8aabfac534be767c909e0690571677d49f41bd8465ae876fe043d52ba5292"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"jobserver",
|
"jobserver",
|
||||||
"libc",
|
"libc",
|
||||||
"shlex",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -384,9 +383,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cpufeatures"
|
name = "cpufeatures"
|
||||||
version = "0.2.13"
|
version = "0.2.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad"
|
checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
@ -461,7 +460,7 @@ dependencies = [
|
|||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"strsim",
|
"strsim",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -472,7 +471,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"darling_core",
|
"darling_core",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -678,7 +677,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -975,9 +974,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indexmap"
|
name = "indexmap"
|
||||||
version = "2.4.0"
|
version = "2.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c"
|
checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"equivalent",
|
"equivalent",
|
||||||
"hashbrown",
|
"hashbrown",
|
||||||
@ -1018,9 +1017,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "js-sys"
|
name = "js-sys"
|
||||||
version = "0.3.70"
|
version = "0.3.69"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
|
checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
]
|
]
|
||||||
@ -1148,9 +1147,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mio"
|
name = "mio"
|
||||||
version = "1.0.2"
|
version = "1.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec"
|
checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"hermit-abi",
|
"hermit-abi",
|
||||||
"libc",
|
"libc",
|
||||||
@ -1377,7 +1376,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1732,29 +1731,29 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.207"
|
version = "1.0.206"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "5665e14a49a4ea1b91029ba7d3bca9f299e1f7cfa194388ccc20f14743e784f2"
|
checksum = "5b3e4cd94123dd520a128bcd11e34d9e9e423e7e3e50425cb1b4b1e3549d0284"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde_derive",
|
"serde_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_derive"
|
name = "serde_derive"
|
||||||
version = "1.0.207"
|
version = "1.0.206"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6aea2634c86b0e8ef2cfdc0c340baede54ec27b1e46febd7f80dffb2aa44a00e"
|
checksum = "fabfb6138d2383ea8208cf98ccf69cdfb1aff4088460681d84189aa259762f97"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
version = "1.0.125"
|
version = "1.0.122"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed"
|
checksum = "784b6203951c57ff748476b126ccb5e8e2959a5c19e5c617ab1956be3dbc68da"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itoa",
|
"itoa",
|
||||||
"memchr",
|
"memchr",
|
||||||
@ -1815,12 +1814,6 @@ dependencies = [
|
|||||||
"lazy_static",
|
"lazy_static",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "shlex"
|
|
||||||
version = "1.3.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "signal-hook-registry"
|
name = "signal-hook-registry"
|
||||||
version = "1.4.2"
|
version = "1.4.2"
|
||||||
@ -1976,7 +1969,7 @@ dependencies = [
|
|||||||
"quote",
|
"quote",
|
||||||
"sqlx-core",
|
"sqlx-core",
|
||||||
"sqlx-macros-core",
|
"sqlx-macros-core",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1999,7 +1992,7 @@ dependencies = [
|
|||||||
"sqlx-mysql",
|
"sqlx-mysql",
|
||||||
"sqlx-postgres",
|
"sqlx-postgres",
|
||||||
"sqlx-sqlite",
|
"sqlx-sqlite",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"tokio",
|
"tokio",
|
||||||
"url",
|
"url",
|
||||||
@ -2149,9 +2142,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.74"
|
version = "2.0.73"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7"
|
checksum = "837a7e8026c6ce912ff01cefbe8cafc2f8010ac49682e2a3d9decc3bce1ecaaf"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -2200,7 +2193,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2285,7 +2278,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2352,15 +2345,15 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower-layer"
|
name = "tower-layer"
|
||||||
version = "0.3.3"
|
version = "0.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
|
checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower-service"
|
name = "tower-service"
|
||||||
version = "0.3.3"
|
version = "0.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
|
checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing"
|
name = "tracing"
|
||||||
@ -2382,7 +2375,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2518,7 +2511,7 @@ dependencies = [
|
|||||||
"proc-macro-error",
|
"proc-macro-error",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2553,35 +2546,34 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen"
|
name = "wasm-bindgen"
|
||||||
version = "0.2.93"
|
version = "0.2.92"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
|
checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"once_cell",
|
|
||||||
"wasm-bindgen-macro",
|
"wasm-bindgen-macro",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-backend"
|
name = "wasm-bindgen-backend"
|
||||||
version = "0.2.93"
|
version = "0.2.92"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
|
checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"log",
|
"log",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-macro"
|
name = "wasm-bindgen-macro"
|
||||||
version = "0.2.93"
|
version = "0.2.92"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
|
checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"quote",
|
"quote",
|
||||||
"wasm-bindgen-macro-support",
|
"wasm-bindgen-macro-support",
|
||||||
@ -2589,22 +2581,22 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-macro-support"
|
name = "wasm-bindgen-macro-support"
|
||||||
version = "0.2.93"
|
version = "0.2.92"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
|
checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
"wasm-bindgen-backend",
|
"wasm-bindgen-backend",
|
||||||
"wasm-bindgen-shared",
|
"wasm-bindgen-shared",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-bindgen-shared"
|
name = "wasm-bindgen-shared"
|
||||||
version = "0.2.93"
|
version = "0.2.92"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
|
checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webpki-roots"
|
name = "webpki-roots"
|
||||||
@ -2819,7 +2811,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn 2.0.74",
|
"syn 2.0.73",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -22,7 +22,7 @@ axum-extra = { version = "0.9", features = ["typed-header"] }
|
|||||||
chrono = { version = "0.4", features = ["serde"] }
|
chrono = { version = "0.4", features = ["serde"] }
|
||||||
dotenvy = "0.15"
|
dotenvy = "0.15"
|
||||||
futures = "0.3"
|
futures = "0.3"
|
||||||
itertools = "0.13"
|
itertools = "0.13.0"
|
||||||
jsonwebtoken = "9"
|
jsonwebtoken = "9"
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
scrypt = { version = "0.11", default-features = false, features = ["std"] }
|
scrypt = { version = "0.11", default-features = false, features = ["std"] }
|
||||||
@ -38,11 +38,7 @@ sqlx = { version = "0.8", features = [
|
|||||||
"uuid",
|
"uuid",
|
||||||
] }
|
] }
|
||||||
subtle = "2"
|
subtle = "2"
|
||||||
tokio = { version = "1", features = [
|
tokio = { version = "1", features = ["parking_lot", "rt-multi-thread", "signal"] }
|
||||||
"parking_lot",
|
|
||||||
"rt-multi-thread",
|
|
||||||
"signal",
|
|
||||||
] }
|
|
||||||
tokio-util = { version = "0.7" }
|
tokio-util = { version = "0.7" }
|
||||||
tower = { version = "0.4" }
|
tower = { version = "0.4" }
|
||||||
tower-http = { version = "0.5", features = [
|
tower-http = { version = "0.5", features = [
|
||||||
|
19
Dockerfile
19
Dockerfile
@ -1,19 +0,0 @@
|
|||||||
FROM rust:slim AS chef
|
|
||||||
RUN cargo install cargo-chef
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
FROM chef AS planner
|
|
||||||
COPY . .
|
|
||||||
RUN cargo chef prepare
|
|
||||||
|
|
||||||
FROM chef AS builder
|
|
||||||
COPY --from=planner /app/recipe.json recipe.json
|
|
||||||
RUN cargo chef cook --release
|
|
||||||
COPY . .
|
|
||||||
RUN cargo b -r
|
|
||||||
|
|
||||||
FROM debian:stable-slim
|
|
||||||
EXPOSE 3000
|
|
||||||
WORKDIR /app
|
|
||||||
COPY --from=builder /app/target/release/project .
|
|
||||||
CMD [ "./project" ]
|
|
16
compose.yaml
16
compose.yaml
@ -1,23 +1,15 @@
|
|||||||
services:
|
services:
|
||||||
backend:
|
db:
|
||||||
build: .
|
|
||||||
# ports:
|
|
||||||
# - 3000:3000
|
|
||||||
environment:
|
|
||||||
JWT_SECRET: ${JWT_SECRET}
|
|
||||||
DATABASE_URL: 'postgresql://tester:testing123!@backend_db/backend'
|
|
||||||
|
|
||||||
backend_db:
|
|
||||||
image: ghcr.io/fboulnois/pg_uuidv7:1.5.0
|
image: ghcr.io/fboulnois/pg_uuidv7:1.5.0
|
||||||
environment:
|
environment:
|
||||||
- POSTGRES_USER=tester
|
- POSTGRES_USER=tester
|
||||||
- POSTGRES_PASSWORD=testing123!
|
- POSTGRES_PASSWORD=testing123!
|
||||||
- POSTGRES_DB=backend
|
- POSTGRES_DB=testing
|
||||||
ports:
|
ports:
|
||||||
- 5432:5432
|
- 5432:5432
|
||||||
volumes:
|
volumes:
|
||||||
- backend_db_data:/var/lib/postgresql/data
|
- postgres_data:/var/lib/postgresql/data
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
backend_db_data:
|
postgres_data:
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
|
|
||||||
use axum::extract::multipart::{self, Multipart};
|
use axum::extract::multipart::{self, Multipart};
|
||||||
use itertools::Itertools;
|
use tokio::io::AsyncWrite;
|
||||||
|
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
|
|
||||||
@ -10,50 +10,25 @@ pub struct Params {
|
|||||||
parent_folder: Uuid,
|
parent_folder: Uuid,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Debug, Default)]
|
|
||||||
pub struct Response {
|
|
||||||
success: HashMap<Box<str>, Uuid>,
|
|
||||||
error: HashMap<Box<str>, &'static str>,
|
|
||||||
}
|
|
||||||
|
|
||||||
fn validate_name(name: &str, existing_names: &HashSet<String>) -> Result<(), &'static str> {
|
|
||||||
if name.len() > 255 {
|
|
||||||
return Err("Name too long");
|
|
||||||
}
|
|
||||||
if existing_names.contains(name) {
|
|
||||||
return Err("Item with that name already exists");
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn create_file(
|
async fn create_file(
|
||||||
storage: &crate::FileStorage,
|
file_id: Uuid,
|
||||||
|
file: impl AsyncWrite + Unpin,
|
||||||
file_name: &str,
|
file_name: &str,
|
||||||
field: &mut multipart::Field<'_>,
|
field: &mut multipart::Field<'_>,
|
||||||
parent_folder: Uuid,
|
parent_folder: Uuid,
|
||||||
pool: &Pool,
|
pool: &Pool,
|
||||||
) -> anyhow::Result<Uuid> {
|
) -> bool {
|
||||||
let (file_id, file) = storage.create().await?;
|
let (hash, size) = match crate::FileStorage::write_to_file(file, field).await {
|
||||||
let (hash, size) = crate::FileStorage::write_to_file(file, field).await?;
|
Ok(values) => values,
|
||||||
db::file::insert(file_id, parent_folder, file_name, size, hash, pool).await?;
|
Err(err) => {
|
||||||
Ok(file_id)
|
tracing::warn!(%err);
|
||||||
}
|
return false;
|
||||||
|
}
|
||||||
async fn parse_field(
|
};
|
||||||
field: &mut multipart::Field<'_>,
|
db::file::insert(file_id, parent_folder, file_name, size, hash, pool)
|
||||||
name: &str,
|
|
||||||
storage: &crate::FileStorage,
|
|
||||||
parent_folder: Uuid,
|
|
||||||
pool: &Pool,
|
|
||||||
existing_names: &HashSet<String>,
|
|
||||||
) -> Result<Uuid, &'static str> {
|
|
||||||
validate_name(name, existing_names)?;
|
|
||||||
create_file(storage, name, field, parent_folder, pool)
|
|
||||||
.await
|
.await
|
||||||
.map_err(|err| {
|
.inspect_err(|err| tracing::warn!(%err))
|
||||||
tracing::warn!(%err, "Error creating the file");
|
.is_ok()
|
||||||
"Error creating the file"
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn upload(
|
pub async fn upload(
|
||||||
@ -61,7 +36,7 @@ pub async fn upload(
|
|||||||
State(state): State<AppState>,
|
State(state): State<AppState>,
|
||||||
claims: Claims,
|
claims: Claims,
|
||||||
mut multi: Multipart,
|
mut multi: Multipart,
|
||||||
) -> GeneralResult<Json<Response>> {
|
) -> GeneralResult<Json<HashMap<String, Uuid>>> {
|
||||||
db::folder::get_permissions(params.parent_folder, claims.user_id, &state.pool)
|
db::folder::get_permissions(params.parent_folder, claims.user_id, &state.pool)
|
||||||
.await
|
.await
|
||||||
.can_write_guard()?;
|
.can_write_guard()?;
|
||||||
@ -71,47 +46,39 @@ pub async fn upload(
|
|||||||
.await
|
.await
|
||||||
.handle_internal("Error getting existing names")?;
|
.handle_internal("Error getting existing names")?;
|
||||||
|
|
||||||
let mut response = Response::default();
|
let mut result = HashMap::new();
|
||||||
while let Ok(Some(mut field)) = multi.next_field().await {
|
while let Ok(Some(mut field)) = multi.next_field().await {
|
||||||
let Some(file_name) = field.file_name().map(Box::<str>::from) else {
|
let Some(file_name) = field.file_name().map(ToOwned::to_owned) else {
|
||||||
|
continue;
|
||||||
|
};
|
||||||
|
if existing_names.contains(&file_name) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if file_name.len() > 50 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let Ok((file_id, mut file)) = state.storage.create().await else {
|
||||||
|
tracing::warn!("Couldn't create uuid for new file");
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
let parse_result = parse_field(
|
let is_success = create_file(
|
||||||
&mut field,
|
file_id,
|
||||||
|
&mut file,
|
||||||
&file_name,
|
&file_name,
|
||||||
&state.storage,
|
&mut field,
|
||||||
params.parent_folder,
|
params.parent_folder,
|
||||||
&state.pool,
|
&state.pool,
|
||||||
&existing_names,
|
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
if !is_success {
|
||||||
match parse_result {
|
let _ = state.storage.delete(file_id).await;
|
||||||
Ok(uuid) => {
|
continue;
|
||||||
response.success.insert(file_name, uuid);
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
response.error.insert(file_name, err);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result.insert(file_name, file_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
if !response.success.is_empty() {
|
Ok(Json(result))
|
||||||
return Ok(Json(response));
|
|
||||||
}
|
|
||||||
|
|
||||||
if response.error.is_empty() {
|
|
||||||
return Err(GeneralError::message(
|
|
||||||
StatusCode::BAD_REQUEST,
|
|
||||||
"No files sent",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let errors = response
|
|
||||||
.error
|
|
||||||
.into_iter()
|
|
||||||
.format_with("\n", |(key, val), f| f(&format_args!("{key}: {val}")));
|
|
||||||
let message = format!("No file successfully uploaded:\n{errors}");
|
|
||||||
Err(GeneralError::message(StatusCode::BAD_REQUEST, message))
|
|
||||||
}
|
}
|
||||||
|
@ -15,13 +15,6 @@ pub async fn create(
|
|||||||
.await
|
.await
|
||||||
.can_write_guard()?;
|
.can_write_guard()?;
|
||||||
|
|
||||||
if params.folder_name.len() > 255 {
|
|
||||||
return Err(GeneralError::message(
|
|
||||||
StatusCode::BAD_REQUEST,
|
|
||||||
"Folder name too long",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
let exists = db::folder::name_exists(params.parent_folder_id, ¶ms.folder_name, &pool)
|
let exists = db::folder::name_exists(params.parent_folder_id, ¶ms.folder_name, &pool)
|
||||||
.await
|
.await
|
||||||
.handle_internal("Error getting existing names")?;
|
.handle_internal("Error getting existing names")?;
|
||||||
|
@ -16,7 +16,7 @@ pub async fn get(
|
|||||||
) -> GeneralResult<Json<HashMap<i32, PermissionRaw>>> {
|
) -> GeneralResult<Json<HashMap<i32, PermissionRaw>>> {
|
||||||
db::folder::get_permissions(params.folder_id, claims.user_id, &pool)
|
db::folder::get_permissions(params.folder_id, claims.user_id, &pool)
|
||||||
.await
|
.await
|
||||||
.can_read_guard()?;
|
.can_manage_guard()?;
|
||||||
|
|
||||||
db::permissions::get_all_for_folder(params.folder_id, &pool)
|
db::permissions::get_all_for_folder(params.folder_id, &pool)
|
||||||
.await
|
.await
|
||||||
|
79
src/main.rs
79
src/main.rs
@ -44,37 +44,11 @@ async fn create_test_users(pool: &Pool) -> anyhow::Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init_tracing() {
|
|
||||||
use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
|
|
||||||
|
|
||||||
let mut err = None;
|
|
||||||
|
|
||||||
tracing_subscriber::registry()
|
|
||||||
.with(
|
|
||||||
tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|inner_err| {
|
|
||||||
err = Some(inner_err);
|
|
||||||
"debug,sqlx=info,axum::rejection=trace".parse().unwrap()
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
.with(tracing_subscriber::fmt::layer())
|
|
||||||
.init();
|
|
||||||
|
|
||||||
if let Some(err) = err {
|
|
||||||
tracing::info!(
|
|
||||||
%err,
|
|
||||||
"Error constructing EnvFilter, falling back to using the default"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() -> anyhow::Result<()> {
|
async fn main() -> anyhow::Result<()> {
|
||||||
if env::var("RUST_BACKTRACE").is_err() {
|
|
||||||
env::set_var("RUST_BACKTRACE", "1");
|
|
||||||
}
|
|
||||||
let _ = dotenvy::dotenv();
|
let _ = dotenvy::dotenv();
|
||||||
|
|
||||||
init_tracing();
|
tracing_subscriber::fmt::init();
|
||||||
|
|
||||||
auth::force_init_keys();
|
auth::force_init_keys();
|
||||||
|
|
||||||
@ -111,21 +85,20 @@ async fn shutdown_signal() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
{
|
let terminate = async {
|
||||||
let terminate = async {
|
signal::unix::signal(signal::unix::SignalKind::terminate())
|
||||||
signal::unix::signal(signal::unix::SignalKind::terminate())
|
.expect("failed to install signal handler")
|
||||||
.expect("failed to install signal handler")
|
.recv()
|
||||||
.recv()
|
.await;
|
||||||
.await;
|
};
|
||||||
};
|
|
||||||
tokio::select! {
|
|
||||||
() = ctrl_c => {}
|
|
||||||
() = terminate => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(unix))]
|
#[cfg(not(unix))]
|
||||||
ctrl_c.await;
|
let terminate = std::future::pending::<()>();
|
||||||
|
|
||||||
|
tokio::select! {
|
||||||
|
() = ctrl_c => {},
|
||||||
|
() = terminate => {},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn app(state: AppState) -> Router {
|
fn app(state: AppState) -> Router {
|
||||||
@ -135,32 +108,12 @@ fn app(state: AppState) -> Router {
|
|||||||
permissions::{self, get_top_level::get_top_level},
|
permissions::{self, get_top_level::get_top_level},
|
||||||
users,
|
users,
|
||||||
};
|
};
|
||||||
use tower_http::{
|
use tower_http::ServiceBuilderExt as _;
|
||||||
trace::{MakeSpan, TraceLayer},
|
|
||||||
ServiceBuilderExt as _,
|
|
||||||
};
|
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
|
||||||
struct SpanMaker;
|
|
||||||
|
|
||||||
impl<B> MakeSpan<B> for SpanMaker {
|
|
||||||
fn make_span(&mut self, request: &axum::http::Request<B>) -> tracing::Span {
|
|
||||||
tracing::debug_span!(
|
|
||||||
"request",
|
|
||||||
method = %request.method(),
|
|
||||||
uri = %request.uri(),
|
|
||||||
version = ?request.version(),
|
|
||||||
headers = ?request.headers(),
|
|
||||||
request_id = %uuid::Uuid::now_v7()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const TEN_GIBIBYTES: usize = 10 * 1024 * 1024 * 1024;
|
|
||||||
let middleware = tower::ServiceBuilder::new()
|
let middleware = tower::ServiceBuilder::new()
|
||||||
.layer(DefaultBodyLimit::max(TEN_GIBIBYTES))
|
.layer(DefaultBodyLimit::disable())
|
||||||
.sensitive_headers([header::AUTHORIZATION, header::COOKIE])
|
.sensitive_headers([header::AUTHORIZATION, header::COOKIE])
|
||||||
.layer(TraceLayer::new_for_http().make_span_with(SpanMaker))
|
.trace_for_http()
|
||||||
.compression();
|
.compression();
|
||||||
|
|
||||||
// Build route service
|
// Build route service
|
||||||
|
Reference in New Issue
Block a user