]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/ActivityPub/Transmitter.php
Cache the profile as well
[friendica.git] / src / Protocol / ActivityPub / Transmitter.php
index baaaba0680e45100177a048ea5f70e7c4aa5ddce..6701f4254ca60882bbee429ff9bce119f07fd684 100644 (file)
@@ -44,7 +44,6 @@ use Friendica\Protocol\ActivityPub;
 use Friendica\Protocol\Relay;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\HTTPSignature;
-use Friendica\Util\JsonLD;
 use Friendica\Util\LDSignature;
 use Friendica\Util\Map;
 use Friendica\Util\Network;
@@ -59,6 +58,11 @@ use Friendica\Util\XML;
  */
 class Transmitter
 {
+       const CACHEKEY_FEATURED = 'transmitter:getFeatured:';
+       const CACHEKEY_CONTACTS = 'transmitter:getContacts:';
+       const CACHEKEY_OUTBOX   = 'transmitter:getOutbox:';
+       const CACHEKEY_PROFILE  = 'transmitter:getProfile:';
+
        /**
         * Add relay servers to the list of inboxes
         *
@@ -151,12 +155,21 @@ class Transmitter
         * @param string  $module    The name of the relevant AP endpoint module (followers|following)
         * @param integer $page      Page number
         * @param string  $requester URL of the requester
+        * @param boolean $nocache   Wether to bypass caching
         *
         * @return array of owners
         * @throws \Exception
         */
-       public static function getContacts(array $owner, array $rel, string $module, int $page = null, string $requester = null)
+       public static function getContacts(array $owner, array $rel, string $module, int $page = null, string $requester = null, $nocache = false)
        {
+               if (empty($page)) {
+                       $cachekey = self::CACHEKEY_CONTACTS . $module . ':'. $owner['uid'];
+                       $result = DI::cache()->get($cachekey);
+                       if (!$nocache && !is_null($result)) {
+                               return $result;
+                       }
+               }
+
                $parameters = [
                        'rel' => $rel,
                        'uid' => $owner['uid'],
@@ -192,6 +205,10 @@ class Transmitter
                }
 
                if (!$show_contacts) {
+                       if (!empty($cachekey)) {
+                               DI::cache()->set($cachekey, $data, Duration::DAY);
+                       }
+
                        return $data;
                }
 
@@ -216,6 +233,10 @@ class Transmitter
                        $data['orderedItems'] = $list;
                }
 
+               if (!empty($cachekey)) {
+                       DI::cache()->set($cachekey, $data, Duration::DAY);
+               }
+
                return $data;
        }
 
@@ -225,13 +246,22 @@ class Transmitter
         * @param array   $owner     Owner array
         * @param integer $page      Page number
         * @param string  $requester URL of requesting account
+        * @param boolean $nocache   Wether to bypass caching
         *
         * @return array of posts
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function getOutbox(array $owner, int $page = null, string $requester = '')
+       public static function getOutbox(array $owner, int $page = null, string $requester = '', $nocache = false)
        {
+               if (empty($page)) {
+                       $cachekey = self::CACHEKEY_OUTBOX . $owner['uid'];
+                       $result = DI::cache()->get($cachekey);
+                       if (!$nocache && !is_null($result)) {
+                               return $result;
+                       }
+               }
+
                $condition = ['private' => [Item::PUBLIC, Item::UNLISTED]];
 
                if (!empty($requester)) {
@@ -293,27 +323,42 @@ class Transmitter
                        $data['orderedItems'] = $list;
                }
 
+               if (!empty($cachekey)) {
+                       DI::cache()->set($cachekey, $data, Duration::DAY);
+               }
+
                return $data;
        }
 
        /**
         * Public posts for the given owner
         *
-        * @param array   $owner Owner array
-        * @param integer $page  Page number
+        * @param array   $owner   Owner array
+        * @param integer $page    Page number
+        * @param boolean $nocache Wether to bypass caching
         *
         * @return array of posts
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function getFeatured(array $owner, int $page = null)
+       public static function getFeatured(array $owner, int $page = null, $nocache = false)
        {
+               if (empty($page)) {
+                       $cachekey = self::CACHEKEY_FEATURED . $owner['uid'];
+                       $result = DI::cache()->get($cachekey);
+                       if (!$nocache && !is_null($result)) {
+                               return $result;
+                       }
+               }
+
+               $owner_cid = Contact::getIdForURL($owner['url'], 0, false);
+
                $condition = ["`uri-id` IN (SELECT `uri-id` FROM `collection-view` WHERE `cid` = ? AND `type` = ?)",
-                       Contact::getIdForURL($owner['url'], 0, false), Post\Collection::FEATURED];
+                       $owner_cid, Post\Collection::FEATURED];
 
                $condition = DBA::mergeConditions($condition,
                        ['uid'           => $owner['uid'],
-                       'author-id'      => Contact::getIdForURL($owner['url'], 0, false),
+                       'author-id'      => $owner_cid,
                        'private'        => [Item::PUBLIC, Item::UNLISTED],
                        'gravity'        => [GRAVITY_PARENT, GRAVITY_COMMENT],
                        'network'        => Protocol::FEDERATED,
@@ -362,6 +407,10 @@ class Transmitter
 
                $data['orderedItems'] = $list;
 
+               if (!empty($cachekey)) {
+                       DI::cache()->set($cachekey, $data, Duration::DAY);
+               }
+
                return $data;
        }
 
@@ -381,12 +430,19 @@ class Transmitter
         * Return the ActivityPub profile of the given user
         *
         * @param int $uid User ID
+        * @param boolean $nocache   Wether to bypass caching
         * @return array with profile data
         * @throws HTTPException\NotFoundException
         * @throws HTTPException\InternalServerErrorException
         */
-       public static function getProfile(int $uid): array
+       public static function getProfile(int $uid, $nocache = false): array
        {
+               $cachekey = self::CACHEKEY_PROFILE . $uid;
+               $result = DI::cache()->get($cachekey);
+               if (!$nocache && !is_null($result)) {
+                       return $result;
+               }
+
                $owner = User::getOwnerDataById($uid);
                if (!isset($owner['id'])) {
                        DI::logger()->error('Unable to find owner data for uid', ['uid' => $uid, 'callstack' => System::callstack(20)]);
@@ -480,6 +536,8 @@ class Transmitter
 
                $data['generator'] = self::getService();
 
+               DI::cache()->set($cachekey, $data, Duration::DAY);
+
                // tags: https://kitty.town/@inmysocks/100656097926961126.json
                return $data;
        }