From 25c0756e703932c8f326bc25b300b82e4ab4b644 Mon Sep 17 00:00:00 2001 From: GW_MC <72297530+GWMCwing@users.noreply.github.com> Date: Thu, 13 Nov 2025 20:13:05 +0800 Subject: [PATCH] Add generated database entity, just recipe and fix config table missing PK --- .gitignore | 3 ++ justfile | 32 +++++++++++++++++++ public/database/src/generated.rs | 1 + .../database/src/generated/entities/config.rs | 19 +++++++++++ public/database/src/generated/entities/mod.rs | 6 ++++ .../src/generated/entities/prelude.rs | 4 +++ .../database/src/generated/entities/user.rs | 23 +++++++++++++ public/database/src/lib.rs | 2 ++ .../m20251011_000002_create_config_table.rs | 7 +++- 9 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 public/database/src/generated.rs create mode 100644 public/database/src/generated/entities/config.rs create mode 100644 public/database/src/generated/entities/mod.rs create mode 100644 public/database/src/generated/entities/prelude.rs create mode 100644 public/database/src/generated/entities/user.rs diff --git a/.gitignore b/.gitignore index 1ffcb87..87af617 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,6 @@ target # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ + +# generated environment variables file +.env.generated diff --git a/justfile b/justfile index 0ff549e..20d3500 100644 --- a/justfile +++ b/justfile @@ -1,3 +1,6 @@ +set dotenv-load := true +set dotenv-filename := "./public/database/.env.generated" + simulate *args: cd apps/container && \ if [ -n "{{args}}" ]; then \ @@ -5,3 +8,32 @@ simulate *args: else \ cargo run --bin container-simulate; \ fi + +# Usage: (following SeaORM migration commands) +# init: Initialize migration directory +# generate: Generate a new migration file +# up: Apply all pending migrations +# up -n 10: Apply 10 pending migrations +# down: Rollback last applied migration +# down -n 10: Rollback last 10 applied migrations +# status: Check the status of all migrations +# fresh: Drop all tables from the database, then reapply all migrations +# refresh: Rollback all applied migrations, then reapply all migrations +# reset: Rollback all applied migrations +migrate *args: + cd public/migration && \ + if [ -n "{{args}}" ]; then \ + cargo run -- {{args}}; \ + else \ + cargo run; \ + fi + +generate-entity: + # load development environment variables + # sea-orm-cli will also load .env file by default + cd public/migration && \ + sea-orm-cli generate entity \ + -o ../database/src/generated/entities \ + --with-serde both \ + --date-time-crate chrono + diff --git a/public/database/src/generated.rs b/public/database/src/generated.rs new file mode 100644 index 0000000..0b8f0b5 --- /dev/null +++ b/public/database/src/generated.rs @@ -0,0 +1 @@ +pub mod entities; diff --git a/public/database/src/generated/entities/config.rs b/public/database/src/generated/entities/config.rs new file mode 100644 index 0000000..468c077 --- /dev/null +++ b/public/database/src/generated/entities/config.rs @@ -0,0 +1,19 @@ +//! `SeaORM` Entity, @generated by sea-orm-codegen 2.0.0-rc.18 + +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel, Serialize, Deserialize)] +#[sea_orm(table_name = "config")] +pub struct Model { + #[sea_orm(unique, primary_key, auto_increment = false)] + pub key: String, + pub value: String, + pub created_at: DateTimeUtc, + pub updated_at: DateTimeUtc, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation {} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/public/database/src/generated/entities/mod.rs b/public/database/src/generated/entities/mod.rs new file mode 100644 index 0000000..f2dcfc6 --- /dev/null +++ b/public/database/src/generated/entities/mod.rs @@ -0,0 +1,6 @@ +//! `SeaORM` Entity, @generated by sea-orm-codegen 2.0.0-rc.18 + +pub mod prelude; + +pub mod config; +pub mod user; diff --git a/public/database/src/generated/entities/prelude.rs b/public/database/src/generated/entities/prelude.rs new file mode 100644 index 0000000..222250e --- /dev/null +++ b/public/database/src/generated/entities/prelude.rs @@ -0,0 +1,4 @@ +//! `SeaORM` Entity, @generated by sea-orm-codegen 2.0.0-rc.18 + +pub use super::config::Entity as Config; +pub use super::user::Entity as User; diff --git a/public/database/src/generated/entities/user.rs b/public/database/src/generated/entities/user.rs new file mode 100644 index 0000000..4a69887 --- /dev/null +++ b/public/database/src/generated/entities/user.rs @@ -0,0 +1,23 @@ +//! `SeaORM` Entity, @generated by sea-orm-codegen 2.0.0-rc.18 + +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel, Serialize, Deserialize)] +#[sea_orm(table_name = "user")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub id: Uuid, + #[sea_orm(unique)] + pub name: String, + pub is_admin: bool, + pub password_hash: String, + pub salt: String, + pub created_at: DateTimeUtc, + pub updated_at: DateTimeUtc, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation {} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/public/database/src/lib.rs b/public/database/src/lib.rs index 85bc9ac..b5623dd 100644 --- a/public/database/src/lib.rs +++ b/public/database/src/lib.rs @@ -1,5 +1,7 @@ use sea_orm::ConnectOptions; +pub mod generated; + pub async fn get_connection &mut ConnectOptions>( connection_string: &str, option_fn: Option, diff --git a/public/migration/src/migrations/m20251011_000002_create_config_table.rs b/public/migration/src/migrations/m20251011_000002_create_config_table.rs index ffd88e7..706c276 100644 --- a/public/migration/src/migrations/m20251011_000002_create_config_table.rs +++ b/public/migration/src/migrations/m20251011_000002_create_config_table.rs @@ -22,7 +22,12 @@ impl MigrationTrait for Migration { Table::create() .table(Config::Table) .if_not_exists() - .col(ColumnDef::new(Config::Key).string().not_null().unique_key()) + .col( + ColumnDef::new(Config::Key) + .string() + .not_null() + .primary_key(), + ) .col(ColumnDef::new(Config::Value).string().not_null()) .col( ColumnDef::new(Config::CreatedAt)