From 622057ba0d7c8d4f5f53cb53926a0a1e8558c5db Mon Sep 17 00:00:00 2001 From: Eliseu Amaro Date: Fri, 10 Dec 2021 18:13:28 +0000 Subject: [PATCH] [CONTROLLER][Feeds] Added should_format field on returned array FeedController will only handle FormatNoteList if the should_format field is true. This change was made to make the replies route feed possible, this route is added by the Conversation component. Since a reply isn't a conversation root, if the FeedController handled the FormatNoteList event, this feed wouldn't have any notes to display. --- .../Conversation/Controller/Conversation.php | 69 +++++++++++ src/Controller/Feeds.php | 3 + src/Core/Controller/FeedController.php | 8 +- src/Entity/Conversation.php | 108 ------------------ 4 files changed, 77 insertions(+), 111 deletions(-) create mode 100644 components/Conversation/Controller/Conversation.php delete mode 100644 src/Entity/Conversation.php diff --git a/components/Conversation/Controller/Conversation.php b/components/Conversation/Controller/Conversation.php new file mode 100644 index 0000000000..143782533c --- /dev/null +++ b/components/Conversation/Controller/Conversation.php @@ -0,0 +1,69 @@ +. +// }}} + +/** + * @author Hugo Sales + * @copyright 2021 Free Software Foundation, Inc http://www.fsf.org + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later + */ + +namespace Component\Conversation\Controller; + +use App\Core\Controller\FeedController; +use App\Core\DB\DB; +use App\Core\Form; +use App\Util\Exception\DuplicateFoundException; +use App\Util\Exception\NoLoggedInUser; +use App\Util\Exception\ServerException; +use function App\Core\I18n\_m; +use App\Core\Log; +use App\Core\Router\Router; +use App\Entity\Actor; +use App\Entity\Note; +use App\Util\Common; +use App\Util\Exception\ClientException; +use App\Util\Exception\InvalidFormException; +use App\Util\Exception\NoSuchNoteException; +use App\Util\Exception\RedirectException; +use App\Util\Form\FormFields; +use Component\Posting\Posting; +use Symfony\Component\Form\Extension\Core\Type\FileType; +use Symfony\Component\Form\Extension\Core\Type\SubmitType; +use Symfony\Component\Form\Extension\Core\Type\TextareaType; +use Symfony\Component\HttpFoundation\Request; + +class Conversation extends FeedController +{ + // if note is root -> just link + // if note is a reply -> link from above plus anchor + public function ConversationShow(Request $request) + { + $actor_id = Common::ensureLoggedIn()->getId(); + $notes = DB::dql('select n from App\Entity\Note n ' + . 'where n.reply_to is not null and n.actor_id = :id ' + . 'order by n.created DESC', ['id' => $actor_id], ); + return [ + '_template' => 'feeds/feed.html.twig', + 'notes' => $notes, + 'should_format' => false, + 'page_title' => 'Replies feed', + ]; + } +} diff --git a/src/Controller/Feeds.php b/src/Controller/Feeds.php index d57e48e014..70b0c8a38a 100644 --- a/src/Controller/Feeds.php +++ b/src/Controller/Feeds.php @@ -58,6 +58,7 @@ class Feeds extends FeedController return [ '_template' => 'feeds/feed.html.twig', 'page_title' => 'Public feed', + 'should_format' => true, 'notes' => $notes, ]; } @@ -100,6 +101,7 @@ class Feeds extends FeedController return [ '_template' => 'feeds/feed.html.twig', 'page_title' => 'Home feed', + 'should_format' => true, 'notes' => $notes, ]; } @@ -110,6 +112,7 @@ class Feeds extends FeedController return [ '_template' => 'feeds/feed.html.twig', 'page_title' => 'Network feed', + 'should_format' => true, 'notes' => $notes, ]; } diff --git a/src/Core/Controller/FeedController.php b/src/Core/Controller/FeedController.php index c936feaab0..dd3710da45 100644 --- a/src/Core/Controller/FeedController.php +++ b/src/Core/Controller/FeedController.php @@ -48,9 +48,11 @@ abstract class FeedController extends Controller Event::handle('FilterNoteList', [$actor, &$notes]); } - $notes_out = null; - Event::handle('FormatNoteList', [$notes, &$notes_out]); - $result['notes'] = $notes_out; + if ($result['should_format'] ?? true) { + $notes_out = null; + Event::handle('FormatNoteList', [$notes, &$notes_out]); + $result['notes'] = $notes_out; + } } return $result; diff --git a/src/Entity/Conversation.php b/src/Entity/Conversation.php deleted file mode 100644 index 664782a28a..0000000000 --- a/src/Entity/Conversation.php +++ /dev/null @@ -1,108 +0,0 @@ -. -// }}} - -namespace App\Entity; - -use App\Core\Entity; -use DateTimeInterface; - -/** - * Data class for Conversations - * - * @category Data - * @package GNUsocial - * - * @author Zach Copley - * @author Mikael Nordfeldth - * @copyright 2010 StatusNet Inc. - * @copyright 2009-2014 Free Software Foundation, Inc http://www.fsf.org - * @author Hugo Sales - * @copyright 2021 Free Software Foundation, Inc http://www.fsf.org - * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later - */ -class Conversation extends Entity -{ - // {{{ Autocode - // @codeCoverageIgnoreStart - private int $id; - private int $note_id; - private \DateTimeInterface $created; - private \DateTimeInterface $modified; - - public function setId(int $id): self - { - $this->id = $id; - return $this; - } - - public function getId(): int - { - return $this->id; - } - - public function setNoteId(int $note_id): self - { - $this->note_id = $note_id; - return $this; - } - - public function getNoteId(): int - { - return $this->note_id; - } - - public function setCreated(DateTimeInterface $created): self - { - $this->created = $created; - return $this; - } - - public function getCreated(): DateTimeInterface - { - return $this->created; - } - - public function setModified(DateTimeInterface $modified): self - { - $this->modified = $modified; - return $this; - } - - public function getModified(): DateTimeInterface - { - return $this->modified; - } - - // @codeCoverageIgnoreEnd - // }}} Autocode - - public static function schemaDef(): array - { - return [ - 'name' => 'conversation', - 'fields' => [ - 'id' => ['type' => 'serial', 'not null' => true, 'description' => 'Unique identifier'], - 'note_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'Note.id', 'multiplicity' => 'one to one', 'not null' => true, 'description' => 'Root of note for this conversation'], - 'created' => ['type' => 'datetime', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was created'], - 'modified' => ['type' => 'timestamp', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'], - ], - 'primary key' => ['id'], - ]; - } -}