]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Favorites are now being stored from activities
authorMikael Nordfeldth <mmn@hethane.se>
Tue, 1 Jul 2014 22:22:27 +0000 (00:22 +0200)
committerMikael Nordfeldth <mmn@hethane.se>
Wed, 2 Jul 2014 16:38:19 +0000 (18:38 +0200)
classes/Notice.php
lib/activityhandlerplugin.php
lib/activityutils.php
plugins/Favorite/FavoritePlugin.php
plugins/Favorite/classes/Fave.php
plugins/OStatus/actions/usersalmon.php
plugins/OStatus/lib/salmonaction.php

index f11c670603dc202f8deb87c00a3ca2dc23c20a82..e71500145d2e000410f6542ad64f34c4164c4873 100644 (file)
@@ -721,8 +721,8 @@ class Notice extends Managed_DataObject
         return $notice;
     }
 
-    static function saveActivity(Activity $act, Profile $actor, array $options=array()) {
-
+    static function saveActivity(Activity $act, Profile $actor, array $options=array())
+    {
         // First check if we're going to let this Activity through from the specific actor
         if (!$actor->hasRight(Right::NEWNOTICE)) {
             common_log(LOG_WARNING, "Attempted post from user disallowed to post: " . $actor->getNickname());
@@ -737,6 +737,7 @@ class Notice extends Managed_DataObject
                                         'and post again in a few minutes.'));
         }
 
+/* This interferes with stuff like Favorites from old StatusNet installations (first object in objects is the favored notice)
         // Get ActivityObject properties
         $actobj = count($act->objects)==1 ? $act->objects[0] : null;
         if (!is_null($actobj) && $actobj->id) {
@@ -753,6 +754,7 @@ class Notice extends Managed_DataObject
             $options['uri'] = $act->id;
             $options['url'] = $act->link;
         }
+*/
 
         $defaults = array(
                           'groups'   => array(),
@@ -883,7 +885,7 @@ class Notice extends Managed_DataObject
                     throw new ServerException('No object from StoreActivityObject '.$stored->uri . ': '.$act->asString());
                 }
                 $orig = clone($stored);
-                $stored->object_type = ActivityUtils::resolveUri($object->type, true);
+                $stored->object_type = ActivityUtils::resolveUri($object->getObjectType(), true);
                 $stored->update($orig);
             } catch (Exception $e) {
                 if (empty($stored->id)) {
@@ -896,7 +898,7 @@ class Notice extends Managed_DataObject
             }
         }
 
-
+        common_debug(get_called_class().' looking up mentions metadata etc.');
         // Save per-notice metadata...
         $mentions = array();
         $groups   = array();
@@ -933,6 +935,8 @@ class Notice extends Managed_DataObject
             // Prepare inbox delivery, may be queued to background.
             $stored->distribute();
         }
+        
+        common_debug(get_called_class().' returning stored activity - success!');
 
         return $stored;
     }
index d972d175520cbf82cd73f70cf6d31799af618626..113b7eab1e0255b40ea9171d01ec3d65b5374fd0 100644 (file)
@@ -158,7 +158,7 @@ abstract class ActivityHandlerPlugin extends Plugin
     *
     * @return Notice the resulting notice
     */
-    public function saveObjectFromActivity(Activity $activity, Notice $stored, array $options=array())
+    protected function saveObjectFromActivity(Activity $activity, Notice $stored, array $options=array())
     {
         throw new ServerException('This function should be abstract when all plugins have migrated to saveObjectFromActivity');
     }
@@ -317,7 +317,11 @@ abstract class ActivityHandlerPlugin extends Plugin
                          'is_local' => Notice::REMOTE,
                          'source' => 'ostatus');
 
-        $notice = $this->saveNoticeFromActivity($activity, $profile, $options);
+        if (!isset($this->oldSaveNew)) {
+            $notice = Notice::saveActivity($activity, $profile, $options);
+        } else {
+            $notice = $this->saveNoticeFromActivity($activity, $profile, $options);
+        }
 
         return false;
     }
@@ -339,22 +343,28 @@ abstract class ActivityHandlerPlugin extends Plugin
 
         $this->log(LOG_INFO, "Checking {$activity->id} as a valid Salmon slap.");
 
