]> git.mxchange.org Git - friendica.git/commitdiff
Issue 12191: We can now follow and unfollow tags via API
authorMichael <heluecht@pirati.ca>
Mon, 28 Nov 2022 03:29:43 +0000 (03:29 +0000)
committerMichael <heluecht@pirati.ca>
Mon, 28 Nov 2022 03:29:43 +0000 (03:29 +0000)
src/Content/Widget/SavedSearches.php
src/Module/Api/Mastodon/FollowedTags.php [new file with mode: 0644]
src/Module/Api/Mastodon/Tags.php
src/Module/Api/Mastodon/Tags/Follow.php
src/Module/Api/Mastodon/Tags/Unfollow.php
src/Object/Api/Mastodon/Tag.php
static/routes.config.php

index 6b6202ba32ea2879551755d3d127306200146653..1bf9e76a2698d49f9328fdbbcbdc9ea9eb736278 100644 (file)
@@ -37,7 +37,7 @@ class SavedSearches
        public static function getHTML(string $return_url, string $search = ''): string
        {
                $saved = [];
-               $saved_searches = DBA::select('search', ['id', 'term'], ['uid' => DI::userSession()->getLocalUserId()]);
+               $saved_searches = DBA::select('search', ['id', 'term'], ['uid' => DI::userSession()->getLocalUserId()], ['order' => ['term']]);
                while ($saved_search = DBA::fetch($saved_searches)) {
                        $saved[] = [
                                'id'          => $saved_search['id'],
diff --git a/src/Module/Api/Mastodon/FollowedTags.php b/src/Module/Api/Mastodon/FollowedTags.php
new file mode 100644 (file)
index 0000000..6e95783
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+/**
+ * @copyright Copyright (C) 2010-2022, the Friendica project
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace Friendica\Module\Api\Mastodon;
+
+use Friendica\Core\System;
+use Friendica\Database\DBA;
+use Friendica\Module\BaseApi;
+
+/**
+ * @see https://docs.joinmastodon.org/methods/followed_tags/
+ */
+class FollowedTags extends BaseApi
+{
+       protected function rawContent(array $request = [])
+       {
+               self::checkAllowedScope(self::SCOPE_READ);
+               $uid = self::getCurrentUserID();
+
+               $request = $this->getRequest([
+                       'max_id'   => 0,
+                       'since_id' => 0,
+                       'min_id'   => 0,
+                       'limit'    => 100, // Maximum number of results to return. Defaults to 100. Paginate using the HTTP Link header.
+               ], $request);
+
+               $params = ['order' => ['id' => true], 'limit' => $request['limit']];
+
+               $condition = ["`uid` = ? AND `term` LIKE ?", $uid, '#%'];
+
+               if (!empty($request['max_id'])) {
+                       $condition = DBA::mergeConditions($condition, ["`id` < ?", $request['max_id']]);
+               }
+
+               if (!empty($request['since_id'])) {
+                       $condition = DBA::mergeConditions($condition, ["`id` > ?", $request['since_id']]);
+               }
+
+               if (!empty($request['min_id'])) {
+                       $condition = DBA::mergeConditions($condition, ["`id` > ?", $request['min_id']]);
+
+                       $params['order'] = ['id'];
+               }
+
+               $return = [];
+
+               $saved_searches = DBA::select('search', ['id', 'term'], $condition);
+               while ($saved_search = DBA::fetch($saved_searches)) {
+                       self::setBoundaries($saved_search['id']);
+                       $tag = ['name' => substr($saved_search['term'], 1)];
+
+                       $hashtag  = new \Friendica\Object\Api\Mastodon\Tag($this->baseUrl, $tag, [], true);
+                       $return[] = $hashtag->toArray();
+               }
+
+               DBA::close($saved_searches);
+
+               if (!empty($request['min_id'])) {
+                       $return = array_reverse($return);
+               }
+
+               self::setLinkHeader();
+               System::jsonExit($return);
+       }
+}
index 97631b506aa8cf47a0f5a8a3b32d559f0a29e074..442f0f65769e736c69d33ed00fca78a9775c0340 100644 (file)
@@ -21,8 +21,8 @@
 
 namespace Friendica\Module\Api\Mastodon;
 
-use Friendica\App\Router;
-use Friendica\Core\Logger;
+use Friendica\Core\System;
+use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Module\BaseApi;
 
@@ -43,6 +43,11 @@ class Tags extends BaseApi
                        DI::mstdnError()->UnprocessableEntity();
                }
 
-               $this->response->unsupported(Router::GET, $request);
+               $tag       = ltrim($this->parameters['hashtag'], '#');
+               $following = DBA::exists('search', ['uid' => $uid, 'term' => '#' . $tag]);
+               $term      = ['term' => $tag];
+
+               $hashtag  = new \Friendica\Object\Api\Mastodon\Tag($this->baseUrl, $term, [], $following);
+               System::jsonExit($hashtag->toArray());
        }
 }
