. * * @category Plugin * @package GNUsocial * @author Diogo Cordeiro * @author Daniel Supernault * @copyright 2018 Free Software Foundation http://fsf.org * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link https://www.gnu.org/software/social/ */ if (!defined('GNUSOCIAL')) { exit(1); } /** * Actor's Liked Collection * * @category Plugin * @package GNUsocial * @author Diogo Cordeiro * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://www.gnu.org/software/social/ */ class apActorLikedAction extends ManagedAction { protected $needLogin = false; protected $canPost = true; /** * Handle the Liked Collection request * * @author Diogo Cordeiro * @return void */ protected function handle() { try { $profile = Profile::getByID($this->trimmed('id')); $url = ActivityPubPlugin::actor_url($profile); } catch (Exception $e) { ActivityPubReturn::error('Invalid Actor URI.', 404); } if (!$profile->isLocal()) { ActivityPubReturn::error("This is not a local user."); } $limit = intval($this->trimmed('limit')); $since_id = intval($this->trimmed('since_id')); $max_id = intval($this->trimmed('max_id')); $limit = empty($limit) ? 40 : $limit; // Default is 40 $since_id = empty($since_id) ? null : $since_id; $max_id = empty($max_id) ? null : $max_id; // Max is 80 if ($limit > 80) { $limit = 80; } $fave = $this->fetch_faves($profile->getID(), $limit, $since_id, $max_id); $faves = array(); while ($fave->fetch()) { $faves[] = $this->pretty_fave(clone ($fave)); } $res = [ '@context' => [ "https://www.w3.org/ns/activitystreams", [ "@language" => "en" ] ], 'id' => "{$url}/liked.json", 'type' => 'OrderedCollection', 'totalItems' => Fave::countByProfile($profile), 'orderedItems' => $faves ]; ActivityPubReturn::answer($res); } /** * Take a fave object and turns it in a pretty array to be used * as a plugin answer * * @author Diogo Cordeiro * @param Fave $fave_object * @return array pretty array representating a Fave */ protected function pretty_fave($fave_object) { $res = array("uri" => $fave_object->uri, "created" => $fave_object->created, "object" => Activitypub_notice::notice_to_array(Notice::getByID($fave_object->notice_id))); return $res; } /** * Fetch faves * * @author Diogo Cordeiro * @param int32 $user_id * @param int32 $limit * @param int32 $since_id * @param int32 $max_id * @return Fave fetchable fave collection */ private static function fetch_faves( $user_id, $limit = 40, $since_id = null, $max_id = null ) { $fav = new Fave(); $fav->user_id = $user_id; $fav->orderBy('modified DESC'); if ($since_id != null) { $fav->whereAdd("notice_id > {$since_id}"); } if ($max_id != null) { $fav->whereAdd("notice_id < {$max_id}"); } $fav->limit($limit); $fav->find(); return $fav; } }