I think all the notice deletion calls are event-compatible now

This means we can handle DeleteNoticeAsProfile in plugins, such as
the ActivityModeration plugin.
This commit is contained in:
Mikael Nordfeldth 2015-10-03 12:26:09 +02:00
parent 88f7bb1ed5
commit dac617d95a
9 changed files with 41 additions and 26 deletions

View File

@ -124,7 +124,7 @@ class ApiStatusesDestroyAction extends ApiAuthAction
if ($this->user->id == $this->notice->profile_id) { if ($this->user->id == $this->notice->profile_id) {
if (Event::handle('StartDeleteOwnNotice', array($this->user, $this->notice))) { if (Event::handle('StartDeleteOwnNotice', array($this->user, $this->notice))) {
$this->notice->delete(); $this->notice->deleteAs($this->scoped);
Event::handle('EndDeleteOwnNotice', array($this->user, $this->notice)); Event::handle('EndDeleteOwnNotice', array($this->user, $this->notice));
} }
$this->showNotice(); $this->showNotice();

View File

@ -236,7 +236,7 @@ class ApiStatusesShowAction extends ApiPrivateAuthAction
} }
if (Event::handle('StartDeleteOwnNotice', array($this->auth_user, $this->notice))) { if (Event::handle('StartDeleteOwnNotice', array($this->auth_user, $this->notice))) {
$this->notice->delete(); $this->notice->deleteAs($this->scoped);
Event::handle('EndDeleteOwnNotice', array($this->auth_user, $this->notice)); Event::handle('EndDeleteOwnNotice', array($this->auth_user, $this->notice));
} }

View File