-        if ($target instanceof User_group) {
+        if ($target instanceof User_group || $target->isGroup()) {
             $uri = $target->getUri();
             if (!array_key_exists($uri, $activity->context->attention)) {
                 // @todo FIXME: please document (i18n).
                 // TRANS: Client exception thrown when ...
                 throw new ClientException(_('Object not posted to this group.'));
             }
-        } else if ($target instanceof User) {
-            $uri      = $target->uri;
+        } elseif ($target instanceof Profile && $target->isLocal()) {
+            common_debug(get_called_class() . ' got a salmon slap against target profile ID: '.$target->id);
             $original = null;
+            // FIXME: Shouldn't favorites show up with a 'target' activityobject?
+            if (!ActivityUtils::compareTypes($activity->verb, array(ActivityVerb::POST)) && isset($activity->objects[0])) {
+                // If this is not a post, it's a verb targeted at something (such as a Favorite attached to a note)
+                if (!empty($activity->objects[0]->id)) {
+                    $activity->context->replyToID = $activity->objects[0]->id;
+                }
+            }
             if (!empty($activity->context->replyToID)) {
                 $original = Notice::getKV('uri', $activity->context->replyToID);
             }
-            if (!array_key_exists($uri, $activity->context->attention) &&
-                (empty($original) ||
-                 $original->profile_id != $target->id)) {
+            if ((!$original instanceof Notice || $original->profile_id != $target->id)
+                    && !array_key_exists($target->getUri(), $activity->context->attention)) {
                 // @todo FIXME: Please document (i18n).
                 // TRANS: Client exception when ...
                 throw new ClientException(_('Object not posted to this user.'));
@@ -364,9 +374,15 @@ abstract class ActivityHandlerPlugin extends Plugin
             throw new ServerException(_('Do not know how to handle this kind of target.'));
         }
 
+        common_debug(get_called_class() . ' ensuring ActivityObject profile for '.$activity->actor->id);
         $actor = Ostatus_profile::ensureActivityObjectProfile($activity->actor);
 
-        $object = $activity->objects[0];
+        // FIXME: will this work in all cases? I made it work for Favorite...
+        if (ActivityUtils::compareTypes($activity->verb, array(ActivityVerb::POST))) {
+            $object = $activity->objects[0];
+        } else {
+            $object = $activity;
+        }
 
         $options = array('uri' => $object->id,
                          'url' => $object->link,
@@ -374,7 +390,12 @@ abstract class ActivityHandlerPlugin extends Plugin
                          'source' => 'ostatus');
 
         // $actor is an ostatus_profile
-        $this->saveNoticeFromActivity($activity, $actor->localProfile(), $options);
+        common_debug(get_called_class() . ' going to save notice from activity!');
+        if (!isset($this->oldSaveNew)) {
+            $notice = Notice::saveActivity($activity, $target, $options);
+        } else {
+            $notice = $this->saveNoticeFromActivity($activity, $target, $options);
+        }
 
         return false;
     }
index e9d5d1fba5711adf8adbb33670c669a3e3d81048..feb74f303f3d22d1f36fdae36e025593818797a0 100644 (file)
@@ -398,7 +398,7 @@ class ActivityUtils
         if (!empty($object)) {
             Event::handle('EndFindLocalActivityObject', array($object->getUri(), $type, $object));
         } else {
-            throw new Exception('Could not find any activityobject stored locally with given URI');
+            throw new ServerException('Could not find any activityobject stored locally with given URI');
         }
         return $object;
     }
index 18aa32738b6b866d8ba46d0f5d8e7e5ca519eb13..3d27d24a7f0a7d32e8070f601bbeac36ccb2a564 100644 (file)
@@ -147,39 +147,31 @@ class FavoritePlugin extends ActivityHandlerPlugin
                           'format' => '(xml|json)'));
     }
 
