feat: add dal dao

This commit is contained in:
brian
2025-09-22 21:58:30 +08:00
parent bf2e1f2af6
commit 891982ede0
5 changed files with 134 additions and 0 deletions

1
src/dal/mod.rs Normal file
View File

@@ -0,0 +1 @@
pub mod transaction;

0
src/dal/transaction.rs Normal file
View File

1
src/dao/mod.rs Normal file
View File

@@ -0,0 +1 @@
pub mod transaction_tag_rel;

View File

@@ -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<TransactionTagRelModel, DbErr> {
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<Option<TransactionTagRelModel>, 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<Vec<TransactionTagRelModel>, 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<Vec<TransactionTagRelModel>, 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<i64>,
transaction_id: Option<i64>,
tag_id: Option<i64>,
) -> Result<TransactionTagRelModel, 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();
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(())
}
}

View File

@@ -15,6 +15,8 @@ mod middleware;
mod model; mod model;
mod util; mod util;
mod query; mod query;
mod dao;
mod dal;
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {