]> git.mxchange.org Git - friendica.git/commitdiff
Set the "Link" header
authorMichael <heluecht@pirati.ca>
Wed, 16 Jun 2021 15:02:33 +0000 (15:02 +0000)
committerMichael <heluecht@pirati.ca>
Wed, 16 Jun 2021 15:02:33 +0000 (15:02 +0000)
18 files changed:
src/Module/Api/Mastodon/Accounts/Followers.php
src/Module/Api/Mastodon/Accounts/Following.php
src/Module/Api/Mastodon/Accounts/Statuses.php
src/Module/Api/Mastodon/Blocks.php
src/Module/Api/Mastodon/Bookmarks.php
src/Module/Api/Mastodon/Conversations.php
src/Module/Api/Mastodon/Favourited.php
src/Module/Api/Mastodon/FollowRequests.php
src/Module/Api/Mastodon/Lists/Accounts.php
src/Module/Api/Mastodon/Mutes.php
src/Module/Api/Mastodon/Notifications.php
src/Module/Api/Mastodon/Search.php
src/Module/Api/Mastodon/Timelines/Direct.php
src/Module/Api/Mastodon/Timelines/Home.php
src/Module/Api/Mastodon/Timelines/ListTimeline.php
src/Module/Api/Mastodon/Timelines/PublicTimeline.php
src/Module/Api/Mastodon/Timelines/Tag.php
src/Module/BaseApi.php

index 666cafc4205f84c946db666ce63e95dee7e633b9..c495d6ca1ec8b70b3ca6841061ab620880064cfa 100644 (file)
@@ -77,6 +77,7 @@ class Followers extends BaseApi
 
                $followers = DBA::select('contact-relation', ['relation-cid'], $condition, $parameters);
                while ($follower = DBA::fetch($followers)) {
+                       self::setBoundaries($follower['relation-cid']);
                        $accounts[] = DI::mstdnAccount()->createFromContactId($follower['relation-cid'], $uid);
                }
                DBA::close($followers);
@@ -85,6 +86,7 @@ class Followers extends BaseApi
                        array_reverse($accounts);
                }
 
+               self::setLinkHeader();
                System::jsonExit($accounts);
        }
 }
index c967715dfcd0fc17ffd9945168fcd0551ef54b61..b6a8f7f75c2096726eb8b6a242657957e6817539 100644 (file)
@@ -77,6 +77,7 @@ class Following extends BaseApi
 
                $followers = DBA::select('contact-relation', ['cid'], $condition, $parameters);
                while ($follower = DBA::fetch($followers)) {
+                       self::setBoundaries($follower['cid']);
                        $accounts[] = DI::mstdnAccount()->createFromContactId($follower['cid'], $uid);
                }
                DBA::close($followers);
@@ -85,6 +86,7 @@ class Following extends BaseApi
                        array_reverse($accounts);
                }
 
+               self::setLinkHeader();
                System::jsonExit($accounts);
        }
 }
index 3b281392bf741673b18f0b10f4cc48a9c03384a6..0e7a7fb3378e8b506ada310d8699221375ba5c13 100644 (file)
@@ -108,6 +108,7 @@ class Statuses extends BaseApi
 
                $statuses = [];
                while ($item = Post::fetch($items)) {
+                       self::setBoundaries($item['uri-id']);
                        $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid);
                }
                DBA::close($items);
@@ -116,6 +117,7 @@ class Statuses extends BaseApi
                        array_reverse($statuses);
                }
 
+               self::setLinkHeader();
                System::jsonExit($statuses);
        }
 }
index d92b6059d3b3abd81a6dd55db0ca3a5dae54e11d..37ab61af5251c0ebb349301208c396db91594f12 100644 (file)
@@ -77,6 +77,7 @@ class Blocks extends BaseApi
 
                $followers = DBA::select('user-contact', ['cid'], $condition, $parameters);
                while ($follower = DBA::fetch($followers)) {
+                       self::setBoundaries($follower['cid']);
                        $accounts[] = DI::mstdnAccount()->createFromContactId($follower['cid'], $uid);
                }
                DBA::close($followers);
@@ -85,6 +86,7 @@ class Blocks extends BaseApi
                        array_reverse($accounts);
                }
 
