From 891982ede05461d0cdb01fe2b3db654121f0cba5 Mon Sep 17 00:00:00 2001 From: brian Date: Mon, 22 Sep 2025 21:58:30 +0800 Subject: [PATCH] feat: add dal dao --- src/dal/mod.rs | 1 + src/dal/transaction.rs | 0 src/dao/mod.rs | 1 + src/dao/transaction_tag_rel.rs | 130 +++++++++++++++++++++++++++++++++ src/main.rs | 2 + 5 files changed, 134 insertions(+) create mode 100644 src/dal/mod.rs create mode 100644 src/dal/transaction.rs create mode 100644 src/dao/mod.rs create mode 100644 src/dao/transaction_tag_rel.rs diff --git a/src/dal/mod.rs b/src/dal/mod.rs new file mode 100644 index 0000000..be9dda0 --- /dev/null +++ b/src/dal/mod.rs @@ -0,0 +1 @@ +pub mod transaction; \ No newline at end of file diff --git a/src/dal/transaction.rs b/src/dal/transaction.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/dao/mod.rs b/src/dao/mod.rs new file mode 100644 index 0000000..6f6d62b --- /dev/null +++ b/src/dao/mod.rs @@ -0,0 +1 @@ +pub mod transaction_tag_rel; \ No newline at end of file diff --git a/src/dao/transaction_tag_rel.rs b/src/dao/transaction_tag_rel.rs new file mode 100644 index 0000000..9fc373e --- /dev/null +++ b/src/dao/transaction_tag_rel.rs @@ -0,0 +1,130 @@ +use sea_orm::{DatabaseConnection, EntityTrait, ActiveModelTrait, Set, QueryFilter, ColumnTrait, DbErr}; +use sea_orm::sqlx::types::chrono::{Local}; +use crate::model::db::prelude::TransactionTagRel as TransactionTagRelPrelude; +use crate::model::db::transaction_tag_rel::{ + ActiveModel as TransactionTagRelActiveModel, + Model as TransactionTagRelModel, + Column as TransactionTagRelColumn, +}; + +// DAO struct for TransactionTagRel +pub struct TransactionTagRelDAO { + db: DatabaseConnection, +} + +impl TransactionTagRelDAO { + // Constructor + pub fn new(db: DatabaseConnection) -> Self { + Self { db } + } + + // Create a new TransactionTagRel + pub async fn create( + &self, + uid: i64, + transaction_id: i64, + tag_id: i64, + ) -> Result { + let active_model = TransactionTagRelActiveModel { + uid: Set(uid), + transaction_id: Set(transaction_id), + tag_id: Set(tag_id), + is_deleted: Set(false), + // created_at: Set(Utc::now()), + // updated_at: Set(Utc::now()), + ..Default::default() // id is auto-incremented + }; + + active_model.insert(&self.db).await + } + + // Find by ID + pub async fn find_by_id(&self, id: i64, uid:i64) -> Result, DbErr> { + TransactionTagRelPrelude::find_by_id(id) + .filter(TransactionTagRelColumn::Uid.eq(uid)) + .filter(TransactionTagRelColumn::IsDeleted.eq(false)) + .one(&self.db) + .await + } + + // Find all by transaction_id + pub async fn find_by_transaction_id( + &self, + transaction_id: i64, + uid: i64, + ) -> Result, DbErr> { + TransactionTagRelPrelude::find() + .filter(TransactionTagRelColumn::Uid.eq(uid)) + .filter(TransactionTagRelColumn::TransactionId.eq(transaction_id)) + .filter(TransactionTagRelColumn::IsDeleted.eq(false)) + .all(&self.db) + .await + } + + // Find all by tag_id + pub async fn find_by_tag_id( + &self, + tag_id: i64, + uid: i64, + ) -> Result, DbErr> { + TransactionTagRelPrelude::find() + .filter(TransactionTagRelColumn::Uid.eq(uid)) + .filter(TransactionTagRelColumn::TagId.eq(tag_id)) + .filter(TransactionTagRelColumn::IsDeleted.eq(false)) + .all(&self.db) + .await + } + + // Update a TransactionTagRel + pub async fn update( + &self, + id: i64, + uid: Option, + transaction_id: Option, + tag_id: Option, + ) -> Result { + let mut active_model: TransactionTagRelActiveModel = TransactionTagRelPrelude::find_by_id(id) + .filter(TransactionTagRelColumn::Uid.eq(uid)) + .filter(TransactionTagRelColumn::IsDeleted.eq(false)) + .one(&self.db) + .await? + .ok_or(DbErr::RecordNotFound("TransactionTagRel not found".into()))? + .into(); + + if let Some(uid) = uid { + active_model.uid = Set(uid); + } + if let Some(transaction_id) = transaction_id { + active_model.transaction_id = Set(transaction_id); + } + if let Some(tag_id) = tag_id { + active_model.tag_id = Set(tag_id); + } + active_model.updated_at = Set(Local::now().naive_utc()); + + active_model.update(&self.db).await + } + + // Soft delete (set is_deleted = true) + pub async fn soft_delete(&self, id: i64, uid: i64) -> Result<(), DbErr> { + let mut active_model: TransactionTagRelActiveModel = TransactionTagRelPrelude::find_by_id(id) + .filter(TransactionTagRelColumn::Uid.eq(uid)) + .filter(TransactionTagRelColumn::IsDeleted.eq(false)) + .one(&self.db) + .await? + .ok_or(DbErr::RecordNotFound("TransactionTagRel not found".into()))? + .into(); + + active_model.is_deleted = Set(true); + active_model.updated_at = Set(Local::now().naive_utc()); + active_model.update(&self.db).await?; + Ok(()) + } + + // Hard delete (optional, use with caution) + pub async fn hard_delete(&self, id: i64, uid: i64) -> Result<(), DbErr> { + TransactionTagRelPrelude::delete_by_id(id) + .exec(&self.db).await?; + Ok(()) + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index beba6c2..6ac7cd9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,6 +15,8 @@ mod middleware; mod model; mod util; mod query; +mod dao; +mod dal; #[tokio::main] async fn main() {