From a2d844c582afe185bc12d6574cb781520e8f546a Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Tue, 1 Aug 2023 13:29:20 +0200 Subject: [PATCH] feat(server): start of package database schema --- server/Cargo.toml | 11 ++- server/src/api/mod.rs | 15 +++ server/src/cli.rs | 5 +- server/src/db/entities/mod.rs | 2 + server/src/db/entities/package.rs | 53 ++++++++++ server/src/db/entities/package_license.rs | 33 +++++++ server/src/db/entities/prelude.rs | 2 + server/src/db/entities/repo.rs | 16 ++- .../m20230730_000001_create_repo_tables.rs | 98 ++++++++++++++++++- 9 files changed, 229 insertions(+), 6 deletions(-) create mode 100644 server/src/db/entities/package.rs create mode 100644 server/src/db/entities/package_license.rs diff --git a/server/Cargo.toml b/server/Cargo.toml index aeb0f48..400b621 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -11,7 +11,6 @@ axum = { version = "0.6.18", features = ["http2"] } clap = { version = "4.3.12", features = ["env", "derive"] } futures = "0.3.28" libarchive = { path = "../libarchive" } -sea-orm = { version = "0.12.1", features = ["sqlx-sqlite", "runtime-tokio-rustls", "macros"] } sea-orm-migration = "0.12.1" serde = { version = "1.0.178", features = ["derive"] } sha256 = "1.1.4" @@ -22,3 +21,13 @@ tower-http = { version = "0.4.1", features = ["fs", "trace"] } tracing = "0.1.37" tracing-subscriber = { version = "0.3.17", features = ["env-filter"] } uuid = { version = "1.4.0", features = ["v4"] } + +[dependencies.sea-orm] +version = "0.12.1" +features = [ + "sqlx-sqlite", + "sqlx-postgres", + "runtime-tokio-rustls", + "macros", + "with-chrono" +] diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index 91a1023..011f008 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -10,12 +10,14 @@ use sea_orm::PaginatorTrait; use pagination::PaginatedResponse; +use crate::db::entities::package; use crate::db::entities::repo; pub fn router() -> Router { Router::new() .route("/repos", get(get_repos)) .route("/repos/:id", get(get_single_repo)) + .route("/packages", get(get_packages)) } async fn get_repos( @@ -42,3 +44,16 @@ async fn get_single_repo( Ok(Json(repo)) } + +async fn get_packages( + State(global): State, + Query(pagination): Query, +) -> crate::Result>> { + let pkgs = package::Entity::find() + .order_by_asc(package::Column::Id) + .paginate(&global.db, pagination.per_page.unwrap_or(25)) + .fetch_page(pagination.page.unwrap_or(1) - 1) + .await?; + + Ok(Json(pagination.res(pkgs))) +} diff --git a/server/src/cli.rs b/server/src/cli.rs index 90c368b..bdad1fb 100644 --- a/server/src/cli.rs +++ b/server/src/cli.rs @@ -45,7 +45,10 @@ impl Cli { pub async fn run(&self) { self.init_tracing(); - let db = crate::db::init("sqlite://test.db").await.unwrap(); + // let db = crate::db::init("sqlite://test.db").await.unwrap(); + let db = crate::db::init("postgres://rieter:rieter@localhost:5432/rieter") + .await + .unwrap(); let config = Config { repo_dir: self.repo_dir.clone(), diff --git a/server/src/db/entities/mod.rs b/server/src/db/entities/mod.rs index f1e964a..e5ad810 100644 --- a/server/src/db/entities/mod.rs +++ b/server/src/db/entities/mod.rs @@ -2,4 +2,6 @@ pub mod prelude; +pub mod package; +pub mod package_license; pub mod repo; diff --git a/server/src/db/entities/package.rs b/server/src/db/entities/package.rs new file mode 100644 index 0000000..7920aac --- /dev/null +++ b/server/src/db/entities/package.rs @@ -0,0 +1,53 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1 + +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)] +#[sea_orm(table_name = "package")] +pub struct Model { + #[sea_orm(primary_key)] + pub id: i32, + pub repo_id: i32, + pub base: String, + pub name: String, + pub version: String, + pub arch: String, + pub size: i64, + pub c_size: i64, + pub description: Option, + pub url: Option, + pub build_date: Option, + pub packager: Option, + pub pgp_sig: Option, + pub pgp_sig_size: Option, + pub sha256_sum: String, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm(has_many = "super::package_license::Entity")] + PackageLicense, + #[sea_orm( + belongs_to = "super::repo::Entity", + from = "Column::RepoId", + to = "super::repo::Column::Id", + on_update = "NoAction", + on_delete = "Cascade" + )] + Repo, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::PackageLicense.def() + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Repo.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/server/src/db/entities/package_license.rs b/server/src/db/entities/package_license.rs new file mode 100644 index 0000000..2920d3f --- /dev/null +++ b/server/src/db/entities/package_license.rs @@ -0,0 +1,33 @@ +//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1 + +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)] +#[sea_orm(table_name = "package_license")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub package_id: i32, + #[sea_orm(primary_key, auto_increment = false)] + pub value: String, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + #[sea_orm( + belongs_to = "super::package::Entity", + from = "Column::PackageId", + to = "super::package::Column::Id", + on_update = "NoAction", + on_delete = "Cascade" + )] + Package, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Package.def() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/server/src/db/entities/prelude.rs b/server/src/db/entities/prelude.rs index 8b651f8..1f8176c 100644 --- a/server/src/db/entities/prelude.rs +++ b/server/src/db/entities/prelude.rs @@ -1,3 +1,5 @@ //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1 +pub use super::package::Entity as Package; +pub use super::package_license::Entity as PackageLicense; pub use super::repo::Entity as Repo; diff --git a/server/src/db/entities/repo.rs b/server/src/db/entities/repo.rs index 0676a76..b7a1af1 100644 --- a/server/src/db/entities/repo.rs +++ b/server/src/db/entities/repo.rs @@ -1,18 +1,28 @@ //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.1 use sea_orm::entity::prelude::*; -use serde::Serialize; +use serde::{Deserialize, Serialize}; -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize)] +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq, Serialize, Deserialize)] #[sea_orm(table_name = "repo")] pub struct Model { #[sea_orm(primary_key)] pub id: i32, + #[sea_orm(unique)] pub name: String, pub description: Option, } #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] -pub enum Relation {} +pub enum Relation { + #[sea_orm(has_many = "super::package::Entity")] + Package, +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Package.def() + } +} impl ActiveModelBehavior for ActiveModel {} diff --git a/server/src/db/migrator/m20230730_000001_create_repo_tables.rs b/server/src/db/migrator/m20230730_000001_create_repo_tables.rs index 4c36ade..5e6420a 100644 --- a/server/src/db/migrator/m20230730_000001_create_repo_tables.rs +++ b/server/src/db/migrator/m20230730_000001_create_repo_tables.rs @@ -10,7 +10,6 @@ impl MigrationName for Migration { #[async_trait::async_trait] impl MigrationTrait for Migration { - // Define how to apply this migration: Create the Bakery table. async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { manager .create_table( @@ -27,11 +26,81 @@ impl MigrationTrait for Migration { .col(ColumnDef::new(Repo::Description).string()) .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()) + .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()) + .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::Value) + .string_len(255) + .not_null(), + ) + .primary_key( + Index::create() + .col(PackageLicense::PackageId) + .col(PackageLicense::Value), + ) + .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 } // 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(Package::Table).to_owned()) + .await?; manager .drop_table(Table::drop().table(Repo::Table).to_owned()) .await @@ -45,3 +114,30 @@ pub enum Repo { Name, Description, } + +#[derive(Iden)] +pub enum Package { + Table, + Id, + RepoId, + Name, + Base, + Version, + Description, + Size, + CSize, + Url, + Arch, + BuildDate, + Packager, + PgpSig, + PgpSigSize, + Sha256Sum, +} + +#[derive(Iden)] +pub enum PackageLicense { + Table, + PackageId, + Value, +}