+               self::setLinkHeader();
                System::jsonExit($accounts);
        }
 }
index 7e298d120fb18f2633a2aa02a462048f8d1ac45d..a7141e3dcbbb7d2fbb33a589340beb9973e7d0bd 100644 (file)
@@ -72,6 +72,7 @@ class Bookmarks extends BaseApi
 
                $statuses = [];
                while ($item = Post::fetch($items)) {
+                       self::setBoundaries($item['uri-id']);
                        $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid);
                }
                DBA::close($items);
@@ -80,6 +81,7 @@ class Bookmarks extends BaseApi
                        array_reverse($statuses);
                }
 
+               self::setLinkHeader();
                System::jsonExit($statuses);
        }
 }
index 0340478c6b1ac07fe0658437e5ca86b36e1ad93a..22774b57ce03661a29db0ea85e2098b4b3c9bd55 100644 (file)
@@ -85,6 +85,7 @@ class Conversations extends BaseApi
                $conversations = [];
 
                while ($conv = DBA::fetch($convs)) {
+                       self::setBoundaries($conv['id']);
                        $conversations[] = DI::mstdnConversation()->CreateFromConvId($conv['id']);
                }
 
@@ -94,6 +95,7 @@ class Conversations extends BaseApi
                        array_reverse($conversations);
                }
 
+               self::setLinkHeader();
                System::jsonExit($conversations);
        }
 }
index 69b102a276494bd2b71e6d0186add9d293e54be4..239257e8331c066b106ec0e9a07985d257cfcc03 100644 (file)
@@ -70,6 +70,7 @@ class Favourited extends BaseApi
 
                $statuses = [];
                while ($item = Post::fetch($items)) {
+                       self::setBoundaries($item['thr-parent-id']);
                        $statuses[] = DI::mstdnStatus()->createFromUriId($item['thr-parent-id'], $uid);
                }
                DBA::close($items);
@@ -78,6 +79,7 @@ class Favourited extends BaseApi
                        array_reverse($statuses);
                }
 
+               self::setLinkHeader();
                System::jsonExit($statuses);
        }
 }
index 4628738456cb1a3194f313941b8911160261837a..cb7d5da220cda51039fced22ee8269d534ae2181 100644 (file)
@@ -92,8 +92,6 @@ class FollowRequests extends BaseApi
                        'limit'  => 40, // Maximum number of results to return. Defaults to 40. Paginate using the HTTP Link header.
                ]);
 
-               $baseUrl = DI::baseUrl();
-
                $introductions = DI::intro()->selectByBoundaries(
                        ['`uid` = ? AND NOT `ignore`', $uid],
                        ['order' => ['id' => 'DESC']],
@@ -106,6 +104,7 @@ class FollowRequests extends BaseApi
 
                foreach ($introductions as $key => $introduction) {
                        try {
+                               self::setBoundaries($introduction->id);
                                $return[] = DI::mstdnFollowRequest()->createFromIntroduction($introduction);
                        } catch (HTTPException\InternalServerErrorException $exception) {
                                DI::intro()->delete($introduction);
@@ -113,22 +112,7 @@ class FollowRequests extends BaseApi
                        }
                }
 
-               $base_query = [];
-               if (isset($_GET['limit'])) {
-                       $base_query['limit'] = $request['limit'];
-               }
-
-               $links = [];
-               if ($introductions->getTotalCount() > $request['limit']) {
-                       $links[] = '<' . $baseUrl->get() . '/api/v1/follow_requests?' . http_build_query($base_query + ['max_id' => $introductions[count($introductions) - 1]->id]) . '>; rel="next"';
-               }
-
-               if (count($introductions)) {
-                       $links[] = '<' . $baseUrl->get() . '/api/v1/follow_requests?' . http_build_query($base_query + ['min_id' => $introductions[0]->id]) . '>; rel="prev"';
-               }
-
-               header('Link: ' . implode(', ', $links));
-
+               self::setLinkHeader();
                System::jsonExit($return);
        }
 }