@ -65,7 +65,7 @@ class DeletenoticeAction extends FormAction
{ {
if ($this->arg('yes')) { if ($this->arg('yes')) {
if (Event::handle('StartDeleteOwnNotice', array($this->scoped->getUser(), $this->notice))) { if (Event::handle('StartDeleteOwnNotice', array($this->scoped->getUser(), $this->notice))) {
$this->notice->delete(); $this->notice->deleteAs($this->scoped);
Event::handle('EndDeleteOwnNotice', array($this->scoped->getUser(), $this->notice)); Event::handle('EndDeleteOwnNotice', array($this->scoped->getUser(), $this->notice));
} }
} else { } else {

View File

@ -158,20 +158,14 @@ class Notice extends Managed_DataObject
$this->_profile[$this->profile_id] = $profile; $this->_profile[$this->profile_id] = $profile;
} }
public function deleteAs(Profile $actor) public function deleteAs(Profile $actor, $delete_event=true)
{ {
if ($this->getProfile()->sameAs($actor) || $actor->hasRight(Right::DELETEOTHERSNOTICE)) { if (!$this->getProfile()->sameAs($actor) && !$actor->hasRight(Right::DELETEOTHERSNOTICE)) {
return $this->delete(); throw new AuthorizationException(_('You are not allowed to delete another user\'s notice.'));
} }
throw new AuthorizationException(_('You are not allowed to delete other user\'s notices'));
}
public function delete($useWhere=false)
{
if (Event::handle('NoticeDeleteRelated', array($this))) { if (Event::handle('NoticeDeleteRelated', array($this))) {
// Clear related records // Clear related records
$this->clearReplies(); $this->clearReplies();
$this->clearLocation(); $this->clearLocation();
$this->clearRepeats(); $this->clearRepeats();
@ -179,10 +173,21 @@ class Notice extends Managed_DataObject
$this->clearGroupInboxes(); $this->clearGroupInboxes();
$this->clearFiles(); $this->clearFiles();
$this->clearAttentions(); $this->clearAttentions();
// NOTE: we don't clear queue items // NOTE: we don't clear queue items
} }
$result = null;
if (!$delete_event || Event::handle('DeleteNoticeAsProfile', array($this, $actor, &$result))) {
// If $delete_event is true, we run the event. If the Event then
// returns false it is assumed everything was handled properly
// and the notice was deleted.
$result = $this->delete();
}
return $result;
}
public function delete($useWhere=false)
{
$result = parent::delete($useWhere); $result = parent::delete($useWhere);
$this->blowOnDelete(); $this->blowOnDelete();

View File

@ -114,7 +114,7 @@ class ActivityMover extends QueueHandler
$sink->postActivity($act); $sink->postActivity($act);
$notice = Notice::getKV('uri', $act->objects[0]->id); $notice = Notice::getKV('uri', $act->objects[0]->id);
if (!empty($notice)) { if (!empty($notice)) {
$notice->delete(); $notice->deleteAs($user->getProfile(), false);
} }
break; break;
case ActivityVerb::JOIN: case ActivityVerb::JOIN:

View File

@ -59,13 +59,21 @@ class ActivityModerationPlugin extends ActivityVerbHandlerPlugin
public function deleteRelated(Notice $notice) public function deleteRelated(Notice $notice)
{ {
if ($notice->getProfile()->hasRole(Profile_role::DELETED)) { // pass
// Don't save a new Deleted_notice entry if the profile is being deleted }
public function onDeleteNoticeAsProfile(Notice $stored, Profile $actor, &$result) {
// By adding a new 'delete' verb we will eventually trigger $this->saveObjectFromActivity
if (false === Deleted_notice::addNew($stored, $actor)) {
// false is returned if we did not have an error, but did not create the object
// (i.e. the author is currently being deleted)
return true; return true;
} }
// For auditing purposes, save a record that the notice was deleted. // We return false (to stop the event) if the deleted_notice entry was
return Deleted_notice::addNew($notice); // added, which means we have run $this->saveObjectFromActivity which
// in turn has called the delete function of the notice.
return false;
} }
/** /**

View File

@ -54,13 +54,15 @@ class Deleted_notice extends Managed_DataObject
); );
} }
public static function addNew(Notice $notice) public static function addNew(Notice $notice, Profile $actor=null)
{ {
$actor = $notice->getProfile(); if (is_null($actor)) {
$actor = $notice->getProfile();
}
if ($actor->hasRole(Profile_role::DELETED)) { if ($notice->getProfile()->hasRole(Profile_role::DELETED)) {
// Don't emit notices if the user is deleted // Don't emit notices if the notice author is (being) deleted
return true; return false;
} }
$act = new Activity(); $act = new Activity();
@ -80,7 +82,7 @@ class Deleted_notice extends Managed_DataObject
); );
$act->actor = $actor->asActivityObject(); $act->actor = $actor->asActivityObject();
$act->target = new ActivityObject(); $act->target = new ActivityObject(); // We don't save the notice object, as it's supposed to be removed!
$act->target->id = $notice->getUri(); $act->target->id = $notice->getUri();
$act->objects = array(clone($act->target)); $act->objects = array(clone($act->target));

View File

@ -138,7 +138,7 @@ class CancelrsvpAction extends Action
// NB: this will delete the rsvp, too // NB: this will delete the rsvp, too
if (!empty($notice)) { if (!empty($notice)) {
common_log(LOG_DEBUG, "Deleting notice..."); common_log(LOG_DEBUG, "Deleting notice...");
$notice->delete(); $notice->deleteAs($this->scoped);
} else { } else {
common_log(LOG_DEBUG, "Deleting RSVP alone..."); common_log(LOG_DEBUG, "Deleting RSVP alone...");
$this->rsvp->delete(); $this->rsvp->delete();

View File

@ -192,7 +192,7 @@ class EditphotoAction extends Action
$this->photo->delete(); $this->photo->delete();
if (Event::handle('StartDeleteOwnNotice', array($this->user, $notice))) { if (Event::handle('StartDeleteOwnNotice', array($this->user, $notice))) {
$notice->delete(); $notice->deleteAs($this->scoped);
Event::handle('EndDeleteOwnNotice', array($this->user, $notice)); Event::handle('EndDeleteOwnNotice', array($this->user, $notice));
} }
$this->showForm(_('Success!')); $this->showForm(_('Success!'));