feat: undo Announces, also delete undone activity

This commit is contained in:
əlemi 2025-02-05 20:24:52 +01:00
parent 81bb1e92e7
commit bf376b15ac
Signed by: alemi
GPG key ID: A4895B84D311642C

View file

@ -466,12 +466,42 @@ pub async fn process_undo(ctx: &crate::Context, activity: impl apb::Activity, tx
)
.exec(tx)
.await?;
crate::model::activity::Entity::delete_many()
.filter(crate::model::activity::Column::Id.eq(undone_activity_id))
.exec(tx)
.await?;
crate::model::object::Entity::update_many()
.filter(crate::model::object::Column::Internal.eq(internal_oid))
.col_expr(crate::model::object::Column::Likes, Expr::col(crate::model::object::Column::Likes).sub(1))
.exec(tx)
.await?;
},
apb::ActivityType::Announce => {
let internal_oid = crate::model::object::Entity::ap_to_internal(
&undone_activity.object.ok_or(apb::FieldErr("object"))?,
tx
)
.await?
.ok_or(ProcessorError::Incomplete)?;
crate::model::announce::Entity::delete_many()
.filter(
Condition::all()
.add(crate::model::announce::Column::Actor.eq(internal_uid))
.add(crate::model::announce::Column::Object.eq(internal_oid))
.add(crate::model::announce::Column::Activity.eq(&undone_activity_id))
)
.exec(tx)
.await?;
crate::model::activity::Entity::delete_many()
.filter(crate::model::activity::Column::Id.eq(undone_activity_id))
.exec(tx)
.await?;
crate::model::object::Entity::update_many()
.filter(crate::model::object::Column::Internal.eq(internal_oid))
.col_expr(crate::model::object::Column::Announces, Expr::col(crate::model::object::Column::Announces).sub(1))
.exec(tx)
.await?;
},
apb::ActivityType::Follow => {
let internal_uid_following = crate::model::actor::Entity::ap_to_internal(
&undone_activity.object.ok_or(apb::FieldErr("object"))?,
@ -518,12 +548,10 @@ pub async fn process_undo(ctx: &crate::Context, activity: impl apb::Activity, tx
ctx.address(Some(&activity_model), None, tx).await?;
}
if let Some(internal) = crate::model::activity::Entity::ap_to_internal(&undone_activity.id, tx).await? {
crate::model::notification::Entity::delete_many()
.filter(crate::model::notification::Column::Activity.eq(internal))
.exec(tx)
.await?;
}
crate::model::notification::Entity::delete_many()
.filter(crate::model::notification::Column::Activity.eq(undone_activity.internal))
.exec(tx)
.await?;
Ok(())
}