index 21f85f316006838bcdb7391ec2820b12f33df4f6..6e10ad6bfa84f0c91bb4fd75ebd2fa2430fb1c1a 100644 (file)
@@ -95,6 +95,7 @@ class Accounts extends BaseApi
 
                $members = DBA::select('group_member', ['contact-id'], $condition, $params);
                while ($member = DBA::fetch($members)) {
+                       self::setBoundaries($member['contact-id']);
                        $accounts[] = DI::mstdnAccount()->createFromContactId($member['contact-id'], $uid);
                }
                DBA::close($members);
@@ -103,6 +104,7 @@ class Accounts extends BaseApi
                        array_reverse($accounts);
                }
 
+               self::setLinkHeader();
                System::jsonExit($accounts);
        }
 }
index 469f3e0e61262dfa4c4d28237fa563e7787d18dd..ea890d9fdb345d3549fbc1d024cd1afec5a980e4 100644 (file)
@@ -77,6 +77,7 @@ class Mutes extends BaseApi
 
                $followers = DBA::select('user-contact', ['cid'], $condition, $parameters);
                while ($follower = DBA::fetch($followers)) {
+                       self::setBoundaries($follower['cid']);
                        $accounts[] = DI::mstdnAccount()->createFromContactId($follower['cid'], $uid);
                }
                DBA::close($followers);
@@ -85,6 +86,7 @@ class Mutes extends BaseApi
                        array_reverse($accounts);
                }
 
+               self::setLinkHeader();
                System::jsonExit($accounts);
        }
 }
index cf2a9827c2bcef7dd6872f4e34132889ea71ce6d..e02823dea565be08c4d852711123ad3a86e8fdc2 100644 (file)
@@ -128,6 +128,7 @@ class Notifications extends BaseApi
 
                $notify = DBA::select('notification', ['id'], $condition, $params);
                while ($notification = DBA::fetch($notify)) {
+                       self::setBoundaries($notification['id']);
                        $entry = DI::mstdnNotification()->createFromNotificationId($notification['id']);
                        if (!empty($entry)) {
                                $notifications[] = $entry;
@@ -138,6 +139,7 @@ class Notifications extends BaseApi
                        array_reverse($notifications);
                }
 
+               self::setLinkHeader();
                System::jsonExit($notifications);
        }
 }
index 4ef4292f8b2486b614489683561ba54e7903409e..f6b95ae923e96990d1975dafa42d58044f8f6d11 100644 (file)
@@ -162,6 +162,7 @@ class Search extends BaseApi
 
                $statuses = [];
                while ($item = Post::fetch($items)) {
+                       self::setBoundaries($item['uri-id']);
                        $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid);
                }
                DBA::close($items);
@@ -170,6 +171,7 @@ class Search extends BaseApi
                        array_reverse($statuses);
                }
 
+               self::setLinkHeader();
                return $statuses;
        }
 
index adf677c72f0adb9d8484460540711f45f8a583b8..c0fef79c542c498b069d6841bb90575c3f0c6a1f 100644 (file)
@@ -71,6 +71,7 @@ class Direct extends BaseApi
                $statuses = [];
 
                while ($mail = DBA::fetch($mails)) {
+                       self::setBoundaries($mail['uri-id']);
                        $statuses[] = DI::mstdnStatus()->createFromMailId($mail['id']);
                }
 
@@ -78,6 +79,7 @@ class Direct extends BaseApi
                        array_reverse($statuses);
                }
 
+               self::setLinkHeader();
                System::jsonExit($statuses);
        }
 }
index 63d40e8440ad899e36058c6b8cb256e3e9ea305e..2b556d7ce70d87afc9567708efe66dfd2d40adad 100644 (file)
@@ -93,6 +93,7 @@ class Home extends BaseApi
 
                $statuses = [];
                while ($item = Post::fetch($items)) {
+                       self::setBoundaries($item['uri-id']);
                        $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid);
                }
                DBA::close($items);
@@ -101,6 +102,7 @@ class Home extends BaseApi
                        array_reverse($statuses);
                }
 
+               self::setLinkHeader();
                System::jsonExit($statuses);
        }
 }
index 22b2be3bc806c891dad21cab1fb6574f3bf300fd..8d4a432c5752526c2e57d60785ed50f2a3887db2 100644 (file)
@@ -98,6 +98,7 @@ class ListTimeline extends BaseApi
 
                $statuses = [];
                while ($item = Post::fetch($items)) {
+                       self::setBoundaries($item['uri-id']);
                        $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid);
                }
                DBA::close($items);
