From 1324fb3b707e28acd204e5678b2f91972f350b2a Mon Sep 17 00:00:00 2001 From: fluo10 Date: Mon, 28 Apr 2025 20:15:58 +0900 Subject: [PATCH] Update entity and migration test --- Cargo.lock | 208 ++++++++++++++++++ Cargo.toml | 2 +- dpts-core/Cargo.toml | 3 +- dpts-core/src/entity/mod.rs | 24 ++ dpts-core/src/entity/record_header.rs | 4 + dpts-core/src/entity/user.rs | 4 + dpts-core/tests/db.rs | 53 ++++- .../src/m20220101_000001_create_table.rs | 6 +- 8 files changed, 299 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f7d904f..427a792 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -200,6 +200,7 @@ dependencies = [ "async-trait", "base64", "bytes", + "chrono", "fast_chemail", "fnv", "futures-timer", @@ -453,11 +454,20 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + [[package]] name = "bitflags" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +dependencies = [ + "serde", +] [[package]] name = "block-buffer" @@ -527,6 +537,7 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", + "serde", "wasm-bindgen", "windows-link", ] @@ -586,6 +597,12 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "core-foundation" version = "0.9.4" @@ -686,6 +703,17 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + [[package]] name = "digest" version = "0.10.7" @@ -693,6 +721,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] @@ -1465,6 +1494,9 @@ name = "lazy_static" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] [[package]] name = "libc" @@ -1472,6 +1504,12 @@ version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +[[package]] +name = "libm" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72" + [[package]] name = "libsqlite3-sys" version = "0.30.1" @@ -1611,6 +1649,43 @@ dependencies = [ "tempfile", ] +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1618,6 +1693,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -1741,6 +1817,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.1" @@ -1815,6 +1900,27 @@ dependencies = [ "futures-io", ] +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" version = "0.3.32" @@ -2010,6 +2116,26 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rsa" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78928ac1ed176a5ca1d17e578a1825f3d81ca54cf41053a592584b020cfd691b" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -2121,6 +2247,7 @@ checksum = "21e61af841881c137d4bc8e0d8411cee9168548b404f9e4788e8af7e8f94bd4e" dependencies = [ "async-stream", "async-trait", + "chrono", "futures-util", "log", "ouroboros", @@ -2188,6 +2315,7 @@ version = "0.32.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d99447c24da0cded00089e2021e1624af90878c65f7534319448d01da3df869d" dependencies = [ + "chrono", "inherent", "ordered-float", "sea-query-derive", @@ -2199,6 +2327,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0019f47430f7995af63deda77e238c17323359af241233ec768aba1faea7608" dependencies = [ + "chrono", "sea-query", "sqlx", ] @@ -2317,6 +2446,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" @@ -2343,6 +2483,16 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "slab" version = "0.4.9" @@ -2380,6 +2530,16 @@ dependencies = [ "lock_api", ] +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "sqlx" version = "0.8.5" @@ -2388,6 +2548,7 @@ checksum = "f3c3a85280daca669cfd3bcb68a337882a8bc57ec882f72c5d13a430613a738e" dependencies = [ "sqlx-core", "sqlx-macros", + "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", ] @@ -2400,6 +2561,7 @@ checksum = "f743f2a3cea30a58cd479013f75550e879009e3a02f616f18ca699335aa248c3" dependencies = [ "base64", "bytes", + "chrono", "crc", "crossbeam-queue", "either", @@ -2459,6 +2621,7 @@ dependencies = [ "serde_json", "sha2", "sqlx-core", + "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", "syn 2.0.100", @@ -2467,6 +2630,49 @@ dependencies = [ "url", ] +[[package]] +name = "sqlx-mysql" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0afdd3aa7a629683c2d750c2df343025545087081ab5942593a5288855b1b7a7" +dependencies = [ + "atoi", + "base64", + "bitflags", + "byteorder", + "bytes", + "chrono", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror 2.0.12", + "tracing", + "whoami", +] + [[package]] name = "sqlx-postgres" version = "0.8.5" @@ -2477,6 +2683,7 @@ dependencies = [ "base64", "bitflags", "byteorder", + "chrono", "crc", "dotenvy", "etcetera", @@ -2511,6 +2718,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c26083e9a520e8eb87a06b12347679b142dc2ea29e6e409f805644a7a979a5bc" dependencies = [ "atoi", + "chrono", "flume", "futures-channel", "futures-core", diff --git a/Cargo.toml b/Cargo.toml index be7fd1f..ff2574d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ members = ["dpts-*"] [workspace.dependencies] dpts-core = {path = "dpts-core"} dpts-migration = {path = "dpts-migration"} -chrono = "0.4" +chrono = {version = "0.4", features = ["serde"]} clap = "4.5" dotenv = "0.15.0" diff --git a/dpts-core/Cargo.toml b/dpts-core/Cargo.toml index 0ac4bb6..f2df2bc 100644 --- a/dpts-core/Cargo.toml +++ b/dpts-core/Cargo.toml @@ -8,7 +8,7 @@ repository.workspace = true [dependencies] dpts-migration = { workspace = true } anyhow = "1.0" -async-graphql = "7.0" +async-graphql = {version = "7.0", features = ["chrono"]} axum = "0.8" chrono = {workspace = true} clap = {workspace = true} @@ -25,5 +25,6 @@ features = [ "debug-print", "runtime-tokio-native-tls", "sqlx-sqlite", + "with-chrono", ] default-features = false diff --git a/dpts-core/src/entity/mod.rs b/dpts-core/src/entity/mod.rs index 17af035..1292db7 100644 --- a/dpts-core/src/entity/mod.rs +++ b/dpts-core/src/entity/mod.rs @@ -2,3 +2,27 @@ mod record_detail; mod record_header; mod record_tag; mod user; + +pub use user::{ + ActiveModel as UserActiveModel, + Entity as UserEntity, + Model as UserModel, +}; + +pub use record_detail::{ + ActiveModel as RecordDetailActiveModel, + Entity as RecordDetailEntity, + Model as RecordDetailModel, +}; + +pub use record_header::{ + ActiveModel as RecordHeaderActiveModel, + Entity as RecordHeaderEntity, + Model as RecordHeaderModel, +}; + +pub use record_tag::{ + ActiveModel as RecordTagActiveModel, + Entity as RecordTagEntity, + Model as RecordTagModel, +}; \ No newline at end of file diff --git a/dpts-core/src/entity/record_header.rs b/dpts-core/src/entity/record_header.rs index d356869..7f5d0ea 100644 --- a/dpts-core/src/entity/record_header.rs +++ b/dpts-core/src/entity/record_header.rs @@ -13,6 +13,10 @@ pub struct Model { #[serde(skip_deserializing)] pub user_id: i32, pub comment: String, + pub created_at: DateTimeWithTimeZone, + pub updated_at: DateTimeWithTimeZone, + #[sea_orm(indexed)] + pub recorded_at: DateTimeWithTimeZone, } #[derive(Copy, Clone, Debug, DeriveRelation, EnumIter)] diff --git a/dpts-core/src/entity/user.rs b/dpts-core/src/entity/user.rs index 655a899..4b0cc0a 100644 --- a/dpts-core/src/entity/user.rs +++ b/dpts-core/src/entity/user.rs @@ -1,4 +1,5 @@ use async_graphql::*; +use chrono::{DateTime, FixedOffset,}; use sea_orm::entity::prelude::*; use serde::{Deserialize, Serialize}; @@ -11,6 +12,9 @@ pub struct Model { pub id: i32, #[sea_orm(unique, indexed)] pub login_name: String, + pub password_hash: String, + pub created_at: DateTimeWithTimeZone, + pub updated_at: DateTimeWithTimeZone, } #[derive(Copy, Clone, Debug, DeriveRelation, EnumIter)] diff --git a/dpts-core/tests/db.rs b/dpts-core/tests/db.rs index f86237b..5bc638f 100644 --- a/dpts-core/tests/db.rs +++ b/dpts-core/tests/db.rs @@ -1,6 +1,8 @@ -use core::time::Duration; -use sea_orm::{ConnectOptions, Database}; +use std::time::Duration; +use chrono::{offset, FixedOffset, Local, TimeZone}; +use sea_orm::{entity::*, query::*, ConnectOptions, Database}; use dpts_migration::{Migrator, MigratorTrait}; +use dpts_core::entity::*; #[tokio::test] async fn main() { @@ -16,6 +18,53 @@ async fn main() { //.set_schema_search_path("my_schema"); // Setting default PostgreSQL schema let db= Database::connect(opt).await.unwrap(); Migrator::fresh(&db).await.unwrap(); + + let local_date_time = Local::now(); + let offset_date_time = local_date_time.with_timezone(local_date_time.offset()); + + let user = UserActiveModel{ + login_name: Set("admin".to_owned()), + password_hash: Set("admin".to_owned()), + created_at: Set(offset_date_time), + updated_at: Set(offset_date_time), + ..Default::default() + }.insert(&db) + .await.unwrap(); + + + let record_tag = RecordTagActiveModel{ + user_id: Set(user.id), + name: Set("test".to_owned()), + ..Default::default() + }.insert(&db) + .await.unwrap(); + + let record_header = RecordHeaderActiveModel{ + user_id: Set(user.id), + created_at: Set(offset_date_time), + updated_at: Set(offset_date_time), + recorded_at: Set(offset_date_time), + comment: Set("".to_owned()), + ..Default::default() + }.insert(&db) + .await.unwrap(); + + RecordDetailActiveModel { + record_header_id: Set(record_header.id), + record_tag_id: Set(record_tag.id), + count: Set(1), + ..Default::default() + }.insert(&db) + .await.unwrap(); + RecordDetailActiveModel { + record_header_id: Set(record_header.id), + record_tag_id: Set(record_tag.id), + count: Set(2), + ..Default::default() + }.insert(&db) + .await.unwrap(); + + Migrator::reset(&db).await.unwrap(); db.close().await.unwrap(); } \ No newline at end of file diff --git a/dpts-migration/src/m20220101_000001_create_table.rs b/dpts-migration/src/m20220101_000001_create_table.rs index 49abf43..9ec6032 100644 --- a/dpts-migration/src/m20220101_000001_create_table.rs +++ b/dpts-migration/src/m20220101_000001_create_table.rs @@ -65,7 +65,7 @@ impl MigrationTrait for Migration { .col(pk_auto(RecordDetail::Id)) .col(integer(RecordDetail::RecordHeaderId)) .col(integer(RecordDetail::RecordTagId)) - .col(string(RecordDetail::Count)) + .col(integer(RecordDetail::Count)) .foreign_key( ForeignKey::create() .name("FK_RecordDetail_RecordHeader") @@ -117,6 +117,10 @@ impl MigrationTrait for Migration { async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { // Replace the sample below with your own migration scripts + manager.drop_index(Index::drop().name("IDX_User_LoginName").to_owned()).await?; + manager.drop_index(Index::drop().name("IDX_RecordHeader_RecordedAt").to_owned()).await?; + manager.drop_index(Index::drop().name("IDX_RecordTag_Name").to_owned()).await?; + manager.drop_table( Table::drop().table(RecordDetail::Table).to_owned()