index 9a813f7257038b9178ab622e979c1c5d1964e846..e2261f3fd50869819f03b5b52376cf3f25933d44 100644 (file)
@@ -21,7 +21,8 @@
 
 namespace Friendica\Module\Api\Mastodon\Tags;
 
-use Friendica\App\Router;
+use Friendica\Core\System;
+use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Module\BaseApi;
 
@@ -39,6 +40,12 @@ class Follow extends BaseApi
                        DI::mstdnError()->UnprocessableEntity();
                }
 
-               $this->response->unsupported(Router::POST, $request);
+               $fields = ['uid' => $uid, 'term' => '#' . $this->parameters['hashtag']];
+               if (!DBA::exists('search', $fields)) {
+                       DBA::insert('search', $fields);
+               }
+
+               $hashtag  = new \Friendica\Object\Api\Mastodon\Tag($this->baseUrl, $fields, [], true);
+               System::jsonExit($hashtag->toArray());
        }
 }
index a20b824b8d3547a2dfbe70a1e53eabbf21c1c50e..465c1974b59452cf7a7a00aa89f630fad7a69d33 100644 (file)
@@ -21,7 +21,8 @@
 
 namespace Friendica\Module\Api\Mastodon\Tags;
 
-use Friendica\App\Router;
+use Friendica\Core\System;
+use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Module\BaseApi;
 
@@ -39,6 +40,11 @@ class Unfollow extends BaseApi
                        DI::mstdnError()->UnprocessableEntity();
                }
 
-               $this->response->unsupported(Router::POST, $request);
+               $term = ['uid' => $uid, 'term' => '#' . $this->parameters['hashtag']];
+
+               DBA::delete('search', $term);
+
+               $hashtag  = new \Friendica\Object\Api\Mastodon\Tag($this->baseUrl, $term, [], false);
+               System::jsonExit($hashtag->toArray());
        }
 }
index 340e30f703b04360f53a7c30b8b7f52dae13d42d..e40b793e2623e528b128dd61b8855b868961a3b3 100644 (file)
@@ -37,18 +37,23 @@ class Tag extends BaseDataTransferObject
        protected $url = null;
        /** @var array */
        protected $history = [];
+       /** @var bool */
+       protected $following = false;
 
        /**
         * Creates a hashtag record from an tag-view record.
         *
         * @param BaseURL $baseUrl
-        * @param array   $tag     tag-view record
+        * @param array   $tag       tag-view record
+        * @param array   $history
+        * @param array   $following "true" if the user is following this tag
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public function __construct(BaseURL $baseUrl, array $tag, array $history = [])
+       public function __construct(BaseURL $baseUrl, array $tag, array $history = [], bool $following = false)
        {
-               $this->name    = strtolower($tag['name']);
-               $this->url     = $baseUrl . '/search?tag=' . urlencode($this->name);
-               $this->history = $history;
+               $this->name      = strtolower($tag['name']);
+               $this->url       = $baseUrl . '/search?tag=' . urlencode($this->name);
+               $this->history   = $history;
+               $this->following = $following;
        }
 }
index 07c2b45508cc3acd62086452ed17a02f9861a202..42333e65fa2dd12782992053dd2fb9753fbc48d2 100644 (file)
@@ -236,7 +236,7 @@ return [
                        '/filters/{id:\d+}'                  => [Module\Api\Mastodon\Unimplemented::class,            [R::GET, R::POST, R::PUT, R::DELETE]], // not supported
                        '/follow_requests'                   => [Module\Api\Mastodon\FollowRequests::class,           [R::GET         ]],
                        '/follow_requests/{id:\d+}/{action}' => [Module\Api\Mastodon\FollowRequests::class,           [        R::POST]],
-                       '/followed_tags'                     => [Module\Api\Mastodon\Unimplemented::class,            [R::GET         ]], // @todo
+                       '/followed_tags'                     => [Module\Api\Mastodon\FollowedTags::class,             [R::GET         ]],
                        '/instance'                          => [Module\Api\Mastodon\Instance::class,                 [R::GET         ]],
                        '/instance/activity'                 => [Module\Api\Mastodon\Unimplemented::class,            [R::GET         ]], // @todo
                        '/instance/peers'                    => [Module\Api\Mastodon\Instance\Peers::class,           [R::GET         ]],