Some work on ActivityModeration with notice deletion

Let's now create an event called DeleteNotice and also make sure we
handle the onNoticeDeleteRelated properly in ActivityModeration to
avoid possible endless loops etc.
This commit is contained in:
Mikael Nordfeldth
2015-10-03 02:02:37 +02:00
parent ae73baf4ee
commit 88f7bb1ed5
8 changed files with 346 additions and 80 deletions

View File

@@ -0,0 +1,118 @@
<?php
/**
* @package Activity
* @maintainer Mikael Nordfeldth <mmn@hethane.se>
*/
class ActivityModerationPlugin extends ActivityVerbHandlerPlugin
{
public function tag()
{
return 'actmod';
}
public function types()
{
return array();
}
public function verbs()
{
return array(ActivityVerb::DELETE);
}
public function onBeforePluginCheckSchema()
{
Deleted_notice::beforeSchemaUpdate();
return true;
}
public function onCheckSchema()
{
$schema = Schema::get();
$schema->ensureTable('deleted_notice', Deleted_notice::schemaDef());
return true;
}
protected function getActionTitle(ManagedAction $action, $verb, Notice $target, Profile $scoped)
{
// FIXME: switch based on action type
return _m('TITLE', 'Notice moderation');
}
protected function doActionPreparation(ManagedAction $action, $verb, Notice $target, Profile $scoped)
{
// pass
}
protected function doActionPost(ManagedAction $action, $verb, Notice $target, Profile $scoped)
{
switch (true) {
case ActivityUtils::compareVerbs($verb, array(ActivityVerb::DELETE)):
// do whatever preparation is necessary to delete a verb
$target->delete();
break;
default:
throw new ServerException('ActivityVerb POST not handled by plugin that was supposed to do it.');
}
}
public function deleteRelated(Notice $notice)
{
if ($notice->getProfile()->hasRole(Profile_role::DELETED)) {
// Don't save a new Deleted_notice entry if the profile is being deleted
return true;
}
// For auditing purposes, save a record that the notice was deleted.
return Deleted_notice::addNew($notice);
}
/**
* This is run when a 'delete' verb activity comes in.
*
* @return boolean hook flag
*/
protected function saveObjectFromActivity(Activity $act, Notice $stored, array $options=array())
{
// Let's see if this has been deleted already.
$deleted = Deleted_notice::getKV('uri', $act->id);
if ($deleted instanceof Deleted_notice) {
return $deleted;
}
common_debug('DELETING notice: ' . $act->objects[0]->id);
$target = Notice::getByUri($act->objects[0]->id);
$deleted = new Deleted_notice();
$deleted->id = $target->getID();
$deleted->profile_id = $target->getProfile()->getID();
$deleted->uri = Deleted_notice::newUri($target->getProfile(), $target);
$deleted->act_uri = $target->getUri();
$deleted->act_created = $target->created;
$deleted->created = common_sql_now();
common_debug('DELETING notice, storing Deleted_notice entry');
$deleted->insert();
common_debug('DELETING notice, actually deleting now!');
$target->delete();
return $deleted;
}
public function activityObjectFromNotice(Notice $notice)
{
$object = Deleted_notice::fromStored($notice);
return $object->asActivityObject();
}
protected function getActivityForm(ManagedAction $action, $verb, Notice $target, Profile $scoped)
{
if (!$scoped instanceof Profile || !($scoped->sameAs($target->getProfile()) || $scoped->hasRight(Right::DELETEOTHERSNOTICE))) {
throw new AuthorizationException(_('You are not allowed to delete other user\'s notices'));
}
return DeletenoticeForm($action, array('notice'=>$target));
}
}