]> 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 17e0a18e2e49dd0c8019f2779dcb2b541898e5c8..fa41d26467fc704034b706306a7ee81975b69467 100644 (file)
@@ -29,6 +29,7 @@ use Friendica\Database\Database;
 use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Network\HTTPException;
+use Friendica\Protocol\ActivityPub;
 
 /**
  * functions for interacting with the group database table
@@ -40,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;
@@ -309,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
         *
@@ -407,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'],
@@ -464,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' : '');
 
@@ -519,4 +582,79 @@ class Group
 
                return $o;
        }
+
+       /**
+        * Fetch the group id for the given contact id
+        *
+        * @param integer $id Contact ID
+        * @return integer Group IO
+        */
+       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 = [
+                               'uid'  => $contact['uid'],
+                               'name' => $contact['name'],
+                               'cid'  => $id,
+                       ];
+                       DBA::insert('group', $fields);
+                       $gid = DBA::lastInsertId();
+               } 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'], $contact['uid']) as $follower) {
+                       $id = Contact::getIdForURL($follower);
+                       if (!in_array($id, $current)) {
+                               DBA::insert('group_member', ['gid' => $gid, 'contact-id' => $id]);
+                       } else {
+                               $key = array_search($id, $current);
+                               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])]);
+       }
 }