+
+ /**
+ * Fetch the group id for the given contact id
+ *
+ * @param integer $id Contact ID
+ * @return integer Group IO
+ */
+ public static function getIdForForum(int $id): int
+ {
+ 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
+ * @return void
+ */
+ 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])]);
+ }