From 4225ce347115d8ede24437f5cdde0e7336360513 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Mon, 15 Jul 2024 21:48:26 +0200 Subject: [PATCH 1/2] refactor: moved migrations to own crate --- Cargo.lock | 418 +++++++++++++++++- Cargo.toml | 1 + migration/Cargo.toml | 20 + migration/README.md | 41 ++ migration/src/lib.rs | 12 + .../m20230730_000001_create_repo_tables.rs | 302 +++++++++++++ migration/src/main.rs | 6 + server/Cargo.toml | 2 +- server/src/db/entities/distro.rs | 1 + server/src/db/entities/package.rs | 4 +- server/src/db/entities/repo.rs | 1 + server/src/db/mod.rs | 2 - server/src/main.rs | 4 +- 13 files changed, 799 insertions(+), 15 deletions(-) create mode 100644 migration/Cargo.toml create mode 100644 migration/README.md create mode 100644 migration/src/lib.rs create mode 100644 migration/src/m20230730_000001_create_repo_tables.rs create mode 100644 migration/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index bd0c194..b6a62ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -132,6 +132,154 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8828ec6e544c02b0d6691d21ed9f9218d0384a82542855073c2a3f58304aaf0" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.1.0", + "futures-lite 2.3.0", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-io 2.3.3", + "async-lock 3.4.0", + "blocking", + "futures-lite 2.3.0", + "once_cell", + "tokio", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.27", + "slab", + "socket2 0.4.10", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d6baa8f0178795da0e71bc42c9e5d13261aac7ee549853162e66a241ba17964" +dependencies = [ + "async-lock 3.4.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.3.0", + "parking", + "polling 3.7.2", + "rustix 0.38.34", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.3.1", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-std" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" +dependencies = [ + "async-attributes", + "async-channel 1.9.0", + "async-global-executor", + "async-io 1.13.0", + "async-lock 2.8.0", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite 1.13.0", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + [[package]] name = "async-stream" version = "0.3.5" @@ -154,6 +302,12 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" version = "0.1.80" @@ -337,6 +491,19 @@ dependencies = [ "generic-array", ] +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite 2.3.0", + "piper", +] + [[package]] name = "borsh" version = "1.5.0" @@ -486,6 +653,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -639,6 +815,36 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "event-listener" +version = "5.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +dependencies = [ + "event-listener 5.3.1", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + [[package]] name = "fastrand" version = "2.1.0" @@ -750,6 +956,34 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +dependencies = [ + "fastrand 2.1.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.30" @@ -824,6 +1058,18 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "h2" version = "0.4.5" @@ -892,6 +1138,12 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -1072,6 +1324,26 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi 0.3.9", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.0" @@ -1102,6 +1374,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -1150,6 +1431,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + [[package]] name = "linux-raw-sys" version = "0.4.14" @@ -1171,6 +1458,9 @@ name = "log" version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +dependencies = [ + "value-bag", +] [[package]] name = "matchers" @@ -1203,6 +1493,14 @@ version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" +[[package]] +name = "migration" +version = "0.1.0" +dependencies = [ + "async-std", + "sea-orm-migration", +] + [[package]] name = "mime" version = "0.3.17" @@ -1334,7 +1632,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi", + "hermit-abi 0.3.9", "libc", ] @@ -1392,6 +1690,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot" version = "0.12.3" @@ -1491,6 +1795,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" +dependencies = [ + "atomic-waker", + "fastrand 2.1.0", + "futures-io", +] + [[package]] name = "pkcs1" version = "0.7.5" @@ -1518,6 +1833,37 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi 0.4.0", + "pin-project-lite", + "rustix 0.38.34", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -1732,9 +2078,9 @@ dependencies = [ "futures", "http-body-util", "libarchive", + "migration", "regex", "sea-orm", - "sea-orm-migration", "sea-query", "serde", "sha256", @@ -1833,6 +2179,20 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + [[package]] name = "rustix" version = "0.38.34" @@ -1842,7 +2202,7 @@ dependencies = [ "bitflags 2.5.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.4.14", "windows-sys 0.52.0", ] @@ -2215,6 +2575,16 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "socket2" version = "0.5.7" @@ -2289,7 +2659,7 @@ dependencies = [ "crc", "crossbeam-queue", "either", - "event-listener", + "event-listener 2.5.3", "futures-channel", "futures-core", "futures-intrusive", @@ -2571,8 +2941,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if", - "fastrand", - "rustix", + "fastrand 2.1.0", + "rustix 0.38.34", "windows-sys 0.52.0", ] @@ -2666,7 +3036,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.7", "tokio-macros", "windows-sys 0.48.0", ] @@ -2975,6 +3345,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[package]] +name = "value-bag" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a84c137d37ab0142f0f2ddfe332651fdbf252e7b7dbb4e67b6c1f1b2e925101" + [[package]] name = "vcpkg" version = "0.2.15" @@ -2987,6 +3363,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -3024,6 +3406,18 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" version = "0.2.92" @@ -3053,6 +3447,16 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webpki-roots" version = "0.25.4" diff --git a/Cargo.toml b/Cargo.toml index a2754f9..182208a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,6 @@ [workspace] members = [ + 'migration', 'server', 'libarchive', 'libarchive3-sys' diff --git a/migration/Cargo.toml b/migration/Cargo.toml new file mode 100644 index 0000000..fbe007c --- /dev/null +++ b/migration/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "migration" +version = "0.1.0" +edition = "2021" +publish = false + +[lib] +name = "migration" +path = "src/lib.rs" + +[dependencies] +async-std = { version = "1", features = ["attributes", "tokio1"] } + +[dependencies.sea-orm-migration] +version = "0.12.0" +features = [ + "sqlx-postgres", + "sqlx-sqlite", + "runtime-tokio-rustls", +] diff --git a/migration/README.md b/migration/README.md new file mode 100644 index 0000000..3b438d8 --- /dev/null +++ b/migration/README.md @@ -0,0 +1,41 @@ +# Running Migrator CLI + +- Generate a new migration file + ```sh + cargo run -- generate MIGRATION_NAME + ``` +- Apply all pending migrations + ```sh + cargo run + ``` + ```sh + cargo run -- up + ``` +- Apply first 10 pending migrations + ```sh + cargo run -- up -n 10 + ``` +- Rollback last applied migrations + ```sh + cargo run -- down + ``` +- Rollback last 10 applied migrations + ```sh + cargo run -- down -n 10 + ``` +- Drop all tables from the database, then reapply all migrations + ```sh + cargo run -- fresh + ``` +- Rollback all applied migrations, then reapply all migrations + ```sh + cargo run -- refresh + ``` +- Rollback all applied migrations + ```sh + cargo run -- reset + ``` +- Check the status of all migrations + ```sh + cargo run -- status + ``` diff --git a/migration/src/lib.rs b/migration/src/lib.rs new file mode 100644 index 0000000..691d8f1 --- /dev/null +++ b/migration/src/lib.rs @@ -0,0 +1,12 @@ +pub use sea_orm_migration::prelude::*; + +mod m20230730_000001_create_repo_tables; + +pub struct Migrator; + +#[async_trait::async_trait] +impl MigratorTrait for Migrator { + fn migrations() -> Vec> { + vec![Box::new(m20230730_000001_create_repo_tables::Migration)] + } +} diff --git a/migration/src/m20230730_000001_create_repo_tables.rs b/migration/src/m20230730_000001_create_repo_tables.rs new file mode 100644 index 0000000..f76e639 --- /dev/null +++ b/migration/src/m20230730_000001_create_repo_tables.rs @@ -0,0 +1,302 @@ +use sea_orm_migration::prelude::*; + +pub struct Migration; + +impl MigrationName for Migration { + fn name(&self) -> &str { + "m_20230730_000001_create_repo_tables" + } +} + +#[async_trait::async_trait] +impl MigrationTrait for Migration { + async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .create_table( + Table::create() + .table(Distro::Table) + .col( + ColumnDef::new(Distro::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col( + ColumnDef::new(Distro::Name) + .string() + .not_null() + .unique_key(), + ) + .col(ColumnDef::new(Distro::Description).string()) + .to_owned(), + ) + .await?; + manager + .create_table( + Table::create() + .table(Repo::Table) + .col( + ColumnDef::new(Repo::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(Repo::DistroId).integer().not_null()) + .col(ColumnDef::new(Repo::Name).string().not_null().unique_key()) + .col(ColumnDef::new(Repo::Description).string()) + .foreign_key( + ForeignKey::create() + .name("fk-repo-distro_id") + .from(Repo::Table, Repo::DistroId) + .to(Distro::Table, Distro::Id) + .on_delete(ForeignKeyAction::Cascade), + ) + .to_owned(), + ) + .await?; + manager + .create_table( + Table::create() + .table(Package::Table) + .col( + ColumnDef::new(Package::Id) + .integer() + .not_null() + .auto_increment() + .primary_key(), + ) + .col(ColumnDef::new(Package::RepoId).integer().not_null()) + .col(ColumnDef::new(Package::Base).string_len(255).not_null()) + .col(ColumnDef::new(Package::Name).string_len(255).not_null()) + .col(ColumnDef::new(Package::Version).string_len(255).not_null()) + .col(ColumnDef::new(Package::Arch).string_len(255).not_null()) + .col(ColumnDef::new(Package::Size).big_integer().not_null()) + .col(ColumnDef::new(Package::CSize).big_integer().not_null()) + .col(ColumnDef::new(Package::Description).string()) + .col(ColumnDef::new(Package::Url).string_len(255)) + .col(ColumnDef::new(Package::BuildDate).date_time().not_null()) + .col(ColumnDef::new(Package::Packager).string_len(255)) + .col(ColumnDef::new(Package::PgpSig).string_len(255)) + .col(ColumnDef::new(Package::PgpSigSize).big_integer()) + .col(ColumnDef::new(Package::Sha256Sum).char_len(64).not_null()) + .col( + ColumnDef::new(Package::Compression) + .string_len(16) + .not_null(), + ) + .col(ColumnDef::new(Package::State).integer().not_null()) + .foreign_key( + ForeignKey::create() + .name("fk-package-repo_id") + .from(Package::Table, Package::RepoId) + .to(Repo::Table, Repo::Id) + .on_delete(ForeignKeyAction::Cascade), + ) + .to_owned(), + ) + .await?; + manager + .create_table( + Table::create() + .table(PackageLicense::Table) + .col( + ColumnDef::new(PackageLicense::PackageId) + .integer() + .not_null(), + ) + .col( + ColumnDef::new(PackageLicense::Name) + .string_len(255) + .not_null(), + ) + .primary_key( + Index::create() + .col(PackageLicense::PackageId) + .col(PackageLicense::Name), + ) + .foreign_key( + ForeignKey::create() + .name("fk-package_license-package_id") + .from(PackageLicense::Table, PackageLicense::PackageId) + .to(Package::Table, Package::Id) + .on_delete(ForeignKeyAction::Cascade), + ) + .to_owned(), + ) + .await?; + manager + .create_table( + Table::create() + .table(PackageGroup::Table) + .col(ColumnDef::new(PackageGroup::PackageId).integer().not_null()) + .col( + ColumnDef::new(PackageGroup::Name) + .string_len(255) + .not_null(), + ) + .primary_key( + Index::create() + .col(PackageGroup::PackageId) + .col(PackageGroup::Name), + ) + .foreign_key( + ForeignKey::create() + .name("fk-package_group-package_id") + .from(PackageGroup::Table, PackageGroup::PackageId) + .to(Package::Table, Package::Id) + .on_delete(ForeignKeyAction::Cascade), + ) + .to_owned(), + ) + .await?; + manager + .create_table( + Table::create() + .table(PackageRelated::Table) + .col( + ColumnDef::new(PackageRelated::PackageId) + .integer() + .not_null(), + ) + .col(ColumnDef::new(PackageRelated::Type).integer().not_null()) + .col( + ColumnDef::new(PackageRelated::Name) + .string_len(255) + .not_null(), + ) + .primary_key( + Index::create() + .col(PackageRelated::PackageId) + .col(PackageRelated::Type) + .col(PackageRelated::Name), + ) + .foreign_key( + ForeignKey::create() + .name("fk-package_depends-package_id") + .from(PackageRelated::Table, PackageRelated::PackageId) + .to(Package::Table, Package::Id) + .on_delete(ForeignKeyAction::Cascade), + ) + .to_owned(), + ) + .await?; + manager + .create_table( + Table::create() + .table(PackageFile::Table) + .col(ColumnDef::new(PackageFile::PackageId).integer().not_null()) + .col(ColumnDef::new(PackageFile::Path).string_len(255).not_null()) + .primary_key( + Index::create() + .col(PackageFile::PackageId) + .col(PackageFile::Path), + ) + .foreign_key( + ForeignKey::create() + .name("fk-package_file-package_id") + .from(PackageFile::Table, PackageFile::PackageId) + .to(Package::Table, Package::Id) + .on_delete(ForeignKeyAction::Cascade), + ) + .to_owned(), + ) + .await?; + + Ok(()) + } + + // Define how to rollback this migration: Drop the Bakery table. + async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { + manager + .drop_table(Table::drop().table(PackageLicense::Table).to_owned()) + .await?; + manager + .drop_table(Table::drop().table(PackageGroup::Table).to_owned()) + .await?; + manager + .drop_table(Table::drop().table(PackageRelated::Table).to_owned()) + .await?; + manager + .drop_table(Table::drop().table(PackageFile::Table).to_owned()) + .await?; + manager + .drop_table(Table::drop().table(Package::Table).to_owned()) + .await?; + manager + .drop_table(Table::drop().table(Repo::Table).to_owned()) + .await?; + manager + .drop_table(Table::drop().table(Distro::Table).to_owned()) + .await + } +} + +#[derive(Iden)] +pub enum Distro { + Table, + Id, + Name, + Description, +} + +#[derive(Iden)] +pub enum Repo { + Table, + Id, + DistroId, + Name, + Description, +} + +#[derive(Iden)] +pub enum Package { + Table, + Id, + RepoId, + Name, + Base, + Version, + Description, + Size, + CSize, + Url, + Arch, + BuildDate, + Packager, + PgpSig, + PgpSigSize, + Sha256Sum, + Compression, + State, +} + +#[derive(Iden)] +pub enum PackageLicense { + Table, + PackageId, + Name, +} + +#[derive(Iden)] +pub enum PackageGroup { + Table, + PackageId, + Name, +} + +#[derive(Iden)] +pub enum PackageRelated { + Table, + PackageId, + Type, + Name, +} + +#[derive(Iden)] +pub enum PackageFile { + Table, + PackageId, + Path, +} diff --git a/migration/src/main.rs b/migration/src/main.rs new file mode 100644 index 0000000..c6b6e48 --- /dev/null +++ b/migration/src/main.rs @@ -0,0 +1,6 @@ +use sea_orm_migration::prelude::*; + +#[async_std::main] +async fn main() { + cli::run_cli(migration::Migrator).await; +} diff --git a/server/Cargo.toml b/server/Cargo.toml index 5c26303..2d26ce9 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -15,7 +15,6 @@ futures = "0.3.28" http-body-util = "0.1.1" libarchive = { path = "../libarchive" } regex = "1.10.5" -sea-orm-migration = "0.12.1" sea-query = { version = "0.30.7", features = ["backend-postgres", "backend-sqlite"] } serde = { version = "1.0.178", features = ["derive"] } sha256 = "1.1.4" @@ -26,6 +25,7 @@ tower-http = { version = "0.5.2", features = ["fs", "trace", "auth"] } tracing = "0.1.37" tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } uuid = { version = "1.4.0", features = ["v4"] } +migration = { path = "../migration" } [dependencies.sea-orm] version = "0.12.1" diff --git a/server/src/db/entities/distro.rs b/server/src/db/entities/distro.rs index f39ad53..8a01fd2 100644 --- a/server/src/db/entities/distro.rs +++ b/server/src/db/entities/distro.rs @@ -8,6 +8,7 @@ use serde::{Deserialize, Serialize}; pub struct Model { #[sea_orm(primary_key)] pub id: i32, + #[sea_orm(unique)] pub name: String, pub description: Option, } diff --git a/server/src/db/entities/package.rs b/server/src/db/entities/package.rs index 4ef90a4..4a8921d 100644 --- a/server/src/db/entities/package.rs +++ b/server/src/db/entities/package.rs @@ -1,6 +1,5 @@ //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1 -use chrono::NaiveDateTime; use sea_orm::entity::prelude::*; use serde::{Deserialize, Serialize}; @@ -20,13 +19,12 @@ pub struct Model { pub c_size: i64, pub description: Option, pub url: Option, - pub build_date: NaiveDateTime, + pub build_date: DateTime, pub packager: Option, pub pgp_sig: Option, pub pgp_sig_size: Option, pub sha256_sum: String, pub compression: String, - #[serde(skip_serializing)] pub state: PackageState, } diff --git a/server/src/db/entities/repo.rs b/server/src/db/entities/repo.rs index 1ddd39e..d68e226 100644 --- a/server/src/db/entities/repo.rs +++ b/server/src/db/entities/repo.rs @@ -9,6 +9,7 @@ pub struct Model { #[sea_orm(primary_key)] pub id: i32, pub distro_id: i32, + #[sea_orm(unique)] pub name: String, pub description: Option, } diff --git a/server/src/db/mod.rs b/server/src/db/mod.rs index 2b03fb1..8bdf188 100644 --- a/server/src/db/mod.rs +++ b/server/src/db/mod.rs @@ -1,11 +1,9 @@ pub mod entities; -mod migrator; pub mod query; use crate::config::DbConfig; pub use entities::{prelude::*, *}; -pub use migrator::Migrator; use sea_orm::{ConnectionTrait, Database, DbConn, DeriveActiveEnum, EnumIter}; use serde::{Deserialize, Serialize}; diff --git a/server/src/main.rs b/server/src/main.rs index 7118da5..f99ba18 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -12,7 +12,7 @@ pub use error::{Result, ServerError}; use std::{io, path::PathBuf}; use clap::Parser; -use sea_orm_migration::MigratorTrait; +use migration::MigratorTrait; use tokio::runtime; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; @@ -52,7 +52,7 @@ fn setup(rt: &runtime::Handle, config_file: PathBuf) -> crate::Result { tracing::info!("Connecting to database"); let db = rt.block_on(crate::db::connect(&config.db))?; - rt.block_on(crate::db::Migrator::up(&db, None))?; + rt.block_on(migration::Migrator::up(&db, None))?; let repo = match &config.fs { FsConfig::Local { data_dir } => { From f761e3b36dbc28d94cbe28cb308334606a58ba13 Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Tue, 16 Jul 2024 20:38:43 +0200 Subject: [PATCH 2/2] refactor: move database entities into separate crate --- Cargo.lock | 17 +- Cargo.toml | 2 +- entity/Cargo.toml | 8 + .../entities => entity/src/entity}/distro.rs | 0 .../db/entities => entity/src/entity}/mod.rs | 0 .../entities => entity/src/entity}/package.rs | 4 +- .../src/entity}/package_file.rs | 0 .../src/entity}/package_group.rs | 0 .../src/entity}/package_license.rs | 0 .../src/entity}/package_related.rs | 4 +- .../entities => entity/src/entity}/prelude.rs | 0 .../db/entities => entity/src/entity}/repo.rs | 0 entity/src/lib.rs | 37 +++ server/Cargo.toml | 1 + .../m20230730_000001_create_repo_tables.rs | 302 ------------------ server/src/db/migrator/mod.rs | 12 - server/src/db/mod.rs | 42 +-- server/src/db/query/distro.rs | 11 +- server/src/db/query/package.rs | 96 +++--- server/src/db/query/repo.rs | 9 +- server/src/repo/actor.rs | 14 +- server/src/repo/archive.rs | 45 +-- server/src/repo/handle.rs | 41 +-- server/src/repo/mod.rs | 6 +- server/src/repo/package.rs | 26 -- server/src/web/api/mod.rs | 6 +- 26 files changed, 191 insertions(+), 492 deletions(-) create mode 100644 entity/Cargo.toml rename {server/src/db/entities => entity/src/entity}/distro.rs (100%) rename {server/src/db/entities => entity/src/entity}/mod.rs (100%) rename {server/src/db/entities => entity/src/entity}/package.rs (97%) rename {server/src/db/entities => entity/src/entity}/package_file.rs (100%) rename {server/src/db/entities => entity/src/entity}/package_group.rs (100%) rename {server/src/db/entities => entity/src/entity}/package_license.rs (100%) rename {server/src/db/entities => entity/src/entity}/package_related.rs (92%) rename {server/src/db/entities => entity/src/entity}/prelude.rs (100%) rename {server/src/db/entities => entity/src/entity}/repo.rs (100%) create mode 100644 entity/src/lib.rs delete mode 100644 server/src/db/migrator/m20230730_000001_create_repo_tables.rs delete mode 100644 server/src/db/migrator/mod.rs diff --git a/Cargo.lock b/Cargo.lock index b6a62ee..e874e13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -782,6 +782,14 @@ dependencies = [ "serde", ] +[[package]] +name = "entity" +version = "0.1.0" +dependencies = [ + "sea-orm", + "serde", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -2074,6 +2082,7 @@ dependencies = [ "axum", "chrono", "clap", + "entity", "figment", "futures", "http-body-util", @@ -2431,18 +2440,18 @@ checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" [[package]] name = "serde" -version = "1.0.203" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.203" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 182208a..72191c6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ members = [ 'server', 'libarchive', 'libarchive3-sys' -] +, "entity"] [profile.release] lto = "fat" diff --git a/entity/Cargo.toml b/entity/Cargo.toml new file mode 100644 index 0000000..9aec860 --- /dev/null +++ b/entity/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "entity" +version = "0.1.0" +edition = "2021" + +[dependencies] +sea-orm = "0.12.15" +serde = { version = "1.0.204", features = ["derive"] } diff --git a/server/src/db/entities/distro.rs b/entity/src/entity/distro.rs similarity index 100% rename from server/src/db/entities/distro.rs rename to entity/src/entity/distro.rs diff --git a/server/src/db/entities/mod.rs b/entity/src/entity/mod.rs similarity index 100% rename from server/src/db/entities/mod.rs rename to entity/src/entity/mod.rs diff --git a/server/src/db/entities/package.rs b/entity/src/entity/package.rs similarity index 97% rename from server/src/db/entities/package.rs rename to entity/src/entity/package.rs index 4a8921d..5380801 100644 --- a/server/src/db/entities/package.rs +++ b/entity/src/entity/package.rs @@ -3,8 +3,6 @@ use sea_orm::entity::prelude::*; use serde::{Deserialize, Serialize}; -use crate::db::PackageState; - #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)] #[sea_orm(table_name = "package")] pub struct Model { @@ -25,7 +23,7 @@ pub struct Model { pub pgp_sig_size: Option, pub sha256_sum: String, pub compression: String, - pub state: PackageState, + pub state: crate::PackageState, } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] diff --git a/server/src/db/entities/package_file.rs b/entity/src/entity/package_file.rs similarity index 100% rename from server/src/db/entities/package_file.rs rename to entity/src/entity/package_file.rs diff --git a/server/src/db/entities/package_group.rs b/entity/src/entity/package_group.rs similarity index 100% rename from server/src/db/entities/package_group.rs rename to entity/src/entity/package_group.rs diff --git a/server/src/db/entities/package_license.rs b/entity/src/entity/package_license.rs similarity index 100% rename from server/src/db/entities/package_license.rs rename to entity/src/entity/package_license.rs diff --git a/server/src/db/entities/package_related.rs b/entity/src/entity/package_related.rs similarity index 92% rename from server/src/db/entities/package_related.rs rename to entity/src/entity/package_related.rs index 7241c1a..3766853 100644 --- a/server/src/db/entities/package_related.rs +++ b/entity/src/entity/package_related.rs @@ -3,15 +3,13 @@ use sea_orm::entity::prelude::*; use serde::{Deserialize, Serialize}; -use crate::db::PackageRelatedEnum; - #[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)] #[sea_orm(table_name = "package_related")] pub struct Model { #[sea_orm(primary_key, auto_increment = false)] pub package_id: i32, #[sea_orm(primary_key, auto_increment = false)] - pub r#type: PackageRelatedEnum, + pub r#type: crate::PackageRelatedEnum, #[sea_orm(primary_key, auto_increment = false)] pub name: String, } diff --git a/server/src/db/entities/prelude.rs b/entity/src/entity/prelude.rs similarity index 100% rename from server/src/db/entities/prelude.rs rename to entity/src/entity/prelude.rs diff --git a/server/src/db/entities/repo.rs b/entity/src/entity/repo.rs similarity index 100% rename from server/src/db/entities/repo.rs rename to entity/src/entity/repo.rs diff --git a/entity/src/lib.rs b/entity/src/lib.rs new file mode 100644 index 0000000..5c531cc --- /dev/null +++ b/entity/src/lib.rs @@ -0,0 +1,37 @@ +pub mod entity; +pub use entity::prelude::*; +pub use entity::*; + +use sea_orm::{DeriveActiveEnum, EnumIter}; +use serde::{Deserialize, Serialize}; + +#[derive(EnumIter, DeriveActiveEnum, Serialize, Deserialize, PartialEq, Eq, Clone, Debug)] +#[sea_orm(rs_type = "i32", db_type = "Integer")] +#[serde(rename_all = "lowercase")] +pub enum PackageRelatedEnum { + #[sea_orm(num_value = 0)] + Conflicts, + #[sea_orm(num_value = 1)] + Replaces, + #[sea_orm(num_value = 2)] + Provides, + #[sea_orm(num_value = 3)] + Depend, + #[sea_orm(num_value = 4)] + Makedepend, + #[sea_orm(num_value = 5)] + Checkdepend, + #[sea_orm(num_value = 6)] + Optdepend, +} + +#[derive(EnumIter, DeriveActiveEnum, Deserialize, Serialize, PartialEq, Eq, Clone, Debug)] +#[sea_orm(rs_type = "i32", db_type = "Integer")] +pub enum PackageState { + #[sea_orm(num_value = 0)] + PendingCommit, + #[sea_orm(num_value = 1)] + Committed, + #[sea_orm(num_value = 2)] + PendingDeletion, +} diff --git a/server/Cargo.toml b/server/Cargo.toml index 2d26ce9..8f0f153 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -26,6 +26,7 @@ tracing = "0.1.37" tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } uuid = { version = "1.4.0", features = ["v4"] } migration = { path = "../migration" } +entity = { path = "../entity" } [dependencies.sea-orm] version = "0.12.1" diff --git a/server/src/db/migrator/m20230730_000001_create_repo_tables.rs b/server/src/db/migrator/m20230730_000001_create_repo_tables.rs deleted file mode 100644 index f76e639..0000000 --- a/server/src/db/migrator/m20230730_000001_create_repo_tables.rs +++ /dev/null @@ -1,302 +0,0 @@ -use sea_orm_migration::prelude::*; - -pub struct Migration; - -impl MigrationName for Migration { - fn name(&self) -> &str { - "m_20230730_000001_create_repo_tables" - } -} - -#[async_trait::async_trait] -impl MigrationTrait for Migration { - async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .create_table( - Table::create() - .table(Distro::Table) - .col( - ColumnDef::new(Distro::Id) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col( - ColumnDef::new(Distro::Name) - .string() - .not_null() - .unique_key(), - ) - .col(ColumnDef::new(Distro::Description).string()) - .to_owned(), - ) - .await?; - manager - .create_table( - Table::create() - .table(Repo::Table) - .col( - ColumnDef::new(Repo::Id) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col(ColumnDef::new(Repo::DistroId).integer().not_null()) - .col(ColumnDef::new(Repo::Name).string().not_null().unique_key()) - .col(ColumnDef::new(Repo::Description).string()) - .foreign_key( - ForeignKey::create() - .name("fk-repo-distro_id") - .from(Repo::Table, Repo::DistroId) - .to(Distro::Table, Distro::Id) - .on_delete(ForeignKeyAction::Cascade), - ) - .to_owned(), - ) - .await?; - manager - .create_table( - Table::create() - .table(Package::Table) - .col( - ColumnDef::new(Package::Id) - .integer() - .not_null() - .auto_increment() - .primary_key(), - ) - .col(ColumnDef::new(Package::RepoId).integer().not_null()) - .col(ColumnDef::new(Package::Base).string_len(255).not_null()) - .col(ColumnDef::new(Package::Name).string_len(255).not_null()) - .col(ColumnDef::new(Package::Version).string_len(255).not_null()) - .col(ColumnDef::new(Package::Arch).string_len(255).not_null()) - .col(ColumnDef::new(Package::Size).big_integer().not_null()) - .col(ColumnDef::new(Package::CSize).big_integer().not_null()) - .col(ColumnDef::new(Package::Description).string()) - .col(ColumnDef::new(Package::Url).string_len(255)) - .col(ColumnDef::new(Package::BuildDate).date_time().not_null()) - .col(ColumnDef::new(Package::Packager).string_len(255)) - .col(ColumnDef::new(Package::PgpSig).string_len(255)) - .col(ColumnDef::new(Package::PgpSigSize).big_integer()) - .col(ColumnDef::new(Package::Sha256Sum).char_len(64).not_null()) - .col( - ColumnDef::new(Package::Compression) - .string_len(16) - .not_null(), - ) - .col(ColumnDef::new(Package::State).integer().not_null()) - .foreign_key( - ForeignKey::create() - .name("fk-package-repo_id") - .from(Package::Table, Package::RepoId) - .to(Repo::Table, Repo::Id) - .on_delete(ForeignKeyAction::Cascade), - ) - .to_owned(), - ) - .await?; - manager - .create_table( - Table::create() - .table(PackageLicense::Table) - .col( - ColumnDef::new(PackageLicense::PackageId) - .integer() - .not_null(), - ) - .col( - ColumnDef::new(PackageLicense::Name) - .string_len(255) - .not_null(), - ) - .primary_key( - Index::create() - .col(PackageLicense::PackageId) - .col(PackageLicense::Name), - ) - .foreign_key( - ForeignKey::create() - .name("fk-package_license-package_id") - .from(PackageLicense::Table, PackageLicense::PackageId) - .to(Package::Table, Package::Id) - .on_delete(ForeignKeyAction::Cascade), - ) - .to_owned(), - ) - .await?; - manager - .create_table( - Table::create() - .table(PackageGroup::Table) - .col(ColumnDef::new(PackageGroup::PackageId).integer().not_null()) - .col( - ColumnDef::new(PackageGroup::Name) - .string_len(255) - .not_null(), - ) - .primary_key( - Index::create() - .col(PackageGroup::PackageId) - .col(PackageGroup::Name), - ) - .foreign_key( - ForeignKey::create() - .name("fk-package_group-package_id") - .from(PackageGroup::Table, PackageGroup::PackageId) - .to(Package::Table, Package::Id) - .on_delete(ForeignKeyAction::Cascade), - ) - .to_owned(), - ) - .await?; - manager - .create_table( - Table::create() - .table(PackageRelated::Table) - .col( - ColumnDef::new(PackageRelated::PackageId) - .integer() - .not_null(), - ) - .col(ColumnDef::new(PackageRelated::Type).integer().not_null()) - .col( - ColumnDef::new(PackageRelated::Name) - .string_len(255) - .not_null(), - ) - .primary_key( - Index::create() - .col(PackageRelated::PackageId) - .col(PackageRelated::Type) - .col(PackageRelated::Name), - ) - .foreign_key( - ForeignKey::create() - .name("fk-package_depends-package_id") - .from(PackageRelated::Table, PackageRelated::PackageId) - .to(Package::Table, Package::Id) - .on_delete(ForeignKeyAction::Cascade), - ) - .to_owned(), - ) - .await?; - manager - .create_table( - Table::create() - .table(PackageFile::Table) - .col(ColumnDef::new(PackageFile::PackageId).integer().not_null()) - .col(ColumnDef::new(PackageFile::Path).string_len(255).not_null()) - .primary_key( - Index::create() - .col(PackageFile::PackageId) - .col(PackageFile::Path), - ) - .foreign_key( - ForeignKey::create() - .name("fk-package_file-package_id") - .from(PackageFile::Table, PackageFile::PackageId) - .to(Package::Table, Package::Id) - .on_delete(ForeignKeyAction::Cascade), - ) - .to_owned(), - ) - .await?; - - Ok(()) - } - - // Define how to rollback this migration: Drop the Bakery table. - async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - manager - .drop_table(Table::drop().table(PackageLicense::Table).to_owned()) - .await?; - manager - .drop_table(Table::drop().table(PackageGroup::Table).to_owned()) - .await?; - manager - .drop_table(Table::drop().table(PackageRelated::Table).to_owned()) - .await?; - manager - .drop_table(Table::drop().table(PackageFile::Table).to_owned()) - .await?; - manager - .drop_table(Table::drop().table(Package::Table).to_owned()) - .await?; - manager - .drop_table(Table::drop().table(Repo::Table).to_owned()) - .await?; - manager - .drop_table(Table::drop().table(Distro::Table).to_owned()) - .await - } -} - -#[derive(Iden)] -pub enum Distro { - Table, - Id, - Name, - Description, -} - -#[derive(Iden)] -pub enum Repo { - Table, - Id, - DistroId, - Name, - Description, -} - -#[derive(Iden)] -pub enum Package { - Table, - Id, - RepoId, - Name, - Base, - Version, - Description, - Size, - CSize, - Url, - Arch, - BuildDate, - Packager, - PgpSig, - PgpSigSize, - Sha256Sum, - Compression, - State, -} - -#[derive(Iden)] -pub enum PackageLicense { - Table, - PackageId, - Name, -} - -#[derive(Iden)] -pub enum PackageGroup { - Table, - PackageId, - Name, -} - -#[derive(Iden)] -pub enum PackageRelated { - Table, - PackageId, - Type, - Name, -} - -#[derive(Iden)] -pub enum PackageFile { - Table, - PackageId, - Path, -} diff --git a/server/src/db/migrator/mod.rs b/server/src/db/migrator/mod.rs deleted file mode 100644 index d939276..0000000 --- a/server/src/db/migrator/mod.rs +++ /dev/null @@ -1,12 +0,0 @@ -use sea_orm_migration::prelude::*; - -pub struct Migrator; - -mod m20230730_000001_create_repo_tables; - -#[async_trait::async_trait] -impl MigratorTrait for Migrator { - fn migrations() -> Vec> { - vec![Box::new(m20230730_000001_create_repo_tables::Migration)] - } -} diff --git a/server/src/db/mod.rs b/server/src/db/mod.rs index 8bdf188..d81df72 100644 --- a/server/src/db/mod.rs +++ b/server/src/db/mod.rs @@ -1,53 +1,19 @@ -pub mod entities; pub mod query; use crate::config::DbConfig; -pub use entities::{prelude::*, *}; - -use sea_orm::{ConnectionTrait, Database, DbConn, DeriveActiveEnum, EnumIter}; -use serde::{Deserialize, Serialize}; +use sea_orm::{ConnectionTrait, Database, DbConn}; +use serde::Serialize; type Result = std::result::Result; -#[derive(EnumIter, DeriveActiveEnum, Serialize, Deserialize, PartialEq, Eq, Clone, Debug)] -#[sea_orm(rs_type = "i32", db_type = "Integer")] -#[serde(rename_all = "lowercase")] -pub enum PackageRelatedEnum { - #[sea_orm(num_value = 0)] - Conflicts, - #[sea_orm(num_value = 1)] - Replaces, - #[sea_orm(num_value = 2)] - Provides, - #[sea_orm(num_value = 3)] - Depend, - #[sea_orm(num_value = 4)] - Makedepend, - #[sea_orm(num_value = 5)] - Checkdepend, - #[sea_orm(num_value = 6)] - Optdepend, -} - -#[derive(EnumIter, DeriveActiveEnum, Deserialize, Serialize, PartialEq, Eq, Clone, Debug)] -#[sea_orm(rs_type = "i32", db_type = "Integer")] -pub enum PackageState { - #[sea_orm(num_value = 0)] - PendingCommit, - #[sea_orm(num_value = 1)] - Committed, - #[sea_orm(num_value = 2)] - PendingDeletion, -} - #[derive(Serialize)] pub struct FullPackage { #[serde(flatten)] - entry: package::Model, + entry: entity::package::Model, licenses: Vec, groups: Vec, - related: Vec<(PackageRelatedEnum, String)>, + related: Vec<(entity::PackageRelatedEnum, String)>, files: Vec, } diff --git a/server/src/db/query/distro.rs b/server/src/db/query/distro.rs index 8647f2a..a1706dc 100644 --- a/server/src/db/query/distro.rs +++ b/server/src/db/query/distro.rs @@ -1,6 +1,11 @@ -use crate::db::*; +use crate::db::Result; -use sea_orm::{sea_query::IntoCondition, *}; +use entity::{distro, prelude::Distro}; +use sea_orm::{ + sea_query::IntoCondition, ActiveModelTrait, ColumnTrait, Condition, DbConn, EntityTrait, + NotSet, PaginatorTrait, QueryFilter, QueryOrder, Set, +}; +use serde::Deserialize; #[derive(Deserialize)] pub struct Filter { @@ -21,7 +26,7 @@ pub async fn page( per_page: u64, page: u64, filter: Filter, -) -> Result> { +) -> Result> { let paginator = Distro::find() .filter(filter) .order_by_asc(distro::Column::Id) diff --git a/server/src/db/query/package.rs b/server/src/db/query/package.rs index 8a4f054..1b284d8 100644 --- a/server/src/db/query/package.rs +++ b/server/src/db/query/package.rs @@ -1,7 +1,16 @@ -use crate::db::{self, *}; +use crate::db::{FullPackage, Result}; -use sea_orm::{sea_query::IntoCondition, *}; -use sea_query::{Alias, Expr, Query, SelectStatement}; +use entity::{ + package, package_file, package_group, package_license, package_related, + prelude::{Package, PackageFile, PackageGroup, PackageLicense, PackageRelated}, + PackageRelatedEnum, PackageState, +}; +use sea_orm::{ + sea_query::IntoCondition, ActiveModelTrait, ColumnTrait, Condition, ConnectionTrait, DbConn, + DeleteResult, EntityTrait, FromQueryResult, Iterable, ModelTrait, NotSet, PaginatorTrait, + QueryFilter, QuerySelect, SelectModel, SelectorRaw, Set, TransactionTrait, +}; +use sea_query::{Alias, Expr, JoinType, Order, Query, SelectStatement}; use serde::Deserialize; /// How many fields may be inserted at once into the database. @@ -31,22 +40,22 @@ pub async fn page( ) -> crate::Result> { let p2 = Alias::new("p2"); let query = Query::select() - .columns(db::package::Column::iter().map(|c| (db::package::Entity, c))) - .from(db::package::Entity) + .columns(package::Column::iter().map(|c| (package::Entity, c))) + .from(package::Entity) .join_subquery( JoinType::InnerJoin, max_pkg_ids_query(true), p2.clone(), - Expr::col((db::package::Entity, db::package::Column::Id)) + Expr::col((package::Entity, package::Column::Id)) .eq(Expr::col((p2.clone(), Alias::new("max_id")))), ) .cond_where(filter) - .order_by((db::package::Entity, db::package::Column::Id), Order::Asc) + .order_by((package::Entity, package::Column::Id), Order::Asc) .to_owned(); let builder = conn.get_database_backend(); let sql = builder.build(&query); - Ok(db::Package::find() + Ok(Package::find() .from_raw_sql(sql) .paginate(conn, per_page) .fetch_page(page) @@ -213,7 +222,7 @@ pub async fn full(conn: &DbConn, id: i32) -> Result> { .into_tuple() .all(conn) .await?; - let related: Vec<(db::PackageRelatedEnum, String)> = entry + let related: Vec<(PackageRelatedEnum, String)> = entry .find_related(PackageRelated) .select_only() .columns([package_related::Column::Type, package_related::Column::Name]) @@ -248,22 +257,22 @@ pub struct PkgToRemove { fn max_pkg_ids_query(committed: bool) -> SelectStatement { let mut query = Query::select() - .from(db::package::Entity) + .from(package::Entity) .columns([ - db::package::Column::RepoId, - db::package::Column::Arch, - db::package::Column::Name, + package::Column::RepoId, + package::Column::Arch, + package::Column::Name, ]) - .expr_as(db::package::Column::Id.max(), Alias::new("max_id")) + .expr_as(package::Column::Id.max(), Alias::new("max_id")) .group_by_columns([ - db::package::Column::RepoId, - db::package::Column::Arch, - db::package::Column::Name, + package::Column::RepoId, + package::Column::Arch, + package::Column::Name, ]) .to_owned(); if committed { - query.cond_where(db::package::Column::State.eq(db::PackageState::Committed)); + query.cond_where(package::Column::State.eq(PackageState::Committed)); } query @@ -278,47 +287,44 @@ pub fn pkgs_to_sync( ) -> SelectorRaw> { let (p1, p2) = (Alias::new("p1"), Alias::new("p2")); let query = Query::select() - .columns(db::package::Column::iter().map(|c| (p1.clone(), c))) - .from_as(db::package::Entity, p1.clone()) + .columns(package::Column::iter().map(|c| (p1.clone(), c))) + .from_as(package::Entity, p1.clone()) .join_subquery( JoinType::InnerJoin, max_pkg_ids_query(false), p2.clone(), - Expr::col((p1.clone(), db::package::Column::Id)) + Expr::col((p1.clone(), package::Column::Id)) .eq(Expr::col((p2.clone(), Alias::new("max_id")))), ) .cond_where( Condition::all() - .add(Expr::col((p1.clone(), db::package::Column::RepoId)).eq(repo)) + .add(Expr::col((p1.clone(), package::Column::RepoId)).eq(repo)) + .add(Expr::col((p1.clone(), package::Column::Arch)).is_in([arch, crate::ANY_ARCH])) .add( - Expr::col((p1.clone(), db::package::Column::Arch)) - .is_in([arch, crate::ANY_ARCH]), - ) - .add( - Expr::col((p1.clone(), db::package::Column::State)) - .ne(db::PackageState::PendingDeletion), + Expr::col((p1.clone(), package::Column::State)) + .ne(PackageState::PendingDeletion), ), ) .to_owned(); let builder = conn.get_database_backend(); let sql = builder.build(&query); - db::Package::find().from_raw_sql(sql) + Package::find().from_raw_sql(sql) } fn stale_pkgs_query(include_repo: bool) -> SelectStatement { let (p1, p2) = (Alias::new("p1"), Alias::new("p2")); let mut query = Query::select() - .from_as(db::package::Entity, p1.clone()) + .from_as(package::Entity, p1.clone()) .to_owned(); if include_repo { query.columns([ - (p1.clone(), db::package::Column::RepoId), - (p1.clone(), db::package::Column::Id), + (p1.clone(), package::Column::RepoId), + (p1.clone(), package::Column::Id), ]); } else { - query.column((p1.clone(), db::package::Column::Id)); + query.column((p1.clone(), package::Column::Id)); } // We left join on the max pkgs query because a repository that has all its packages set to @@ -331,27 +337,27 @@ fn stale_pkgs_query(include_repo: bool) -> SelectStatement { p2.clone(), Condition::all() .add( - Expr::col((p1.clone(), db::package::Column::RepoId)) - .eq(Expr::col((p2.clone(), db::package::Column::RepoId))), + Expr::col((p1.clone(), package::Column::RepoId)) + .eq(Expr::col((p2.clone(), package::Column::RepoId))), ) .add( - Expr::col((p1.clone(), db::package::Column::Arch)) - .eq(Expr::col((p2.clone(), db::package::Column::Arch))), + Expr::col((p1.clone(), package::Column::Arch)) + .eq(Expr::col((p2.clone(), package::Column::Arch))), ) .add( - Expr::col((p1.clone(), db::package::Column::Name)) - .eq(Expr::col((p2.clone(), db::package::Column::Name))), + Expr::col((p1.clone(), package::Column::Name)) + .eq(Expr::col((p2.clone(), package::Column::Name))), ), ) .cond_where( Condition::any() .add( - Expr::col((p1.clone(), db::package::Column::Id)) + Expr::col((p1.clone(), package::Column::Id)) .lt(Expr::col((p2.clone(), Alias::new("max_id")))), ) .add( - Expr::col((p1.clone(), db::package::Column::State)) - .eq(db::PackageState::PendingDeletion), + Expr::col((p1.clone(), package::Column::State)) + .eq(PackageState::PendingDeletion), ), ); @@ -367,9 +373,9 @@ pub fn stale_pkgs(conn: &DbConn) -> SelectorRaw> { } pub async fn delete_stale_pkgs(conn: &DbConn, max_id: i32) -> crate::Result<()> { - Ok(db::Package::delete_many() - .filter(db::package::Column::Id.lte(max_id)) - .filter(db::package::Column::Id.in_subquery(stale_pkgs_query(false))) + Ok(Package::delete_many() + .filter(package::Column::Id.lte(max_id)) + .filter(package::Column::Id.in_subquery(stale_pkgs_query(false))) .exec(conn) .await .map(|_| ())?) diff --git a/server/src/db/query/repo.rs b/server/src/db/query/repo.rs index a2daa26..3d1a952 100644 --- a/server/src/db/query/repo.rs +++ b/server/src/db/query/repo.rs @@ -1,6 +1,11 @@ -use crate::db::*; +use crate::db::Result; -use sea_orm::{sea_query::IntoCondition, *}; +use entity::{prelude::Repo, repo}; +use sea_orm::{ + sea_query::IntoCondition, ActiveModelTrait, ColumnTrait, Condition, DbConn, EntityTrait, + NotSet, PaginatorTrait, QueryFilter, QueryOrder, Set, +}; +use serde::Deserialize; #[derive(Deserialize)] pub struct Filter { diff --git a/server/src/repo/actor.rs b/server/src/repo/actor.rs index 2c2fd74..3aa04de 100644 --- a/server/src/repo/actor.rs +++ b/server/src/repo/actor.rs @@ -99,10 +99,10 @@ impl Actor { if let Some(_guard) = repos.get(&repo).map(|n| n.1.lock()) { let archs: Vec = self.rt.block_on( - db::Package::find() - .filter(db::package::Column::RepoId.eq(repo)) + entity::Package::find() + .filter(entity::package::Column::RepoId.eq(repo)) .select_only() - .column(db::package::Column::Arch) + .column(entity::package::Column::Arch) .distinct() .into_tuple() .all(&self.state.conn), @@ -171,12 +171,12 @@ impl Actor { // Update the state for the newly committed packages self.rt.block_on( - db::Package::update_many() + entity::Package::update_many() .col_expr( - db::package::Column::State, - Expr::value(db::PackageState::Committed), + entity::package::Column::State, + Expr::value(entity::PackageState::Committed), ) - .filter(db::package::Column::Id.is_in(committed_ids)) + .filter(entity::package::Column::Id.is_in(committed_ids)) .exec(&self.state.conn), )?; diff --git a/server/src/repo/archive.rs b/server/src/repo/archive.rs index 18e0801..59c3a0a 100644 --- a/server/src/repo/archive.rs +++ b/server/src/repo/archive.rs @@ -1,4 +1,3 @@ -use crate::db; use std::{ io::Write, path::{Path, PathBuf}, @@ -69,7 +68,7 @@ impl RepoArchivesWriter { Ok(ar.append_path(&mut ar_entry, src_path)?) } - pub fn append_pkg(&mut self, pkg: &db::package::Model) -> crate::Result<()> { + pub fn append_pkg(&mut self, pkg: &entity::package::Model) -> crate::Result<()> { self.write_desc(&self.tmp_paths[0], pkg)?; self.write_files(&self.tmp_paths[1], pkg)?; @@ -85,7 +84,11 @@ impl RepoArchivesWriter { } /// Generate a "files" archive entry for the package in the given path - fn write_files(&self, path: impl AsRef, pkg: &db::package::Model) -> crate::Result<()> { + fn write_files( + &self, + path: impl AsRef, + pkg: &entity::package::Model, + ) -> crate::Result<()> { let mut f = std::io::BufWriter::new(std::fs::File::create(path)?); writeln!(f, "%FILES%")?; @@ -93,7 +96,7 @@ impl RepoArchivesWriter { let (tx, mut rx) = mpsc::channel(1); let conn = self.conn.clone(); - let query = pkg.find_related(db::PackageFile); + let query = pkg.find_related(entity::prelude::PackageFile); self.rt.spawn(async move { match query.stream(&conn).await { @@ -121,7 +124,11 @@ impl RepoArchivesWriter { Ok(()) } - fn write_desc(&self, path: impl AsRef, pkg: &db::package::Model) -> crate::Result<()> { + fn write_desc( + &self, + path: impl AsRef, + pkg: &entity::package::Model, + ) -> crate::Result<()> { let mut f = std::io::BufWriter::new(std::fs::File::create(path)?); let filename = format!( @@ -147,9 +154,9 @@ impl RepoArchivesWriter { } let groups: Vec = self.rt.block_on( - pkg.find_related(db::PackageGroup) + pkg.find_related(entity::prelude::PackageGroup) .select_only() - .column(db::package_group::Column::Name) + .column(entity::package_group::Column::Name) .into_tuple() .all(&self.conn), )?; @@ -165,9 +172,9 @@ impl RepoArchivesWriter { } let licenses: Vec = self.rt.block_on( - pkg.find_related(db::PackageLicense) + pkg.find_related(entity::prelude::PackageLicense) .select_only() - .column(db::package_license::Column::Name) + .column(entity::package_license::Column::Name) .into_tuple() .all(&self.conn), )?; @@ -186,21 +193,21 @@ impl RepoArchivesWriter { } let related = [ - ("REPLACES", db::PackageRelatedEnum::Replaces), - ("CONFLICTS", db::PackageRelatedEnum::Conflicts), - ("PROVIDES", db::PackageRelatedEnum::Provides), - ("DEPENDS", db::PackageRelatedEnum::Depend), - ("OPTDEPENDS", db::PackageRelatedEnum::Optdepend), - ("MAKEDEPENDS", db::PackageRelatedEnum::Makedepend), - ("CHECKDEPENDS", db::PackageRelatedEnum::Checkdepend), + ("REPLACES", entity::PackageRelatedEnum::Replaces), + ("CONFLICTS", entity::PackageRelatedEnum::Conflicts), + ("PROVIDES", entity::PackageRelatedEnum::Provides), + ("DEPENDS", entity::PackageRelatedEnum::Depend), + ("OPTDEPENDS", entity::PackageRelatedEnum::Optdepend), + ("MAKEDEPENDS", entity::PackageRelatedEnum::Makedepend), + ("CHECKDEPENDS", entity::PackageRelatedEnum::Checkdepend), ]; for (key, attr) in related.into_iter() { let items: Vec = self.rt.block_on( - pkg.find_related(db::PackageRelated) - .filter(db::package_related::Column::Type.eq(attr)) + pkg.find_related(entity::prelude::PackageRelated) + .filter(entity::package_related::Column::Type.eq(attr)) .select_only() - .column(db::package_related::Column::Name) + .column(entity::package_related::Column::Name) .into_tuple() .all(&self.conn), )?; diff --git a/server/src/repo/handle.rs b/server/src/repo/handle.rs index bbcc153..99c8401 100644 --- a/server/src/repo/handle.rs +++ b/server/src/repo/handle.rs @@ -1,5 +1,4 @@ use super::{Command, SharedState}; -use crate::db; use std::{ path::PathBuf, @@ -34,10 +33,10 @@ impl Handle { pub async fn get_or_create_repo(&self, distro: &str, repo: &str) -> crate::Result { let mut repos = self.state.repos.write().await; - let distro_id: Option = db::Distro::find() - .filter(db::distro::Column::Name.eq(distro)) + let distro_id: Option = entity::Distro::find() + .filter(entity::distro::Column::Name.eq(distro)) .select_only() - .column(db::distro::Column::Id) + .column(entity::distro::Column::Id) .into_tuple() .one(&self.state.conn) .await?; @@ -45,7 +44,7 @@ impl Handle { let distro_id = if let Some(id) = distro_id { id } else { - let new_distro = db::distro::ActiveModel { + let new_distro = entity::distro::ActiveModel { id: NotSet, name: Set(distro.to_string()), description: NotSet, @@ -54,11 +53,11 @@ impl Handle { new_distro.insert(&self.state.conn).await?.id }; - let repo_id: Option = db::Repo::find() - .filter(db::repo::Column::DistroId.eq(distro_id)) - .filter(db::repo::Column::Name.eq(repo)) + let repo_id: Option = entity::Repo::find() + .filter(entity::repo::Column::DistroId.eq(distro_id)) + .filter(entity::repo::Column::Name.eq(repo)) .select_only() - .column(db::repo::Column::Id) + .column(entity::repo::Column::Id) .into_tuple() .one(&self.state.conn) .await?; @@ -66,7 +65,7 @@ impl Handle { let repo_id = if let Some(id) = repo_id { id } else { - let new_repo = db::repo::ActiveModel { + let new_repo = entity::repo::ActiveModel { id: NotSet, distro_id: Set(distro_id), name: Set(repo.to_string()), @@ -84,12 +83,12 @@ impl Handle { } pub async fn get_repo(&self, distro: &str, repo: &str) -> crate::Result> { - Ok(db::Repo::find() - .find_also_related(db::Distro) + Ok(entity::Repo::find() + .find_also_related(entity::Distro) .filter( Condition::all() - .add(db::repo::Column::Name.eq(repo)) - .add(db::distro::Column::Name.eq(distro)), + .add(entity::repo::Column::Name.eq(repo)) + .add(entity::distro::Column::Name.eq(distro)), ) .one(&self.state.conn) .await @@ -98,7 +97,9 @@ impl Handle { pub async fn remove_repo(&self, repo: i32) -> crate::Result<()> { self.state.repos.write().await.remove(&repo); - db::Repo::delete_by_id(repo).exec(&self.state.conn).await?; + entity::Repo::delete_by_id(repo) + .exec(&self.state.conn) + .await?; let _ = tokio::fs::remove_dir_all(self.state.repos_dir.join(repo.to_string())).await; Ok(()) @@ -108,15 +109,15 @@ impl Handle { /// packages with the given architecture as "pending deletion", before performing a manual sync /// & removal of stale packages. pub async fn remove_repo_arch(&self, repo: i32, arch: &str) -> crate::Result<()> { - db::Package::update_many() + entity::Package::update_many() .col_expr( - db::package::Column::State, - Expr::value(db::PackageState::PendingDeletion), + entity::package::Column::State, + Expr::value(entity::PackageState::PendingDeletion), ) .filter( Condition::all() - .add(db::package::Column::RepoId.eq(repo)) - .add(db::package::Column::Arch.eq(arch)), + .add(entity::package::Column::RepoId.eq(repo)) + .add(entity::package::Column::Arch.eq(arch)), ) .exec(&self.state.conn) .await?; diff --git a/server/src/repo/mod.rs b/server/src/repo/mod.rs index 25325c6..cfccb4a 100644 --- a/server/src/repo/mod.rs +++ b/server/src/repo/mod.rs @@ -6,8 +6,6 @@ pub mod package; pub use actor::Actor; pub use handle::Handle; -use crate::db; - use std::{ collections::HashMap, path::{Path, PathBuf}, @@ -67,9 +65,9 @@ pub fn start( let mut repos = HashMap::new(); let repo_ids: Vec = rt.block_on( - db::Repo::find() + entity::prelude::Repo::find() .select_only() - .column(db::repo::Column::Id) + .column(entity::repo::Column::Id) .into_tuple() .all(&conn), )?; diff --git a/server/src/repo/package.rs b/server/src/repo/package.rs index 103a521..fa386e9 100644 --- a/server/src/repo/package.rs +++ b/server/src/repo/package.rs @@ -1,5 +1,3 @@ -use crate::db::entities::package; - use std::{ fmt, fs, io::{self, BufRead, BufReader, Read}, @@ -11,7 +9,6 @@ use libarchive::{ read::{Archive, Builder}, Entry, ReadFilter, }; -use sea_orm::ActiveValue::Set; #[derive(Debug, Clone)] pub struct Package { @@ -194,26 +191,3 @@ impl Package { ) } } - -impl From for package::ActiveModel { - fn from(pkg: Package) -> Self { - let info = pkg.info; - - package::ActiveModel { - base: Set(info.base), - name: Set(info.name), - version: Set(info.version), - arch: Set(info.arch), - size: Set(info.size), - c_size: Set(info.csize), - description: Set(info.description), - url: Set(info.url), - build_date: Set(info.build_date), - packager: Set(info.packager), - pgp_sig: Set(info.pgpsig), - pgp_sig_size: Set(info.pgpsigsize), - sha256_sum: Set(info.sha256sum), - ..Default::default() - } - } -} diff --git a/server/src/web/api/mod.rs b/server/src/web/api/mod.rs index 4678257..81494b3 100644 --- a/server/src/web/api/mod.rs +++ b/server/src/web/api/mod.rs @@ -21,7 +21,7 @@ async fn get_repos( State(global): State, Query(pagination): Query, Query(filter): Query, -) -> crate::Result>> { +) -> crate::Result>> { let items = db::query::repo::page(&global.db, pagination.per_page, pagination.page - 1, filter).await?; @@ -31,7 +31,7 @@ async fn get_repos( async fn get_single_repo( State(global): State, Path(id): Path, -) -> crate::Result> { +) -> crate::Result> { let repo = db::query::repo::by_id(&global.db, id) .await? .ok_or(axum::http::StatusCode::NOT_FOUND)?; @@ -43,7 +43,7 @@ async fn get_packages( State(global): State, Query(pagination): Query, Query(filter): Query, -) -> crate::Result>> { +) -> crate::Result>> { let items = db::query::package::page(&global.db, pagination.per_page, pagination.page - 1, filter) .await?;