]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Post/Category.php
Use the owner, not the author
[friendica.git] / src / Model / Post / Category.php
index d4a8469d4fd6478259ed6cb9a74159d1091c45ca..c242e8ffd878dd97ee046331d79a688667504aa9 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2020, Friendica
+ * @copyright Copyright (C) 2010-2023, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -22,7 +22,7 @@
 namespace Friendica\Model\Post;
 
 use Friendica\Database\DBA;
-use Friendica\Model\Item;
+use Friendica\Model\Post;
 use Friendica\Model\Tag;
 
 /**
@@ -33,15 +33,47 @@ use Friendica\Model\Tag;
  */
 class Category
 {
-    const UNKNOWN           = 0;
-    const CATEGORY          = 3;
-    const FILE              = 5;
+       const UNKNOWN           = 0;
+       const CATEGORY          = 3;
+       const FILE              = 5;
+       const SUBCRIPTION       = 10;
 
+       /**
+        * Delete all categories and files from a given uri-id and user
+        *
+        * @param int $uri_id
+        * @param int $uid
+        * @return boolean success
+        * @throws \Exception
+        */
+       public static function deleteByURIId(int $uri_id, int $uid)
+       {
+               return DBA::delete('post-category', ['uri-id' => $uri_id, 'uid' => $uid]);
+       }
+
+       /**
+        * Delete all categories and files from a given uri-id and user
+        *
+        * @param int $uri_id
+        * @param int $uid
+        * @return boolean success
+        * @throws \Exception
+        */
+       public static function deleteFileByURIId(int $uri_id, int $uid, int $type, string $file)
+       {
+               $tagid = Tag::getID($file);
+               if (empty($tagid)) {
+                       return false;
+               }
+
+               return DBA::delete('post-category', ['uri-id' => $uri_id, 'uid' => $uid, 'type' => $type, 'tid' => $tagid]);
+       }
        /**
         * Generates the legacy item.file field string from an item ID.
         * Includes only file and category terms.
         *
-        * @param int $item_id
+        * @param int $uri_id
+        * @param int $uid
         * @return string
         * @throws \Exception
         */
@@ -49,7 +81,7 @@ class Category
        {
                $file_text = '';
 
-               $tags = DBA::selectToArray('category-view', ['type', 'name'], ['uri-id' => $uri_id, 'uid' => $uid]);
+               $tags = DBA::selectToArray('category-view', ['type', 'name'], ['uri-id' => $uri_id, 'uid' => $uid, 'type' => [Category::FILE, Category::CATEGORY]]);
                foreach ($tags as $tag) {
                        if ($tag['type'] == self::CATEGORY) {
                                $file_text .= '<' . $tag['name'] . '>';
@@ -61,6 +93,63 @@ class Category
                return $file_text;
        }
 
+       /**
+        * Generates an array of files or categories of a given uri-id
+        *
+        * @param int $uid
+        * @param int $type
+        * @return array
+        * @throws \Exception
+        */
+       public static function getArray(int $uid, int $type)
+       {
+               $tags = DBA::selectToArray('category-view', ['name'], ['uid' => $uid, 'type' => $type],
+                       ['group_by' => ['name'], 'order' => ['name']]);
+               if (empty($tags)) {
+                       return [];
+               }
+
+               return array_column($tags, 'name');
+       }
+
+       public static function existsForURIId(int $uri_id, int $uid)
+       {
+               return DBA::exists('post-category', ['uri-id' => $uri_id, 'uid' => $uid]);
+       }
+
+       /**
+        * Generates an array of files or categories of a given uri-id
+        *
+        * @param int $uri_id
+        * @param int $uid
+        * @param int $type
+        * @return array
+        * @throws \Exception
+        */
+       public static function getArrayByURIId(int $uri_id, int $uid, int $type = self::CATEGORY)
+       {
+               $tags = DBA::selectToArray('category-view', ['type', 'name'], ['uri-id' => $uri_id, 'uid' => $uid, 'type' => $type]);
+               if (empty($tags)) {
+                       return [];
+               }
+
+               return array_column($tags, 'name');
+       }
+
+       /**
+        * Generates a comma separated list of files or categories
+        *
+        * @param int $uri_id
+        * @param int $uid
+        * @param int $type
+        * @return string
+        * @throws \Exception
+        */
+       public static function getCSVByURIId(int $uri_id, int $uid, int $type)
+       {
+               return implode(',', self::getArrayByURIId($uri_id, $uid, $type));
+       }
+
        /**
         * Inserts new terms for the provided item ID based on the legacy item.file field BBCode content.
         * Deletes all previous file terms for the same item ID.
@@ -72,16 +161,14 @@ class Category
         */
        public static function storeTextByURIId(int $uri_id, int $uid, string $files)
        {
-               $message = Item::selectFirst(['deleted'], ['uri-id' => $uri_id, 'uid' => $uid]);
-               if (!DBA::isResult($message)) {
-                       return;
-               }
+               $message = Post::selectFirst(['deleted'], ['uri-id' => $uri_id, 'uid' => $uid]);
+               if (DBA::isResult($message)) {
+                       // Clean up all tags
+                       DBA::delete('post-category', ['uri-id' => $uri_id, 'uid' => $uid]);
 
-               // Clean up all tags
-               DBA::delete('post-category', ['uri-id' => $uri_id, 'uid' => $uid]);
-
-               if ($message['deleted']) {
-                       return;
+                       if ($message['deleted']) {
+                               return;
+                       }
                }
 
                if (preg_match_all("/\[(.*?)\]/ism", $files, $result)) {
@@ -91,29 +178,34 @@ class Category
                                        continue;
                                }
 
-                               DBA::insert('post-category', [
-                                       'uri-id' => $uri_id,
-                                       'uid' => $uid,
-                                       'type' => self::FILE,
-                                       'tid' => $tagid
-                               ]);
+                               self::storeByURIId($uri_id, $uid, self::FILE, $tagid);
                        }
                }
 
                if (preg_match_all("/\<(.*?)\>/ism", $files, $result)) {
                        foreach ($result[1] as $file) {
-                               $tagid = Tag::getID($file);
-                               if (empty($tagid)) {
-                                       continue;
-                               }
-
-                               DBA::insert('post-category', [
-                                       'uri-id' => $uri_id,
-                                       'uid' => $uid,
-                                       'type' => self::CATEGORY,
-                                       'tid' => $tagid
-                               ]);
+                               self::storeFileByURIId($uri_id, $uid, self::CATEGORY, $file);
                        }
                }
        }
+
+       public static function storeFileByURIId(int $uri_id, int $uid, int $type, string $file, string $url = ''): bool
+       {
+               $tagid = Tag::getID($file, $url);
+               if (empty($tagid)) {
+                       return false;
+               }
+
+               return self::storeByURIId($uri_id, $uid, $type, $tagid);
+       }
+
+       private static function storeByURIId(int $uri_id, int $uid, int $type, int $tagid): bool
+       {
+               return DBA::replace('post-category', [
+                       'uri-id' => $uri_id,
+                       'uid' => $uid,
+                       'type' => $type,
+                       'tid' => $tagid
+               ]);
+       }
 }