f2c66c66297d4e247007262eb89f1b2a0d167dcb
[friendica.git/.git] / src / Model / Post / Category.php
1 <?php
2 /**
3  * @copyright Copyright (C) 2020, Friendica
4  *
5  * @license GNU AGPL version 3 or any later version
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU Affero General Public License as
9  * published by the Free Software Foundation, either version 3 of the
10  * License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Affero General Public License for more details.
16  *
17  * You should have received a copy of the GNU Affero General Public License
18  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
19  *
20  */
21
22 namespace Friendica\Model\Post;
23
24 use Friendica\Database\DBA;
25 use Friendica\Model\Item;
26 use Friendica\Model\Post;
27 use Friendica\Model\Tag;
28
29 /**
30  * Class Category
31  *
32  * This Model class handles category table interactions.
33  * This tables stores user-applied categories related to posts.
34  */
35 class Category
36 {
37     const UNKNOWN           = 0;
38     const CATEGORY          = 3;
39     const FILE              = 5;
40
41         /**
42          * Generates the legacy item.file field string from an item ID.
43          * Includes only file and category terms.
44          *
45          * @param int $item_id
46          * @return string
47          * @throws \Exception
48          */
49         public static function getTextByURIId(int $uri_id, int $uid)
50         {
51                 $file_text = '';
52
53                 $tags = DBA::selectToArray('category-view', ['type', 'name'], ['uri-id' => $uri_id, 'uid' => $uid]);
54                 foreach ($tags as $tag) {
55                         if ($tag['type'] == self::CATEGORY) {
56                                 $file_text .= '<' . $tag['name'] . '>';
57                         } else {
58                                 $file_text .= '[' . $tag['name'] . ']';
59                         }
60                 }
61
62                 return $file_text;
63         }
64
65         /**
66          * Inserts new terms for the provided item ID based on the legacy item.file field BBCode content.
67          * Deletes all previous file terms for the same item ID.
68          *
69          * @param integer $item_id item id
70          * @param         $files
71          * @return void
72          * @throws \Exception
73          */
74         public static function storeTextByURIId(int $uri_id, int $uid, string $files)
75         {
76                 $message = Post::selectFirst(['deleted'], ['uri-id' => $uri_id, 'uid' => $uid]);
77                 if (DBA::isResult($message)) {
78                         // Clean up all tags
79                         DBA::delete('post-category', ['uri-id' => $uri_id, 'uid' => $uid]);
80
81                         if ($message['deleted']) {
82                                 return;
83                         }
84                 }
85
86                 if (preg_match_all("/\[(.*?)\]/ism", $files, $result)) {
87                         foreach ($result[1] as $file) {
88                                 $tagid = Tag::getID($file);
89                                 if (empty($tagid)) {
90                                         continue;
91                                 }
92
93                                 DBA::replace('post-category', [
94                                         'uri-id' => $uri_id,
95                                         'uid' => $uid,
96                                         'type' => self::FILE,
97                                         'tid' => $tagid
98                                 ]);
99                         }
100                 }
101
102                 if (preg_match_all("/\<(.*?)\>/ism", $files, $result)) {
103                         foreach ($result[1] as $file) {
104                                 $tagid = Tag::getID($file);
105                                 if (empty($tagid)) {
106                                         continue;
107                                 }
108
109                                 DBA::replace('post-category', [
110                                         'uri-id' => $uri_id,
111                                         'uid' => $uid,
112                                         'type' => self::CATEGORY,
113                                         'tid' => $tagid
114                                 ]);
115                         }
116                 }
117         }
118 }