diff --git a/src/Contact/FriendSuggest/Collection/FriendSuggests.php b/src/Contact/FriendSuggest/Collection/FriendSuggests.php new file mode 100644 index 0000000000..ad382b39c5 --- /dev/null +++ b/src/Contact/FriendSuggest/Collection/FriendSuggests.php @@ -0,0 +1,9 @@ +selectOne(['id' => $id]); + return parent::_select($condition, $params); } + /** + * @param int $id + * + * @return Entity\FriendSuggest + * + * @throws FriendSuggestNotFoundException in case there's no suggestion for this id + */ + public function selectOneById(int $id): Entity\FriendSuggest + { + try { + return $this->selectOne(['id' => $id]); + } catch (NotFoundException $e) { + throw new FriendSuggestNotFoundException(sprintf('No FriendSuggest found for id %d', $id)); + } + } + + /** + * @param int $cid + * + * @return Collection\FriendSuggests + * + * @throws FriendSuggestPersistenceException In case the underlying storage cannot select the suggestion + */ + public function selectForContact(int $cid): Collection\FriendSuggests + { + try { + return $this->select(['cid' => $cid]); + } catch (\Exception $e) { + throw new FriendSuggestPersistenceException(sprintf('Cannot select FriendSuggestion for contact %d', $cid)); + } + } + + /** + * @param Entity\FriendSuggest $fsuggest + * + * @return Entity\FriendSuggest + * + * @throws FriendSuggestNotFoundException in case the underlying storage cannot save the suggestion + */ public function save(Entity\FriendSuggest $fsuggest): Entity\FriendSuggest { try { @@ -66,7 +116,24 @@ class FriendSuggest extends BaseDepository return $this->selectOneById($this->db->lastInsertId()); } } catch (\Exception $exception) { - throw new FriendSuggestPersistenceException(sprintf('Cannot insert/update the FriendSuggestion %d for user %d', $fsuggest->id, $fsuggest->uid), $exception); + throw new FriendSuggestNotFoundException(sprintf('Cannot insert/update the FriendSuggestion %d for user %d', $fsuggest->id, $fsuggest->uid), $exception); + } + } + + /** + * @param Collection\FriendSuggest $fsuggests + * + * @return bool + * + * @throws FriendSuggestNotFoundException in case the underlying storage cannot delete the suggestion + */ + public function delete(Collection\FriendSuggests $fsuggests): bool + { + try { + $ids = $fsuggests->column('id'); + return $this->db->delete(self::$table_name, ['id' => $ids]); + } catch (\Exception $exception) { + throw new FriendSuggestNotFoundException('Cannot delete the FriendSuggestions', $exception); } } } diff --git a/src/Contact/FriendSuggest/Exception/FriendSuggestNotFoundException.php b/src/Contact/FriendSuggest/Exception/FriendSuggestNotFoundException.php new file mode 100644 index 0000000000..e5ba7e19d1 --- /dev/null +++ b/src/Contact/FriendSuggest/Exception/FriendSuggestNotFoundException.php @@ -0,0 +1,11 @@ +createFromTableRow([ 'uid' => $uid, 'cid' => $cid, @@ -46,4 +45,9 @@ class FriendSuggest extends BaseFactory implements ICanCreateFromTableRow 'note' => $note, ]); } + + public function createEmpty(int $id): Entity\FriendSuggest + { + return $this->createFromTableRow(['id' => $id]); + } } diff --git a/src/Worker/Contact/RemoveContent.php b/src/Worker/Contact/RemoveContent.php index f0e6e631d7..cdb3214112 100644 --- a/src/Worker/Contact/RemoveContent.php +++ b/src/Worker/Contact/RemoveContent.php @@ -80,7 +80,7 @@ class RemoveContent DBA::delete('contact-relation', ['relation-cid' => $id]); DBA::delete('contact-relation', ['cid' => $id]); DBA::delete('event', ['cid' => $id]); - DBA::delete('fsuggest', ['cid' => $id]); + DI::fsuggest()->delete(DI::fsuggest()->selectForContact($id)); DBA::delete('post-tag', ['cid' => $id]); DBA::delete('user-contact', ['cid' => $id]); diff --git a/src/Worker/Delivery.php b/src/Worker/Delivery.php index 8961b3f13d..44fded2c53 100644 --- a/src/Worker/Delivery.php +++ b/src/Worker/Delivery.php @@ -21,6 +21,8 @@ namespace Friendica\Worker; +use Friendica\Contact\FriendSuggest\Collection\FriendSuggests; +use Friendica\Contact\FriendSuggest\Exception\FriendSuggestNotFoundException; use Friendica\Core\Logger; use Friendica\Core\Protocol; use Friendica\Database\DBA; @@ -64,11 +66,13 @@ class Delivery } $uid = $target_item['uid']; } elseif ($cmd == self::SUGGESTION) { - $target_item = DBA::selectFirst('fsuggest', [], ['id' => $post_uriid]); - if (!DBA::isResult($target_item)) { + try { + $target_item = DI::fsuggest()->selectOneById($post_uriid); + } catch (FriendSuggestNotFoundException $e) { + DI::logger()->info('Cannot find FriendSuggestion', ['id' => $post_uriid]); return; } - $uid = $target_item['uid']; + $uid = $target_item->uid; } elseif ($cmd == self::RELOCATION) { $uid = $post_uriid; $target_item = []; @@ -284,7 +288,7 @@ class Delivery } elseif ($cmd == self::SUGGESTION) { $item = $target_item; $atom = DFRN::fsuggest($item, $owner); - DBA::delete('fsuggest', ['id' => $item['id']]); + DI::fsuggest()->delete(new FriendSuggests([DI::fsuggest()->selectOneById($item['id'])])); } elseif ($cmd == self::RELOCATION) { $atom = DFRN::relocate($owner, $owner['uid']); } elseif ($followup) {