fix: dont over-decrement on follow undo

This commit is contained in:
əlemi 2024-06-10 03:36:29 +02:00
parent 94c8900dcb
commit 3781d38f95
Signed by: alemi
GPG key ID: A4895B84D311642C

View file

@ -335,11 +335,22 @@ pub async fn undo(_ctx: &crate::Context, activity: impl apb::Activity, tx: &Data
) )
.await? .await?
.ok_or(ProcessorError::Incomplete)?; .ok_or(ProcessorError::Incomplete)?;
// no pending relation to undo
let relation = crate::model::relation::Entity::find()
.filter(model::relation::Column::Follower.eq(internal_uid))
.filter(model::relation::Column::Following.eq(internal_uid_following))
.one(tx)
.await?
.ok_or(ProcessorError::AlreadyProcessed)?;
crate::model::relation::Entity::delete_many() crate::model::relation::Entity::delete_many()
.filter(crate::model::relation::Column::Follower.eq(internal_uid)) .filter(crate::model::relation::Column::Follower.eq(internal_uid))
.filter(crate::model::relation::Column::Following.eq(internal_uid_following)) .filter(crate::model::relation::Column::Following.eq(internal_uid_following))
.exec(tx) .exec(tx)
.await?; .await?;
if relation.accept.is_some() {
crate::model::actor::Entity::update_many() crate::model::actor::Entity::update_many()
.filter(crate::model::actor::Column::Internal.eq(internal_uid)) .filter(crate::model::actor::Column::Internal.eq(internal_uid))
.col_expr(crate::model::actor::Column::FollowingCount, Expr::col(crate::model::actor::Column::FollowingCount).sub(1)) .col_expr(crate::model::actor::Column::FollowingCount, Expr::col(crate::model::actor::Column::FollowingCount).sub(1))
@ -350,6 +361,7 @@ pub async fn undo(_ctx: &crate::Context, activity: impl apb::Activity, tx: &Data
.col_expr(crate::model::actor::Column::FollowersCount, Expr::col(crate::model::actor::Column::FollowersCount).sub(1)) .col_expr(crate::model::actor::Column::FollowersCount, Expr::col(crate::model::actor::Column::FollowersCount).sub(1))
.exec(tx) .exec(tx)
.await?; .await?;
}
}, },
_ => return Err(ProcessorError::Unprocessable(activity.id()?.to_string())), _ => return Err(ProcessorError::Unprocessable(activity.id()?.to_string())),
} }