]> git.mxchange.org Git - friendica.git/blobdiff - src/Model/Group.php
Changed to null-coalscing style (??) as sugguested by @MrPetovan
[friendica.git] / src / Model / Group.php
index 390ed532e3e0135286a5f5761b4b0a54b01fd41b..fa41d26467fc704034b706306a7ee81975b69467 100644 (file)
@@ -41,7 +41,7 @@ class Group
 
        public static function getByUserId($uid, $includesDeleted = false)
        {
-               $conditions = ['uid' => $uid];
+               $conditions = ['uid' => $uid, 'cid' => null];
 
                if (!$includesDeleted) {
                        $conditions['deleted'] = false;
@@ -310,6 +310,68 @@ class Group
                return DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $cid]);
        }
 
+       /**
+        * Adds contacts to a group
+        *
+        * @param int $gid
+        * @param array $contacts
+        * @throws \Exception
+        */
+       public static function addMembers(int $gid, array $contacts)
+       {
+               if (!$gid || !$contacts) {
+                       return false;
+               }
+
+               // @TODO Backward compatibility with user contacts, remove by version 2022.03
+               $group = DBA::selectFirst('group', ['uid'], ['id' => $gid]);
+               if (empty($group)) {
+                       throw new HTTPException\NotFoundException('Group not found.');
+               }
+
+               foreach ($contacts as $cid) {
+                       $cdata = Contact::getPublicAndUserContactID($cid, $group['uid']);
+                       if (empty($cdata['user'])) {
+                               throw new HTTPException\NotFoundException('Invalid contact.');
+                       }
+
+                       DBA::insert('group_member', ['gid' => $gid, 'contact-id' => $cdata['user']], Database::INSERT_IGNORE);
+               }
+       }
+
+       /**
+        * Removes contacts from a group
+        *
+        * @param int $gid
+        * @param array $contacts
+        * @throws \Exception
+        */
+       public static function removeMembers(int $gid, array $contacts)
+       {
+               if (!$gid || !$contacts) {
+                       return false;
+               }
+
+               // @TODO Backward compatibility with user contacts, remove by version 2022.03
+               $group = DBA::selectFirst('group', ['uid'], ['id' => $gid]);
+               if (empty($group)) {
+                       throw new HTTPException\NotFoundException('Group not found.');
+               }
+
+               $contactIds = [];
+
+               foreach ($contacts as $cid) {
+                       $cdata = Contact::getPublicAndUserContactID($cid, $group['uid']);
+                       if (empty($cdata['user'])) {
+                               throw new HTTPException\NotFoundException('Invalid contact.');
+                       }
+
+                       $contactIds[] = $cdata['user'];
+               }
+
+               DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $contactIds]);
+       }
+
        /**
         * Returns the combined list of contact ids from a group id list
         *
@@ -408,7 +470,7 @@ class Group
                        ]
                ];
 
-               $stmt = DBA::select('group', [], ['deleted' => 0, 'uid' => $uid], ['order' => ['name']]);
+               $stmt = DBA::select('group', [], ['deleted' => false, 'uid' => $uid, 'cid' => null], ['order' => ['name']]);
                while ($group = DBA::fetch($stmt)) {
                        $display_groups[] = [
                                'name' => $group['name'],
@@ -465,7 +527,7 @@ class Group
                        $member_of = self::getIdsByContactId($cid);
                }
 
-               $stmt = DBA::select('group', [], ['deleted' => 0, 'uid' => local_user()], ['order' => ['name']]);
+               $stmt = DBA::select('group', [], ['deleted' => false, 'uid' => local_user(), 'cid' => null], ['order' => ['name']]);
                while ($group = DBA::fetch($stmt)) {
                        $selected = (($group_id == $group['id']) ? ' group-selected' : '');
 
@@ -522,21 +584,19 @@ class Group
        }
 
        /**
-        * Fetch the followers of a given contact id and store them as group members
+        * Fetch the group id for the given contact id
         *
         * @param integer $id Contact ID
+        * @return integer Group IO
         */
-       public static function getMembersForForum(int $id) {
-               $contact = Contact::getById($id, ['uid', 'url', 'name']);
-               if (empty($contact)) {
-                       return;
-               }
-       
-               $apcontact = APContact::getByURL($contact['url']);
-               if (empty($apcontact['followers'])) {
-                       return;
+       public static function getIdForForum(int $id)
+       {
+               Logger::info('Get id for forum id', ['id' => $id]);
+               $contact = Contact::getById($id, ['uid', 'name', 'contact-type', 'manually-approve']);
+               if (empty($contact) || ($contact['contact-type'] != Contact::TYPE_COMMUNITY) || !$contact['manually-approve']) {
+                       return 0;
                }
-       
+
                $group = DBA::selectFirst('group', ['id'], ['uid' => $contact['uid'], 'cid' => $id]);
                if (empty($group)) {
                        $fields = [
@@ -549,15 +609,42 @@ class Group
                } else {
                        $gid = $group['id'];
                }
-       
+
+               return $gid;
+       }
+
+       /**
+        * Fetch the followers of a given contact id and store them as group members
+        *
+        * @param integer $id Contact ID
+        */
+       public static function updateMembersForForum(int $id)
+       {
+               Logger::info('Update forum members', ['id' => $id]);
+
+               $contact = Contact::getById($id, ['uid', 'url']);
+               if (empty($contact)) {
+                       return;
+               }
+
+               $apcontact = APContact::getByURL($contact['url']);
+               if (empty($apcontact['followers'])) {
+                       return;
+               }
+
+               $gid = self::getIdForForum($id);
+               if (empty($gid)) {
+                       return;
+               }
+
                $group_members = DBA::selectToArray('group_member', ['contact-id'], ['gid' => $gid]);
                if (!empty($group_members)) {
                        $current = array_unique(array_column($group_members, 'contact-id'));
                } else {
                        $current = [];
                }
-       
-               foreach (ActivityPub::fetchItems($apcontact['followers']) as $follower) {
+
+               foreach (ActivityPub::fetchItems($apcontact['followers'], $contact['uid']) as $follower) {
                        $id = Contact::getIdForURL($follower);
                        if (!in_array($id, $current)) {
                                DBA::insert('group_member', ['gid' => $gid, 'contact-id' => $id]);
@@ -566,7 +653,8 @@ class Group
                                unset($current[$key]);
                        }
                }
-       
+
                DBA::delete('group_member', ['gid' => $gid, 'contact-id' => $current]);
+               Logger::info('Updated forum members', ['id' => $id, 'count' => DBA::count('group_member', ['gid' => $gid])]);
        }
 }