@@ -106,6 +107,7 @@ class ListTimeline extends BaseApi
                        array_reverse($statuses);
                }
 
+               self::setLinkHeader();
                System::jsonExit($statuses);
        }
 }
index 1efeabba8042958ce74fa9fee03f30cfcccb688f..bc617b65a8fde4cfd8f8d484f27989cd9d295a20 100644 (file)
@@ -99,6 +99,7 @@ class PublicTimeline extends BaseApi
 
                $statuses = [];
                while ($item = Post::fetch($items)) {
+                       self::setBoundaries($item['uri-id']);
                        $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $item['uid']);
                }
                DBA::close($items);
@@ -107,6 +108,7 @@ class PublicTimeline extends BaseApi
                        array_reverse($statuses);
                }
 
+               self::setLinkHeader();
                System::jsonExit($statuses);
        }
 }
index 56697f2f586f43dcaeb252561ab7625cae68e081..0437be277105aa4da4a9f26818f4baa6b8d151ad 100644 (file)
@@ -107,6 +107,7 @@ class Tag extends BaseApi
 
                $statuses = [];
                while ($item = Post::fetch($items)) {
+                       self::setBoundaries($item['uri-id']);
                        $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid);
                }
                DBA::close($items);
@@ -115,6 +116,7 @@ class Tag extends BaseApi
                        array_reverse($statuses);
                }
 
+               self::setLinkHeader();
                System::jsonExit($statuses);
        }
 }
index bae466c90570eeb9050460ec01bd5a0c14a5f593..76acd4d889b8e85049169a2ef37ff1ae5754ef69 100644 (file)
@@ -44,6 +44,16 @@ class BaseApi extends BaseModule
         */
        protected static $format = 'json';
 
+       /**
+        * @var array
+        */
+       protected static $boundaries = [];
+
+       /**
+        * @var array
+        */
+       protected static $request = [];
+
        public static function init(array $parameters = [])
        {
                $arguments = DI::args();
@@ -129,6 +139,11 @@ class BaseApi extends BaseModule
                $httpinput = HTTPInputData::process();
                $input = array_merge($httpinput['variables'], $httpinput['files'], $_REQUEST);
 
+               self::$request    = $input;
+               self::$boundaries = [];
+
+               unset(self::$request['pagename']);
+
                $request = [];
 
                foreach ($defaults as $parameter => $defaultvalue) {
@@ -160,6 +175,55 @@ class BaseApi extends BaseModule
                return $request;
        }
 
+       /**
+        * Set boundaries for the "link" header
+        * @param array $boundaries
+        * @param int $id
+        * @return array
+        */
+       protected static function setBoundaries(int $id)
+       {
+               if (!isset(self::$boundaries['min'])) {
+                       self::$boundaries['min'] = $id;
+               }
+
+               if (!isset(self::$boundaries['max'])) {
+                       self::$boundaries['max'] = $id;
+               }
+
+               self::$boundaries['min'] = min(self::$boundaries['min'], $id);
+               self::$boundaries['max'] = max(self::$boundaries['max'], $id);
+       }
+
+       /**
+        * Set the "link" header with "next" and "prev" links
+        * @return void
+        */
+       protected static function setLinkHeader()
+       {
+               if (empty(self::$boundaries)) {
+                       return;
+               }
+
+               $request = self::$request;
+
+               unset($request['min_id']);
+               unset($request['max_id']);
+               unset($request['since_id']);
+
+               $prev_request = $next_request = $request;
+
+               $prev_request['min_id'] = self::$boundaries['max'] + 1;
+               $next_request['max_id'] = self::$boundaries['min'] - 1;
+
+               $command = DI::baseUrl() . '/' . DI::args()->getCommand();
+
+               $prev = $command . '?' . http_build_query($prev_request);
+               $next = $command . '?' . http_build_query($next_request);
+
+               header('Link: <' . $next . '>; rel="next", <' . $prev . '>; rel="prev"');
+       }
+
        /**
         * Get current application token
         *