+ /**
+ * Fetch featured posts from a contact with the given url
+ *
+ * @param string $url
+ * @return void
+ */
+ public static function fetchFeaturedPosts(string $url)
+ {
+ Logger::info('Fetch featured posts', ['contact' => $url]);
+
+ $apcontact = APContact::getByURL($url);
+ if (empty($apcontact['featured'])) {
+ Logger::info('Contact does not have a featured collection', ['contact' => $url]);
+ return;
+ }
+
+ $pcid = Contact::getIdForURL($url, 0, false);
+ if (empty($pcid)) {
+ Logger::info('Contact not found', ['contact' => $url]);
+ return;
+ }
+
+ $posts = DBA::selectToArray('collection-view', ['uri-id'], ['cid' => $pcid, 'type' => Post\Collection::FEATURED]);
+ if (!empty($posts)) {
+ $old_featured = array_column($posts, 'uri-id');
+ }
+
+ $featured = ActivityPub::fetchItems($apcontact['featured']);
+ if (empty($featured)) {
+ Logger::info('Contact does not have featured posts', ['contact' => $url]);
+
+ foreach ($old_featured as $uri_id) {
+ Post\Collection::remove($uri_id, Post\Collection::FEATURED);
+ Logger::debug('Removed no longer featured post', ['uri-id' => $uri_id, 'contact' => $url]);
+ }
+ return;
+ }
+
+ $new = 0;
+ $old = 0;
+
+ foreach ($featured as $post) {
+ if (empty($post['id'])) {
+ continue;
+ }
+ $id = Item::fetchByLink($post['id']);
+ if (!empty($id)) {
+ $item = Post::selectFirst(['uri-id', 'featured'], ['id' => $id]);
+ if (!empty($item['uri-id'])) {
+ if (!$item['featured']) {
+ Post\Collection::add($item['uri-id'], Post\Collection::FEATURED);
+ Logger::debug('Added featured post', ['uri-id' => $item['uri-id'], 'contact' => $url]);
+ $new++;
+ } else {
+ Logger::debug('Post already had been featured', ['uri-id' => $item['uri-id'], 'contact' => $url]);
+ $old++;
+ }
+
+ $index = array_search($item['uri-id'], $old_featured);
+ if (!($index === false)) {
+ unset($old_featured[$index]);
+ }
+ }
+ }
+ }
+
+ foreach ($old_featured as $uri_id) {
+ Post\Collection::remove($uri_id, Post\Collection::FEATURED);
+ Logger::debug('Removed no longer featured post', ['uri-id' => $uri_id, 'contact' => $url]);
+ }
+
+ Logger::info('Fetched featured posts', ['new' => $new, 'old' => $old, 'contact' => $url]);
+ }
+