-    public function saveNoticeFromActivity(Activity $activity, Profile $actor, array $options=array())
-    {
-    }
-
-    // FIXME: Set this to abstract public when all plugins have migrated!
-    public function saveObjectFromActivity(Activity $activity, Notice $stored, array $options=array())  
+    // FIXME: Set this to abstract public in lib/activityhandlerplugin.php ddwhen all plugins have migrated!
+    protected function saveObjectFromActivity(Activity $act, Notice $stored, array $options=array())  
     {
         assert($this->isMyActivity($act));
-        $actor = $stored->getProfile();
-        $uris = array();
-        if (count($act->objects) != 1) {
-            // TRANS: Exception thrown when a favor activity has anything but 1 object
-            throw new ClientException(_('Favoring activites can only be done one at a time'));
+
+        // If empty, we should've created it ourselves on our node.
+        if (!isset($options['created'])) {
+            $options['created'] = !empty($act->time) ? common_sql_date($act->time) : common_sql_now();
+        }
+        if (!isset($options['uri'])) {
+            $options['uri'] = !empty($act->id) ? $act->id : $act->selfLink;
         }
 
-        $obj = $act->objects[0];
-        $type = isset($obj->type) ? ActivityUtils::resolveUri($obj->type, true) : ActivityObject::NOTE;
-        $uris = $obj->getIdentifiers();
+        // We must have an objects[0] here because in isMyActivity we require the count to be == 1
+        $actobj = $act->objects[0];
+
         try {
-            $local = ActivityUtils::findLocalObject($uris, $type);
-        } catch (Exception $e) {
-            // TODO: if it's not available locally, we should import the favorited object!
-            common_debug('Could not find favored notice locally: '.var_export($uris,true));
+            $object = Fave::saveActivityObject($actobj, $stored);
+        } catch (ServerException $e) {
+            // Probably that the favored notice doesn't exist in our local database
+            // but may also be some missing profile or so, which we could catch in a
+            // more explicit catch-statement.
             return null;
         }
-
-        if (!empty($act->time)) {
-            // This should reasonably mean that it was created on our instance.
-            $options['created'] = common_sql_date($act->time);
-        }
-
-        $options['uri'] = !empty($act->id) ? $act->id : $act->selfLink;
-        $object = Fave::saveNew($actor, $local, $type, $options);
+        common_debug(get_called_class().' returning '.get_class($object).' object with uri: '.$object->uri);
         return $object;
     }
 
index 0801ef8717d3a8f569c3481fd44bf9fc0a778820..3ec5fadd7b8c0cad65f802343e93d8795e2b2c06 100644 (file)
@@ -79,7 +79,8 @@ class Fave extends Managed_DataObject
     }
 
     // exception throwing takeover!
