From 603a9862816fd60da87cb1825bd66cf502d1f6b3 Mon Sep 17 00:00:00 2001 From: iven Date: Sun, 10 May 2026 14:19:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(health):=20=E6=96=B0=E5=A2=9E=20media=5Ffo?= =?UTF-8?q?lder/media=5Fitem/banner=20=E5=AE=9E=E4=BD=93=20+=20image/hmac/?= =?UTF-8?q?sha2=20=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/erp-health/Cargo.toml | 1 + crates/erp-health/src/entity/banner.rs | 39 ++++++++++++++++++++ crates/erp-health/src/entity/media_folder.rs | 28 ++++++++++++++ crates/erp-health/src/entity/media_item.rs | 39 ++++++++++++++++++++ crates/erp-health/src/entity/mod.rs | 3 ++ crates/erp-server/Cargo.toml | 3 ++ 6 files changed, 113 insertions(+) create mode 100644 crates/erp-health/src/entity/banner.rs create mode 100644 crates/erp-health/src/entity/media_folder.rs create mode 100644 crates/erp-health/src/entity/media_item.rs diff --git a/crates/erp-health/Cargo.toml b/crates/erp-health/Cargo.toml index cdcc145..80aeac6 100644 --- a/crates/erp-health/Cargo.toml +++ b/crates/erp-health/Cargo.toml @@ -27,3 +27,4 @@ zeroize = { version = "1", features = ["derive"] } argon2.workspace = true jsonwebtoken.workspace = true rand_core = "0.6" +image = { version = "0.25", default-features = false, features = ["jpeg", "png", "webp"] } diff --git a/crates/erp-health/src/entity/banner.rs b/crates/erp-health/src/entity/banner.rs new file mode 100644 index 0000000..6f7ed21 --- /dev/null +++ b/crates/erp-health/src/entity/banner.rs @@ -0,0 +1,39 @@ +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)] +#[sea_orm(table_name = "banner")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub id: Uuid, + pub tenant_id: Uuid, + pub media_item_id: Uuid, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub title: Option, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub subtitle: Option, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub link_type: Option, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub link_target: Option, + pub sort_order: i32, + pub status: String, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub start_time: Option, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub end_time: Option, + pub created_at: DateTimeUtc, + pub updated_at: DateTimeUtc, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub created_by: Option, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub updated_by: Option, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub deleted_at: Option, + pub version: i32, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation {} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/erp-health/src/entity/media_folder.rs b/crates/erp-health/src/entity/media_folder.rs new file mode 100644 index 0000000..433b7f7 --- /dev/null +++ b/crates/erp-health/src/entity/media_folder.rs @@ -0,0 +1,28 @@ +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)] +#[sea_orm(table_name = "media_folder")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub id: Uuid, + pub tenant_id: Uuid, + pub name: String, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub parent_id: Option, + pub sort_order: i32, + pub created_at: DateTimeUtc, + pub updated_at: DateTimeUtc, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub created_by: Option, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub updated_by: Option, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub deleted_at: Option, + pub version: i32, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation {} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/erp-health/src/entity/media_item.rs b/crates/erp-health/src/entity/media_item.rs new file mode 100644 index 0000000..b83c746 --- /dev/null +++ b/crates/erp-health/src/entity/media_item.rs @@ -0,0 +1,39 @@ +use sea_orm::entity::prelude::*; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)] +#[sea_orm(table_name = "media_item")] +pub struct Model { + #[sea_orm(primary_key, auto_increment = false)] + pub id: Uuid, + pub tenant_id: Uuid, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub folder_id: Option, + pub filename: String, + pub storage_path: String, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub thumbnail_path: Option, + pub content_type: String, + pub file_size: i64, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub width: Option, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub height: Option, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub alt_text: Option, + pub is_public: bool, + pub created_at: DateTimeUtc, + pub updated_at: DateTimeUtc, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub created_by: Option, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub updated_by: Option, + #[sea_orm(skip_serializing_if = "Option::is_none")] + pub deleted_at: Option, + pub version: i32, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation {} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/crates/erp-health/src/entity/mod.rs b/crates/erp-health/src/entity/mod.rs index 10e03ff..c309f3b 100644 --- a/crates/erp-health/src/entity/mod.rs +++ b/crates/erp-health/src/entity/mod.rs @@ -7,6 +7,7 @@ pub mod article_article_tag; pub mod article_category; pub mod article_revision; pub mod article_tag; +pub mod banner; pub mod ble_gateway; pub mod blind_index; pub mod care_plan; @@ -32,6 +33,8 @@ pub mod handoff_log; pub mod health_record; pub mod health_trend; pub mod lab_report; +pub mod media_folder; +pub mod media_item; pub mod medication_record; pub mod medication_reminder; pub mod offline_event; diff --git a/crates/erp-server/Cargo.toml b/crates/erp-server/Cargo.toml index 44e7b1f..ebe2e1d 100644 --- a/crates/erp-server/Cargo.toml +++ b/crates/erp-server/Cargo.toml @@ -37,6 +37,9 @@ chrono.workspace = true moka = { version = "0.12", features = ["sync"] } metrics.workspace = true metrics-exporter-prometheus.workspace = true +hmac = "0.12" +sha2 = "0.10" +hex = "0.4" [dev-dependencies] erp-auth = { workspace = true }