From 991b04580cc047b5149e29d48e5e63263f16d1f6 Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Sat, 12 Jun 2021 18:40:16 +0800 Subject: [PATCH] ActiveModel before_delete --- src/entity/active_model.rs | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/entity/active_model.rs b/src/entity/active_model.rs index 017ed28c..bc1a478e 100644 --- a/src/entity/active_model.rs +++ b/src/entity/active_model.rs @@ -72,6 +72,10 @@ pub trait ActiveModelTrait: Clone + Debug { fn is_unset(&self, c: ::Column) -> bool; fn default() -> Self; + + // below is not yet possible. right now we define these methods in DeriveActiveModel + // fn save(self, db: &Database) -> impl Future>; + // fn delete(self, db: &Database) -> impl Future>; } /// Behaviors for users to override @@ -81,15 +85,20 @@ pub trait ActiveModelBehavior: ActiveModelTrait { ::default() } - /// Will be called before saving to database + /// Will be called before saving fn before_save(self) -> Self { self } - /// Will be called after saving to database + /// Will be called after saving fn after_save(self) -> Self { self } + + /// Will be called before deleting + fn before_delete(self) -> Self { + self + } } pub trait IntoActiveModel @@ -218,7 +227,8 @@ where /// Only works if the entity has auto increment primary key. pub async fn save_active_model(mut am: A, db: &Database) -> Result where - A: ActiveModelBehavior + ActiveModelTrait + From, + A: ActiveModelBehavior + ActiveModelTrait, + E::Model: IntoActiveModel, E: EntityTrait, { am = ActiveModelBehavior::before_save(am); @@ -241,7 +251,8 @@ where async fn insert_and_select_active_model(am: A, db: &Database) -> Result where - A: ActiveModelTrait + From, + A: ActiveModelTrait, + E::Model: IntoActiveModel, E: EntityTrait, { let exec = E::insert(am).exec(db); @@ -252,7 +263,7 @@ where let res = find.await; let model: Option = res.map_err(|_| ExecErr)?; match model { - Some(model) => Ok(model.into()), + Some(model) => Ok(model.into_active_model()), None => Err(ExecErr), } } else { @@ -269,11 +280,12 @@ where exec.await } -pub async fn delete_active_model(am: A, db: &Database) -> Result +pub async fn delete_active_model(mut am: A, db: &Database) -> Result where - A: ActiveModelTrait, + A: ActiveModelBehavior + ActiveModelTrait, E: EntityTrait, { + am = ActiveModelBehavior::before_delete(am); let exec = E::delete(am).exec(db); exec.await }