-    public function insert() {
+    public function insert()
+    {
         if (!parent::insert()) {
             throw new ServerException(sprintf(_m('Could not store new object of type %s'), get_called_class()));
         }
@@ -169,7 +170,8 @@ class Fave extends Managed_DataObject
         return $act;
     }
 
-    static function existsForProfile($notice, Profile $scoped) {
+    static function existsForProfile($notice, Profile $scoped)
+    {
         $fave = self::pkeyGet(array('user_id'=>$scoped->id, 'notice_id'=>$notice->id));
 
         return ($fave instanceof Fave);
@@ -270,7 +272,8 @@ class Fave extends Managed_DataObject
 
     // Remember that we want the _activity_ notice here, not faves applied
     // to the supplied Notice (as with byNotice)!
-    static public function fromStored(Notice $stored) {
+    static public function fromStored(Notice $stored)
+    {
         $class = get_called_class();
         $object = new $class;
         $object->uri = $stored->uri;
@@ -280,16 +283,18 @@ class Fave extends Managed_DataObject
         return $object;
     }
 
-    static public function verbToTitle($verb) {
+    static public function verbToTitle($verb)
+    {
         return ucfirst($verb);
     }
 
-    static public function object_type()
+    static public function getObjectType()
     {
         return 'activity';
     }
 
-    public function asActivityObject(Profile $scoped=null) {
+    public function asActivityObject(Profile $scoped=null)
+    {
         $actobj = new ActivityObject();
         $actobj->id = $this->getUri();
         $actobj->type = ActivityUtils::resolveUri(ActivityObject::ACTIVITY);
@@ -301,35 +306,51 @@ class Fave extends Managed_DataObject
         return $actobj;
     }
 
-    static public function parseActivityObject(ActivityObject $actobj, Notice $stored) {
+    static public function parseActivityObject(ActivityObject $actobj, Notice $stored)
+    {
+        // The ActivityObject we get here is the _favored_ notice (kind of what we're "in-reply-to")
+        // The Notice we get is the _activity_ stored in our Notice table
+
+        $type = isset($actobj->type) ? ActivityUtils::resolveUri($actobj->type, true) : ActivityObject::NOTE;
+        $local = ActivityUtils::findLocalObject($actobj->getIdentifiers(), $type); 
+        if (!$local instanceof Notice) {
+            // $local always returns something, but this was not what we expected. Something is wrong.
+            throw new Exception('Something other than a Notice was returned from findLocalObject');
+        }
         $actor = $stored->getProfile();
         $object = new Fave();
-        $object->user_id = $actor->id;
-        $object->notice_id = $stored->id;
-        $object->object_uri = $stored->uri;
+        $object->user_id = $stored->getProfile()->id;
+        $object->notice_id = $local->id;
+        $object->uri = $stored->uri;
         $object->created = $stored->created;
+        $object->modified = $stored->modified;
         return $object;
     }
 
-    static function saveActivityObject(ActivityObject $actobj, Notice $stored) {
+    static function saveActivityObject(ActivityObject $actobj, Notice $stored)
+    {
         $object = self::parseActivityObject($actobj, $stored);
         $object->insert();  // exception throwing!
         return $object;
     }
 
 
-    public function getTarget() {
+    public function getTarget()
+    {
         // throws exception on failure
         return ActivityUtils::findLocalObject(array($this->uri), $this->type);
     }
 
-    public function getTargetObject() {
+    public function getTargetObject()
+    {
         return $this->getTarget()->asActivityObject();
     }
 
     protected $_stored = array();
 
-    public function getStored() {
+    public function getStored()
+    {
         if (!isset($this->_stored[$this->uri])) {
             $stored = new Notice();
             $stored->uri = $this->uri;
@@ -341,7 +362,8 @@ class Fave extends Managed_DataObject
         return $this->_stored[$this->uri];
     }
 
-    public function getActor() {
+    public function getActor()
+    {
         $profile = new Profile();
         $profile->id = $this->user_id;
         if (!$profile->find(true)) {
@@ -350,7 +372,8 @@ class Fave extends Managed_DataObject
         return $profile;
     }
 
-    public function getActorObject() {
+    public function getActorObject()
+    {
         return $this->getActor()->asActivityObject();
     }
 
@@ -371,7 +394,7 @@ class Fave extends Managed_DataObject
         }
         return TagURI::mint(strtolower(get_called_class()).':%d:%s:%d:%s',
                                         $actor->id,
-                                        ActivityUtils::resolveUri(self::object_type(), true),
+                                        ActivityUtils::resolveUri(self::getObjectType(), true),
                                         $target->id,
                                         common_date_iso8601($created));
     }
index 8b0ab2f83c7c832d2e4e7c4531d84be4858642b6..7fce6c808c5118fba49450ce95049fd4973cd2c1 100644 (file)
@@ -130,47 +130,6 @@ class UsersalmonAction extends SalmonAction
         }
     }
 
-    /**
-     * Remote user likes one of our posts.
-     * Confirm the post is ours, and save a local favorite event.
-     */
-
-    function handleFavorite()
-    {
-        $notice = $this->getNotice($this->activity->objects[0]);
-
-        $old = Fave::pkeyGet(array('user_id' => $this->actor->id,
-                                   'notice_id' => $notice->id));
-
-        if ($old instanceof Fave) {
-            // TRANS: Client exception.
-            throw new AlreadyFulfilledException(_m('This is already a favorite.'));
-        }
-
-        if (!Fave::addNew($this->actor, $notice)) {
-           // TRANS: Client exception.
-           throw new ClientException(_m('Could not save new favorite.'));
-        }
-    }
-
-    /**
-     * Remote user doesn't like one of our posts after all!
-     * Confirm the post is ours, and save a local favorite event.
-     */
-    function handleUnfavorite()
-    {
-        $notice = $this->getNotice($this->activity->objects[0]);
-
-        $fave = Fave::pkeyGet(array('user_id' => $this->actor->id,
-                                   'notice_id' => $notice->id));
-        if (!$fave instanceof Fave) {
-            // TRANS: Client exception.
-            throw new AlreadyFulfilledException(_m('Notice was not favorited!'));
-        }
-
-        $fave->delete();
-    }
-
     function handleTag()
     {
         if ($this->activity->target->type == ActivityObject::_LIST) {
index 186d5acfbbafc84a7f1125f68bb96929a15288e5..d26c1f949b7584b13a8150376c0ceeebc9029931 100644 (file)
@@ -91,12 +91,6 @@ class SalmonAction extends Action
                 case ActivityVerb::SHARE:
                     $this->handleShare();
                     break;
-                case ActivityVerb::FAVORITE:
-                    $this->handleFavorite();
-                    break;
-                case ActivityVerb::UNFAVORITE:
-                    $this->handleUnfavorite();
-                    break;
                 case ActivityVerb::FOLLOW:
                 case ActivityVerb::FRIEND:
                     $this->handleFollow();
@@ -152,18 +146,6 @@ class SalmonAction extends Action
         throw new ClientException(_m('This target does not understand unfollows.'));
     }
 
-    function handleFavorite()
-    {
-        // TRANS: Client exception.
-        throw new ClientException(_m('This target does not understand favorites.'));
-    }
-
-    function handleUnfavorite()
-    {
-        // TRANS: Client exception.
-        throw new ClientException(_m('This target does not understand unfavorites.'));
-    }
-
     function handleShare()
     {
         // TRANS: Client exception.