From a8a8cc4046df5c2d4768461d8af02241c24e8266 Mon Sep 17 00:00:00 2001 From: Hugo Sales Date: Mon, 3 Jan 2022 20:35:26 +0000 Subject: [PATCH] [COMPONENT][Posting] Plumb in reply_to and redirecto to GET from --- components/Posting/Posting.php | 35 ++++++++++++++++++++++++---------- src/Core/Controller.php | 7 +++---- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/components/Posting/Posting.php b/components/Posting/Posting.php index f38ee21f15..1bd2001b43 100644 --- a/components/Posting/Posting.php +++ b/components/Posting/Posting.php @@ -55,6 +55,7 @@ use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\HttpFoundation\File\Exception\FormSizeFileException; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Routing\Exception\ResourceNotFoundException; use Symfony\Component\Validator\Constraints\Length; class Posting extends Component @@ -129,6 +130,8 @@ class Posting extends Component try { if ($form->isValid()) { $data = $form->getData(); + Event::handle('PostingModifyData', [$request, $actor, &$data, $form_params, $form]); + if (empty($data['content']) && empty($data['attachments'])) { // TODO Display error: At least one of `content` and `attachments` must be provided throw new ClientException(_m('You must enter content or provide at least one attachment to post a note.')); @@ -148,15 +151,28 @@ class Posting extends Component content_type: $content_type, language: $data['language'], scope: VisibilityScope::from($data['visibility']), - target: $data['in'] ?? null, + target: $data['in'] ?? $context_actor, + reply_to_id: $data['reply_to_id'], attachments: $data['attachments'], process_note_content_extra_args: $extra_args, ); + try { + if ($request->query->has('from')) { + $from = $request->query->get('from'); + if (str_contains($from, '#')) { + [$from, $fragment] = explode('#', $from); + } + Router::match($from); + throw new RedirectException(url: $from . (isset($fragment) ? '#' . $fragment : '')); + } + } catch (ResourceNotFoundException $e) { + // continue + } throw new RedirectException(); } - } catch (FormSizeFileException $sizeFileException) { - throw new FormSizeFileException(); + } catch (FormSizeFileException $e) { + throw new ClientException(_m('Invalid file size given'), previous: $e); } } @@ -185,7 +201,8 @@ class Posting extends Component string $content_type, ?string $language = null, ?VisibilityScope $scope = null, - ?string $target = null, + null|int|Actor $target = null, + ?int $reply_to_id = null, array $attachments = [], array $processed_attachments = [], array $process_note_content_extra_args = [], @@ -206,6 +223,7 @@ class Posting extends Component 'language_id' => !\is_null($language) ? Language::getByLocale($language)->getId() : null, 'is_local' => true, 'scope' => $scope, + 'reply_to' => $reply_to_id, ]); /** @var UploadedFile[] $attachments */ @@ -222,11 +240,6 @@ class Posting extends Component DB::persist($note); - // Assign conversation to this note - // AddExtraArgsToNoteContent already added the info we need - $reply_to = $process_note_content_extra_args['reply_to']; - Conversation::assignLocalConversation($note, $reply_to); - // Need file and note ids for the next step $note->setUrl(Router::url('note_view', ['id' => $note->getId()], Router::ABSOLUTE_URL)); if (!empty($content)) { @@ -242,6 +255,8 @@ class Posting extends Component } } + Conversation::assignLocalConversation($note, $reply_to_id); + $activity = Activity::create([ 'actor_id' => $actor->getId(), 'verb' => 'create', @@ -269,7 +284,7 @@ class Posting extends Component DB::flush(); if ($notify) { - Event::handle('NewNotification', [$actor, $activity, ['object' => $mention_ids], _m('{nickname} created a note {note_id}.', ['nickname' => $actor->getNickname(), 'note_id' => $activity->getObjectId()])]); + Event::handle('NewNotification', [$actor, $activity, ['object' => $mention_ids], _m('{nickname} created a note {note_id}.', ['{nickname}' => $actor->getNickname(), '{note_id}' => $activity->getObjectId()])]); } return $note; diff --git a/src/Core/Controller.php b/src/Core/Controller.php index e75e9c5c4f..a56a42c1db 100644 --- a/src/Core/Controller.php +++ b/src/Core/Controller.php @@ -56,9 +56,9 @@ use Symfony\Component\Validator\Exception\ValidatorException; use Throwable; /** - * @method ?int int(string $param) - * @method ?bool bool(string $param) - * @method ?string string(string $param) + * @method ?int int(string $param, ?\Throwable $throw = null) + * @method ?bool bool(string $param, ?\Throwable $throw = null) + * @method ?string string(string $param, ?\Throwable $throw = null) * @method ?string params(string $param) * @method mixed handle(Request $request, mixed ...$extra) */ @@ -257,7 +257,6 @@ abstract class Controller extends AbstractController implements EventSubscriberI } else { return null; } - break; case 'params': return $this->request->query->all(); default: