From 40c9d58410c68750bea5ff850668b1b6e1909f3c Mon Sep 17 00:00:00 2001 From: Stevy Endaman Date: Mon, 18 Nov 2024 00:30:23 +0100 Subject: [PATCH 01/13] feat: (LAR-105) create TransfertDiscutionToThreadAction file --- .../Discussion/TransfertDiscussionToThreadAction.php | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 app/Actions/Discussion/TransfertDiscussionToThreadAction.php diff --git a/app/Actions/Discussion/TransfertDiscussionToThreadAction.php b/app/Actions/Discussion/TransfertDiscussionToThreadAction.php new file mode 100644 index 00000000..3cc56f83 --- /dev/null +++ b/app/Actions/Discussion/TransfertDiscussionToThreadAction.php @@ -0,0 +1,7 @@ + Date: Fri, 29 Nov 2024 09:41:38 +0100 Subject: [PATCH 02/13] feat: (LAR-105) convert discussion to thread creator part --- .../ConvertDiscussionToThreadAction.php | 36 +++++++++++++ .../NotifyUsersOfThreadConversion.php | 23 +++++++++ .../TransfertDiscussionToThreadAction.php | 7 --- .../Discussions/ConvertedToThread.php | 36 +++++++++++++ app/Notifications/ThreadConvertedByAdmin.php | 50 +++++++++++++++++++ .../ThreadConvertedByCreator.php | 50 +++++++++++++++++++ app/Policies/DiscussionPolicy.php | 8 +++ ...cation-user-to-thread-conversion.blade.php | 12 +++++ ...fy-creator-for-thread-conversion.blade.php | 12 +++++ .../discussions/converted-to-thread.blade.php | 23 +++++++++ .../discussions/single-discussion.blade.php | 1 + 11 files changed, 251 insertions(+), 7 deletions(-) create mode 100644 app/Actions/Discussion/ConvertDiscussionToThreadAction.php create mode 100644 app/Actions/Discussion/NotifyUsersOfThreadConversion.php delete mode 100644 app/Actions/Discussion/TransfertDiscussionToThreadAction.php create mode 100644 app/Livewire/Discussions/ConvertedToThread.php create mode 100644 app/Notifications/ThreadConvertedByAdmin.php create mode 100644 app/Notifications/ThreadConvertedByCreator.php create mode 100644 resources/views/emails/notification-user-to-thread-conversion.blade.php create mode 100644 resources/views/emails/notify-creator-for-thread-conversion.blade.php create mode 100644 resources/views/livewire/discussions/converted-to-thread.blade.php diff --git a/app/Actions/Discussion/ConvertDiscussionToThreadAction.php b/app/Actions/Discussion/ConvertDiscussionToThreadAction.php new file mode 100644 index 00000000..5ce0d061 --- /dev/null +++ b/app/Actions/Discussion/ConvertDiscussionToThreadAction.php @@ -0,0 +1,36 @@ + $discussion->title, + 'slug' => $discussion->slug, + 'body' => $discussion->body, + 'user_id' => $discussion->user_id, + 'locked' => $discussion->locked, + 'last_posted_at' => now(), + ]); + + $discussion->replies()->update([ + 'replyable_type' => Thread::class, + 'replyable_id' => $thread->id, + ]); + + $discussion->delete(); + + app(NotifyUserConvertionDiscussionToThread::class)->execute($thread, $isAdmin); + + return $thread; + }); + } +} diff --git a/app/Actions/Discussion/NotifyUsersOfThreadConversion.php b/app/Actions/Discussion/NotifyUsersOfThreadConversion.php new file mode 100644 index 00000000..06159f58 --- /dev/null +++ b/app/Actions/Discussion/NotifyUsersOfThreadConversion.php @@ -0,0 +1,23 @@ +replies->pluck('user')->unique(); + + // ToDo: send mail to the replying user with this class notification ThreadConvertedByCreator + + if ($isAdmin) { + $creator = $thread->user; + // ToDo: send mail to the creator with this class notification ThreadConvertedByAdmin + } + } +} diff --git a/app/Actions/Discussion/TransfertDiscussionToThreadAction.php b/app/Actions/Discussion/TransfertDiscussionToThreadAction.php deleted file mode 100644 index 3cc56f83..00000000 --- a/app/Actions/Discussion/TransfertDiscussionToThreadAction.php +++ /dev/null @@ -1,7 +0,0 @@ -authorize(DiscussionPolicy::CONVERTEDTOTHREAD, $this->discussion); + + $this->discussion->subscribes() + ->where('user_id', Auth::id()) + ->delete(); + + Notification::make() + ->title(__('Désabonnement')) + ->body(__('Vous êtes maintenant désabonné à cette discussion.')) + ->success() + ->duration(5000) + ->send(); + + $this->dispatch('refresh')->self(); + } +} diff --git a/app/Notifications/ThreadConvertedByAdmin.php b/app/Notifications/ThreadConvertedByAdmin.php new file mode 100644 index 00000000..e2d297f2 --- /dev/null +++ b/app/Notifications/ThreadConvertedByAdmin.php @@ -0,0 +1,50 @@ + + */ + public function via(object $notifiable): array + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + */ + public function toMail(object $notifiable): MailMessage + { + return (new MailMessage)->markdown('emails.notify-creator-for-thread-conversion'); + } + + /** + * Get the array representation of the notification. + * + * @return array + */ + public function toArray(object $notifiable): array + { + return [ + // + ]; + } +} diff --git a/app/Notifications/ThreadConvertedByCreator.php b/app/Notifications/ThreadConvertedByCreator.php new file mode 100644 index 00000000..1561b7a2 --- /dev/null +++ b/app/Notifications/ThreadConvertedByCreator.php @@ -0,0 +1,50 @@ + + */ + public function via(object $notifiable): array + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + */ + public function toMail(object $notifiable): MailMessage + { + return (new MailMessage)->markdown('emails.notification-user-to-thread-conversion'); + } + + /** + * Get the array representation of the notification. + * + * @return array + */ + public function toArray(object $notifiable): array + { + return [ + // + ]; + } +} diff --git a/app/Policies/DiscussionPolicy.php b/app/Policies/DiscussionPolicy.php index fd80b9b3..c7b040b9 100644 --- a/app/Policies/DiscussionPolicy.php +++ b/app/Policies/DiscussionPolicy.php @@ -22,6 +22,8 @@ final class DiscussionPolicy public const UNSUBSCRIBE = 'unsubscribe'; + public const CONVERTEDTOTHREAD = 'convertedToThread'; + public function create(User $user): bool { return $user->hasVerifiedEmail(); @@ -51,4 +53,10 @@ public function unsubscribe(User $user, Discussion $discussion): bool { return $discussion->hasSubscriber($user); } + + public function convertedToThread(User $user, Discussion $discussion): bool + { + return $discussion->isAuthoredBy($user) || $user->isModerator() || $user->isAdmin(); + } + } diff --git a/resources/views/emails/notification-user-to-thread-conversion.blade.php b/resources/views/emails/notification-user-to-thread-conversion.blade.php new file mode 100644 index 00000000..de9a155b --- /dev/null +++ b/resources/views/emails/notification-user-to-thread-conversion.blade.php @@ -0,0 +1,12 @@ + +# Introduction + +The body of your message. + + +Button Text + + +Thanks,
+{{ config('app.name') }} +
diff --git a/resources/views/emails/notify-creator-for-thread-conversion.blade.php b/resources/views/emails/notify-creator-for-thread-conversion.blade.php new file mode 100644 index 00000000..de9a155b --- /dev/null +++ b/resources/views/emails/notify-creator-for-thread-conversion.blade.php @@ -0,0 +1,12 @@ + +# Introduction + +The body of your message. + + +Button Text + + +Thanks,
+{{ config('app.name') }} +
diff --git a/resources/views/livewire/discussions/converted-to-thread.blade.php b/resources/views/livewire/discussions/converted-to-thread.blade.php new file mode 100644 index 00000000..fc51e3e8 --- /dev/null +++ b/resources/views/livewire/discussions/converted-to-thread.blade.php @@ -0,0 +1,23 @@ +
+ + @can(App\Policies\DiscussionPolicy::CONVERTEDTOTHREAD, $discussion) + + + + + Convert to thread + + + @endcan +
diff --git a/resources/views/livewire/pages/discussions/single-discussion.blade.php b/resources/views/livewire/pages/discussions/single-discussion.blade.php index e44bec21..3b71ba6c 100644 --- a/resources/views/livewire/pages/discussions/single-discussion.blade.php +++ b/resources/views/livewire/pages/discussions/single-discussion.blade.php @@ -120,6 +120,7 @@ class="font-sans text-sm leading-5 text-red-500 hover:underline focus:outline-no

@auth + @endauth From d41b68dbb47c357aad25719fd62bd4c4eb1836f5 Mon Sep 17 00:00:00 2001 From: Stevy Endaman Date: Fri, 6 Dec 2024 05:23:54 +0100 Subject: [PATCH 03/13] feat:(LAR-105) add transform a discussion to a thread --- .../ConvertDiscussionToThreadAction.php | 11 +++--- .../NotifyUsersOfThreadConversion.php | 13 ++++--- .../Discussions/ConvertedToThread.php | 36 ----------------- app/Livewire/Modals/ConvertDiscussion.php | 33 ++++++++++++++++ app/Notifications/ThreadConvertedByAdmin.php | 27 +++++-------- .../ThreadConvertedByCreator.php | 26 ++++--------- app/Policies/DiscussionPolicy.php | 10 ++--- ...cation-user-to-thread-conversion.blade.php | 12 ------ ...fy-creator-for-thread-conversion.blade.php | 12 ------ .../discussions/converted-to-thread.blade.php | 23 ----------- .../modals/convert-discussion.blade.php | 35 +++++++++++++++++ .../discussions/single-discussion.blade.php | 12 +++++- .../ConvertDiscussionToThreadActionTest.php | 39 +++++++++++++++++++ .../Livewire/Modal/ConvertDiscussionTest.php | 29 ++++++++++++++ 14 files changed, 182 insertions(+), 136 deletions(-) delete mode 100644 app/Livewire/Discussions/ConvertedToThread.php create mode 100644 app/Livewire/Modals/ConvertDiscussion.php delete mode 100644 resources/views/emails/notification-user-to-thread-conversion.blade.php delete mode 100644 resources/views/emails/notify-creator-for-thread-conversion.blade.php delete mode 100644 resources/views/livewire/discussions/converted-to-thread.blade.php create mode 100644 resources/views/livewire/modals/convert-discussion.blade.php create mode 100644 tests/Feature/Actions/Discussion/ConvertDiscussionToThreadActionTest.php create mode 100644 tests/Feature/Livewire/Modal/ConvertDiscussionTest.php diff --git a/app/Actions/Discussion/ConvertDiscussionToThreadAction.php b/app/Actions/Discussion/ConvertDiscussionToThreadAction.php index 5ce0d061..3f494b81 100644 --- a/app/Actions/Discussion/ConvertDiscussionToThreadAction.php +++ b/app/Actions/Discussion/ConvertDiscussionToThreadAction.php @@ -1,17 +1,18 @@ $discussion->title, 'slug' => $discussion->slug, @@ -22,13 +23,13 @@ public function execute(Discussion $discussion, bool $isAdmin = false): Thread ]); $discussion->replies()->update([ - 'replyable_type' => Thread::class, + 'replyable_type' => 'thread', 'replyable_id' => $thread->id, ]); $discussion->delete(); - app(NotifyUserConvertionDiscussionToThread::class)->execute($thread, $isAdmin); + app(NotifyUsersOfThreadConversion::class)->execute($thread, $isAdmin); return $thread; }); diff --git a/app/Actions/Discussion/NotifyUsersOfThreadConversion.php b/app/Actions/Discussion/NotifyUsersOfThreadConversion.php index 06159f58..163ad914 100644 --- a/app/Actions/Discussion/NotifyUsersOfThreadConversion.php +++ b/app/Actions/Discussion/NotifyUsersOfThreadConversion.php @@ -1,23 +1,26 @@ replies->pluck('user')->unique(); + $usersToNotify = $thread->replies()->pluck('user_id')->unique()->toArray(); - // ToDo: send mail to the replying user with this class notification ThreadConvertedByCreator + User::whereIn('id', $usersToNotify)->get()->each->notify(new ThreadConvertedByCreator($thread)); if ($isAdmin) { $creator = $thread->user; - // ToDo: send mail to the creator with this class notification ThreadConvertedByAdmin + + $creator->notify(new ThreadConvertedByAdmin($thread)); } } } diff --git a/app/Livewire/Discussions/ConvertedToThread.php b/app/Livewire/Discussions/ConvertedToThread.php deleted file mode 100644 index 502068ad..00000000 --- a/app/Livewire/Discussions/ConvertedToThread.php +++ /dev/null @@ -1,36 +0,0 @@ -authorize(DiscussionPolicy::CONVERTEDTOTHREAD, $this->discussion); - - $this->discussion->subscribes() - ->where('user_id', Auth::id()) - ->delete(); - - Notification::make() - ->title(__('Désabonnement')) - ->body(__('Vous êtes maintenant désabonné à cette discussion.')) - ->success() - ->duration(5000) - ->send(); - - $this->dispatch('refresh')->self(); - } -} diff --git a/app/Livewire/Modals/ConvertDiscussion.php b/app/Livewire/Modals/ConvertDiscussion.php new file mode 100644 index 00000000..70637c1c --- /dev/null +++ b/app/Livewire/Modals/ConvertDiscussion.php @@ -0,0 +1,33 @@ +discussionId); + + $this->authorize(DiscussionPolicy::CONVERTEDTOTHREAD, $discussion); + + $thread = app(ConvertDiscussionToThreadAction::class)->execute($discussion, Auth::user()->isAdmin()); + + $this->redirectRoute('forum.show', $thread, navigate: true); + } + + public function render(): View + { + return view('livewire.modals.convert-discussion'); + } +} diff --git a/app/Notifications/ThreadConvertedByAdmin.php b/app/Notifications/ThreadConvertedByAdmin.php index e2d297f2..efb076f8 100644 --- a/app/Notifications/ThreadConvertedByAdmin.php +++ b/app/Notifications/ThreadConvertedByAdmin.php @@ -4,8 +4,8 @@ namespace App\Notifications; +use App\Models\Thread; use Illuminate\Bus\Queueable; -use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; @@ -13,10 +13,7 @@ final class ThreadConvertedByAdmin extends Notification { use Queueable; - public function __construct() - { - // - } + public function __construct(public Thread $thread) {} /** * Get the notification's delivery channels. @@ -33,18 +30,12 @@ public function via(object $notifiable): array */ public function toMail(object $notifiable): MailMessage { - return (new MailMessage)->markdown('emails.notify-creator-for-thread-conversion'); - } - - /** - * Get the array representation of the notification. - * - * @return array - */ - public function toArray(object $notifiable): array - { - return [ - // - ]; + return (new MailMessage) + ->subject('Discussion Converted by Admin') + ->greeting('Hello!') + ->line('An admin has converted a discussion to a thread.') + ->line('Thread Title: '.$this->thread->title) + ->action('View Thread', route('forum.show', $this->thread)) + ->line('This action was performed by an administrator.'); } } diff --git a/app/Notifications/ThreadConvertedByCreator.php b/app/Notifications/ThreadConvertedByCreator.php index 1561b7a2..e9cd5661 100644 --- a/app/Notifications/ThreadConvertedByCreator.php +++ b/app/Notifications/ThreadConvertedByCreator.php @@ -4,8 +4,8 @@ namespace App\Notifications; +use App\Models\Thread; use Illuminate\Bus\Queueable; -use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; @@ -13,10 +13,7 @@ final class ThreadConvertedByCreator extends Notification { use Queueable; - public function __construct() - { - // - } + public function __construct(public Thread $thread) {} /** * Get the notification's delivery channels. @@ -33,18 +30,11 @@ public function via(object $notifiable): array */ public function toMail(object $notifiable): MailMessage { - return (new MailMessage)->markdown('emails.notification-user-to-thread-conversion'); - } - - /** - * Get the array representation of the notification. - * - * @return array - */ - public function toArray(object $notifiable): array - { - return [ - // - ]; + return (new MailMessage) + ->subject(__('Discussion Converted to Thread')) + ->line('A discussion you participated in has been converted to a thread.') + ->line('Thread Title: '.$this->thread->title) + ->action('View Thread', route('forum.show', $this->thread)) + ->line('Thank you for your participation!'); } } diff --git a/app/Policies/DiscussionPolicy.php b/app/Policies/DiscussionPolicy.php index 1266002c..54524d0c 100644 --- a/app/Policies/DiscussionPolicy.php +++ b/app/Policies/DiscussionPolicy.php @@ -22,7 +22,7 @@ final class DiscussionPolicy public const UNSUBSCRIBE = 'unsubscribe'; - public const string CONVERTEDTOTHREAD = 'convertedToThread'; + public const CONVERTEDTOTHREAD = 'convertedToThread'; public function create(User $user): bool { @@ -54,13 +54,13 @@ public function unsubscribe(User $user, Discussion $discussion): bool return $discussion->hasSubscriber($user); } - public function convertedToThread(User $user, Discussion $discussion): bool + public function report(User $user, Discussion $discussion): bool { - return $discussion->isAuthoredBy($user) || $user->isModerator() || $user->isAdmin(); + return $user->hasVerifiedEmail() && ! $discussion->isAuthoredBy($user); } - public function report(User $user, Discussion $discussion): bool + public function convertedToThread(User $user, Discussion $discussion): bool { - return $user->hasVerifiedEmail() && ! $discussion->isAuthoredBy($user); + return $discussion->isAuthoredBy($user) || $user->isAdmin(); } } diff --git a/resources/views/emails/notification-user-to-thread-conversion.blade.php b/resources/views/emails/notification-user-to-thread-conversion.blade.php deleted file mode 100644 index de9a155b..00000000 --- a/resources/views/emails/notification-user-to-thread-conversion.blade.php +++ /dev/null @@ -1,12 +0,0 @@ - -# Introduction - -The body of your message. - - -Button Text - - -Thanks,
-{{ config('app.name') }} -
diff --git a/resources/views/emails/notify-creator-for-thread-conversion.blade.php b/resources/views/emails/notify-creator-for-thread-conversion.blade.php deleted file mode 100644 index de9a155b..00000000 --- a/resources/views/emails/notify-creator-for-thread-conversion.blade.php +++ /dev/null @@ -1,12 +0,0 @@ - -# Introduction - -The body of your message. - - -Button Text - - -Thanks,
-{{ config('app.name') }} -
diff --git a/resources/views/livewire/discussions/converted-to-thread.blade.php b/resources/views/livewire/discussions/converted-to-thread.blade.php deleted file mode 100644 index fc51e3e8..00000000 --- a/resources/views/livewire/discussions/converted-to-thread.blade.php +++ /dev/null @@ -1,23 +0,0 @@ -
- - @can(App\Policies\DiscussionPolicy::CONVERTEDTOTHREAD, $discussion) - - - - - Convert to thread - - - @endcan -
diff --git a/resources/views/livewire/modals/convert-discussion.blade.php b/resources/views/livewire/modals/convert-discussion.blade.php new file mode 100644 index 00000000..ae92c468 --- /dev/null +++ b/resources/views/livewire/modals/convert-discussion.blade.php @@ -0,0 +1,35 @@ + + + {{ __("Confirmez la convertion") }} + + +
+
+
+ + {{ __("Voulez-vous vraiment convertir cette discussion en thread ?") }} + +
+
+
+ + + + + {{ __('Annuler') }} + + +
diff --git a/resources/views/livewire/pages/discussions/single-discussion.blade.php b/resources/views/livewire/pages/discussions/single-discussion.blade.php index 3b71ba6c..1f798b2f 100644 --- a/resources/views/livewire/pages/discussions/single-discussion.blade.php +++ b/resources/views/livewire/pages/discussions/single-discussion.blade.php @@ -101,12 +101,21 @@ class="font-sans text-sm leading-5 text-gray-500 dark:text-gray-400 hover:underl · + @can('convertedToThread', $discussion) + · + + @endcan @endcan @@ -120,7 +129,6 @@ class="font-sans text-sm leading-5 text-red-500 hover:underline focus:outline-no

@auth - @endauth diff --git a/tests/Feature/Actions/Discussion/ConvertDiscussionToThreadActionTest.php b/tests/Feature/Actions/Discussion/ConvertDiscussionToThreadActionTest.php new file mode 100644 index 00000000..8b0a1553 --- /dev/null +++ b/tests/Feature/Actions/Discussion/ConvertDiscussionToThreadActionTest.php @@ -0,0 +1,39 @@ +discussion = Discussion::factory()->create(); +}); + +describe(ConvertDiscussionToThreadAction::class, function (): void { + it('can converts a discussion to a thread', function (): void { + $replies = Reply::factory()->count(3)->create([ + 'replyable_type' => 'discussion', + 'replyable_id' => $this->discussion->id, + ]); + + $thread = app(ConvertDiscussionToThreadAction::class)->execute(discussion: $this->discussion); + + expect($thread)->toBeInstanceOf(Thread::class) + ->and(Discussion::find($this->discussion->id))->toBeNull(); + + $replies->each(function ($reply) use ($thread): void { + $updatedReply = Reply::find($reply->id); + + expect($updatedReply->replyable_type)->toBe('thread') + ->and($updatedReply->replyable_id)->toBe($thread->id); + }); + }); + + it('can handles admin conversion', function (): void { + $thread = app(ConvertDiscussionToThreadAction::class)->execute(discussion: $this->discussion, isAdmin: true); + + expect($thread)->toBeInstanceOf(Thread::class); + }); +}); diff --git a/tests/Feature/Livewire/Modal/ConvertDiscussionTest.php b/tests/Feature/Livewire/Modal/ConvertDiscussionTest.php new file mode 100644 index 00000000..aecdad17 --- /dev/null +++ b/tests/Feature/Livewire/Modal/ConvertDiscussionTest.php @@ -0,0 +1,29 @@ +create(); + $this->user = $this->actingAs($user); + $this->discussion = Discussion::factory()->create(); +}); + +describe(ConvertDiscussion::class, function (): void { + it('requires authorization to convert discussion', function (): void { + Livewire::test(ConvertDiscussion::class) + ->set('discussionId', $this->discussion->id) + ->call('save') + ->assertForbidden(); + }); + + it('throws exception for non-existent discussion', function (): void { + Livewire::test(ConvertDiscussion::class) + ->set('discussionId', 9) + ->call('save'); + })->throws(Illuminate\Database\Eloquent\ModelNotFoundException::class); +}); From 614bd11c79293ce25567de4bdab52eb6a9e5c951 Mon Sep 17 00:00:00 2001 From: Endaman Stevy Date: Wed, 11 Dec 2024 17:18:26 +0100 Subject: [PATCH 04/13] feat: (LAR-105) add translation --- .../ConvertDiscussionToThreadAction.php | 3 +-- app/Livewire/Modals/ConvertDiscussion.php | 2 +- app/Policies/DiscussionPolicy.php | 2 -- lang/en/pages/discutssion.php | 23 +++++++++++++++++++ .../discussions/single-discussion.blade.php | 6 ++--- 5 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 lang/en/pages/discutssion.php diff --git a/app/Actions/Discussion/ConvertDiscussionToThreadAction.php b/app/Actions/Discussion/ConvertDiscussionToThreadAction.php index 3f494b81..44da90bf 100644 --- a/app/Actions/Discussion/ConvertDiscussionToThreadAction.php +++ b/app/Actions/Discussion/ConvertDiscussionToThreadAction.php @@ -18,8 +18,7 @@ public function execute(Discussion $discussion, bool $isAdmin = false): Thread 'slug' => $discussion->slug, 'body' => $discussion->body, 'user_id' => $discussion->user_id, - 'locked' => $discussion->locked, - 'last_posted_at' => now(), + 'last_posted_at' => null, ]); $discussion->replies()->update([ diff --git a/app/Livewire/Modals/ConvertDiscussion.php b/app/Livewire/Modals/ConvertDiscussion.php index 70637c1c..6b323163 100644 --- a/app/Livewire/Modals/ConvertDiscussion.php +++ b/app/Livewire/Modals/ConvertDiscussion.php @@ -19,7 +19,7 @@ public function save(): void { $discussion = Discussion::findOrFail($this->discussionId); - $this->authorize(DiscussionPolicy::CONVERTEDTOTHREAD, $discussion); + $this->authorize('convertedToThread', $discussion); $thread = app(ConvertDiscussionToThreadAction::class)->execute($discussion, Auth::user()->isAdmin()); diff --git a/app/Policies/DiscussionPolicy.php b/app/Policies/DiscussionPolicy.php index 54524d0c..7ee28b4b 100644 --- a/app/Policies/DiscussionPolicy.php +++ b/app/Policies/DiscussionPolicy.php @@ -22,8 +22,6 @@ final class DiscussionPolicy public const UNSUBSCRIBE = 'unsubscribe'; - public const CONVERTEDTOTHREAD = 'convertedToThread'; - public function create(User $user): bool { return $user->hasVerifiedEmail(); diff --git a/lang/en/pages/discutssion.php b/lang/en/pages/discutssion.php new file mode 100644 index 00000000..cc1551b9 --- /dev/null +++ b/lang/en/pages/discutssion.php @@ -0,0 +1,23 @@ + 'Tous les sujets de discussion', + 'contributors' => [ + 'top' => 'Top Contributeurs', + 'description' => 'Les personnes qui ont lancé le plus de discussions sur le site.', + ], + 'empty' => 'Discussions sans commentaires', + 'empty_description' => 'Les discussions / sujets qui n’ont pas encore eu de commentaires. Soyez le premier à apporter votre contribution.', + 'total_answer' => 'total réponses', + 'new_discussion' => 'Nouveau discussion', + 'filter' => [ + 'recent' => 'Récent', + 'popular' => 'Populaire', + 'active' => 'Actif', + ], + 'comments_count' => 'Commentaires (:count)', + +]; diff --git a/resources/views/livewire/pages/discussions/single-discussion.blade.php b/resources/views/livewire/pages/discussions/single-discussion.blade.php index 1f798b2f..bd935554 100644 --- a/resources/views/livewire/pages/discussions/single-discussion.blade.php +++ b/resources/views/livewire/pages/discussions/single-discussion.blade.php @@ -95,7 +95,7 @@ class="mx-auto mt-6 text-sm prose prose-sm prose-green max-w-none dark:prose-inv
{{ __('Éditer') }} @@ -103,7 +103,7 @@ class="font-sans text-sm leading-5 text-gray-500 dark:text-gray-400 hover:underl @@ -111,7 +111,7 @@ class="font-sans text-sm leading-5 text-red-500 hover:underline focus:outline-no · From ffbc8e2bf2bc07ef9b913da7b3c67d96abb21f74 Mon Sep 17 00:00:00 2001 From: Endaman Stevy Date: Fri, 13 Dec 2024 10:44:19 +0100 Subject: [PATCH 05/13] refact(test): refactoring test and logic of action --- .../ConvertDiscussionToThreadAction.php | 6 ++--- .../NotifyUsersOfThreadConversion.php | 9 ++++--- app/Livewire/Modals/ConvertDiscussion.php | 4 +--- app/Notifications/ThreadConvertedByAdmin.php | 2 +- .../ThreadConvertedByCreator.php | 2 +- lang/en/actions.php | 1 + .../pages/{discutssion.php => discussion.php} | 5 ++++ lang/fr/actions.php | 1 + lang/fr/pages/discussion.php | 5 ++++ .../modals/convert-discussion.blade.php | 8 +++---- .../discussions/single-discussion.blade.php | 7 +++--- .../ConvertDiscussionToThreadActionTest.php | 24 +++++++++++++++---- .../Livewire/Modal/ConvertDiscussionTest.php | 11 +++++---- 13 files changed, 56 insertions(+), 29 deletions(-) rename lang/en/pages/{discutssion.php => discussion.php} (68%) diff --git a/app/Actions/Discussion/ConvertDiscussionToThreadAction.php b/app/Actions/Discussion/ConvertDiscussionToThreadAction.php index 44da90bf..2e16668f 100644 --- a/app/Actions/Discussion/ConvertDiscussionToThreadAction.php +++ b/app/Actions/Discussion/ConvertDiscussionToThreadAction.php @@ -10,9 +10,9 @@ final class ConvertDiscussionToThreadAction { - public function execute(Discussion $discussion, bool $isAdmin = false): Thread + public function execute(Discussion $discussion): Thread { - return DB::transaction(function () use ($discussion, $isAdmin) { + return DB::transaction(function () use ($discussion) { $thread = Thread::create([ 'title' => $discussion->title, 'slug' => $discussion->slug, @@ -28,7 +28,7 @@ public function execute(Discussion $discussion, bool $isAdmin = false): Thread $discussion->delete(); - app(NotifyUsersOfThreadConversion::class)->execute($thread, $isAdmin); + app(NotifyUsersOfThreadConversion::class)->execute($thread); return $thread; }); diff --git a/app/Actions/Discussion/NotifyUsersOfThreadConversion.php b/app/Actions/Discussion/NotifyUsersOfThreadConversion.php index 163ad914..cb8ce3bb 100644 --- a/app/Actions/Discussion/NotifyUsersOfThreadConversion.php +++ b/app/Actions/Discussion/NotifyUsersOfThreadConversion.php @@ -8,19 +8,18 @@ use App\Models\User; use App\Notifications\ThreadConvertedByAdmin; use App\Notifications\ThreadConvertedByCreator; +use Illuminate\Support\Facades\Auth; final class NotifyUsersOfThreadConversion { - public function execute(Thread $thread, bool $isAdmin = false): void + public function execute(Thread $thread): void { $usersToNotify = $thread->replies()->pluck('user_id')->unique()->toArray(); User::whereIn('id', $usersToNotify)->get()->each->notify(new ThreadConvertedByCreator($thread)); - if ($isAdmin) { - $creator = $thread->user; - - $creator->notify(new ThreadConvertedByAdmin($thread)); + if (Auth::check() && Auth::user()->isAdmin()) { + $thread->user->notify(new ThreadConvertedByAdmin($thread)); } } } diff --git a/app/Livewire/Modals/ConvertDiscussion.php b/app/Livewire/Modals/ConvertDiscussion.php index 6b323163..c0620081 100644 --- a/app/Livewire/Modals/ConvertDiscussion.php +++ b/app/Livewire/Modals/ConvertDiscussion.php @@ -6,9 +6,7 @@ use App\Actions\Discussion\ConvertDiscussionToThreadAction; use App\Models\Discussion; -use App\Policies\DiscussionPolicy; use Illuminate\Contracts\View\View; -use Illuminate\Support\Facades\Auth; use LivewireUI\Modal\ModalComponent; final class ConvertDiscussion extends ModalComponent @@ -21,7 +19,7 @@ public function save(): void $this->authorize('convertedToThread', $discussion); - $thread = app(ConvertDiscussionToThreadAction::class)->execute($discussion, Auth::user()->isAdmin()); + $thread = app(ConvertDiscussionToThreadAction::class)->execute($discussion); $this->redirectRoute('forum.show', $thread, navigate: true); } diff --git a/app/Notifications/ThreadConvertedByAdmin.php b/app/Notifications/ThreadConvertedByAdmin.php index efb076f8..723f5b97 100644 --- a/app/Notifications/ThreadConvertedByAdmin.php +++ b/app/Notifications/ThreadConvertedByAdmin.php @@ -31,7 +31,7 @@ public function via(object $notifiable): array public function toMail(object $notifiable): MailMessage { return (new MailMessage) - ->subject('Discussion Converted by Admin') + ->subject('pages/discussion.converted_by_admin') ->greeting('Hello!') ->line('An admin has converted a discussion to a thread.') ->line('Thread Title: '.$this->thread->title) diff --git a/app/Notifications/ThreadConvertedByCreator.php b/app/Notifications/ThreadConvertedByCreator.php index e9cd5661..5f0ebfc1 100644 --- a/app/Notifications/ThreadConvertedByCreator.php +++ b/app/Notifications/ThreadConvertedByCreator.php @@ -31,7 +31,7 @@ public function via(object $notifiable): array public function toMail(object $notifiable): MailMessage { return (new MailMessage) - ->subject(__('Discussion Converted to Thread')) + ->subject(__('pages/discussion.converted_by_creator')) ->line('A discussion you participated in has been converted to a thread.') ->line('Thread Title: '.$this->thread->title) ->action('View Thread', route('forum.show', $this->thread)) diff --git a/lang/en/actions.php b/lang/en/actions.php index 7d69eb4c..cf1432cc 100644 --- a/lang/en/actions.php +++ b/lang/en/actions.php @@ -12,5 +12,6 @@ 'save' => 'Save', 'ban' => 'Ban', 'unban' => 'Cancel ban', + 'confirm' => 'Confirm', ]; diff --git a/lang/en/pages/discutssion.php b/lang/en/pages/discussion.php similarity index 68% rename from lang/en/pages/discutssion.php rename to lang/en/pages/discussion.php index cc1551b9..bf7d8f65 100644 --- a/lang/en/pages/discutssion.php +++ b/lang/en/pages/discussion.php @@ -19,5 +19,10 @@ 'active' => 'Actif', ], 'comments_count' => 'Commentaires (:count)', + 'convert_to_thread' => 'Convert to thread', + 'confirm_conversion' => 'Confirm conversion', + 'text_confirmation' => 'Do you really want to turn this discussion into a topic?', + 'converted_by_creator' => 'Discussion Converted to Thread', + 'converted_by_admin' => 'Discussion Converted to Thread by the administrator', ]; diff --git a/lang/fr/actions.php b/lang/fr/actions.php index 7c13a7a7..3b1ab0a7 100644 --- a/lang/fr/actions.php +++ b/lang/fr/actions.php @@ -12,5 +12,6 @@ 'save' => 'Enregistrer', 'ban' => 'Bannir', 'unban' => 'Dé-bannir', + 'confirm' => 'Confirmer', ]; diff --git a/lang/fr/pages/discussion.php b/lang/fr/pages/discussion.php index cc1551b9..20aca5bb 100644 --- a/lang/fr/pages/discussion.php +++ b/lang/fr/pages/discussion.php @@ -19,5 +19,10 @@ 'active' => 'Actif', ], 'comments_count' => 'Commentaires (:count)', + 'convert_to_thread' => 'Convertir en sujet', + 'confirm_conversion' => 'Confirmez la conversion', + 'text_confirmation' => 'Voulez-vous vraiment transformer cette discussion en sujet de forum?', + 'converted_by_creator' => 'Discussion convertie en sujet par le createur', + 'converted_by_admin' => 'Discussion convertie en sujet par l\'administrateur', ]; diff --git a/resources/views/livewire/modals/convert-discussion.blade.php b/resources/views/livewire/modals/convert-discussion.blade.php index ae92c468..eca541c5 100644 --- a/resources/views/livewire/modals/convert-discussion.blade.php +++ b/resources/views/livewire/modals/convert-discussion.blade.php @@ -5,14 +5,14 @@ form-action="save" > - {{ __("Confirmez la convertion") }} + {{ __("pages/discussion.confirm_conversion") }}
- {{ __("Voulez-vous vraiment convertir cette discussion en thread ?") }} + {{ __("pages/discussion.text_confirmation") }}
@@ -20,7 +20,7 @@ @@ -29,7 +29,7 @@ class="w-full sm:ml-3 sm:w-auto" wire:click="$dispatch('closeModal')" class="w-full px-4 py-2 mt-3 text-sm sm:mt-0 sm:w-auto" > - {{ __('Annuler') }} + {{ __('action.cancel') }} diff --git a/resources/views/livewire/pages/discussions/single-discussion.blade.php b/resources/views/livewire/pages/discussions/single-discussion.blade.php index bd935554..fdab793c 100644 --- a/resources/views/livewire/pages/discussions/single-discussion.blade.php +++ b/resources/views/livewire/pages/discussions/single-discussion.blade.php @@ -97,7 +97,7 @@ class="mx-auto mt-6 text-sm prose prose-sm prose-green max-w-none dark:prose-inv href="{{ route('discussions.edit', $discussion) }}" class="text-sm leading-5 text-gray-500 dark:text-gray-400 hover:underline focus:outline-none" > - {{ __('Éditer') }} + {{ __('action.edit') }} · @can('convertedToThread', $discussion) · @@ -113,7 +113,8 @@ class="text-sm leading-5 text-red-500 hover:underline focus:outline-none" onclick="Livewire.dispatch('openModal', {component: 'modals.convert-discussion', arguments: { discussionId: {{ $discussion->id }} }})" class="text-sm leading-5 text-gray-500 dark:text-gray-400 hover:underline focus:outline-none" > - {{ __('Convertir en Thread') }} + {{ __('pages/discussion.convert_to_thread') }} + {{ __('pages/home.description') }} @endcan
diff --git a/tests/Feature/Actions/Discussion/ConvertDiscussionToThreadActionTest.php b/tests/Feature/Actions/Discussion/ConvertDiscussionToThreadActionTest.php index 8b0a1553..8d052fd6 100644 --- a/tests/Feature/Actions/Discussion/ConvertDiscussionToThreadActionTest.php +++ b/tests/Feature/Actions/Discussion/ConvertDiscussionToThreadActionTest.php @@ -6,13 +6,18 @@ use App\Models\Discussion; use App\Models\Reply; use App\Models\Thread; +use Illuminate\Support\Facades\Notification; +use Spatie\Permission\Models\Role; beforeEach(function (): void { - $this->discussion = Discussion::factory()->create(); + $this->user = $this->login(); + $this->discussion = Discussion::factory()->create(['user_id' => $this->user->id]); + Role::create(['name' => 'admin']); + Notification::fake(); }); describe(ConvertDiscussionToThreadAction::class, function (): void { - it('can converts a discussion to a thread', function (): void { + it('allows discussion author to convert his discussion to a forum topic', function (): void { $replies = Reply::factory()->count(3)->create([ 'replyable_type' => 'discussion', 'replyable_id' => $this->discussion->id, @@ -29,11 +34,22 @@ expect($updatedReply->replyable_type)->toBe('thread') ->and($updatedReply->replyable_id)->toBe($thread->id); }); + + Notification::assertCount(3); }); - it('can handles admin conversion', function (): void { - $thread = app(ConvertDiscussionToThreadAction::class)->execute(discussion: $this->discussion, isAdmin: true); + it('allows admin users to convert any discussion to a forum topic', function (): void { + $this->user->assignRole('admin'); + + Reply::factory()->count(3)->create([ + 'replyable_type' => 'discussion', + 'replyable_id' => $this->discussion->id, + ]); + + $thread = app(ConvertDiscussionToThreadAction::class)->execute(discussion: $this->discussion); expect($thread)->toBeInstanceOf(Thread::class); + + Notification::assertCount(4); }); }); diff --git a/tests/Feature/Livewire/Modal/ConvertDiscussionTest.php b/tests/Feature/Livewire/Modal/ConvertDiscussionTest.php index aecdad17..34363912 100644 --- a/tests/Feature/Livewire/Modal/ConvertDiscussionTest.php +++ b/tests/Feature/Livewire/Modal/ConvertDiscussionTest.php @@ -8,15 +8,16 @@ use Livewire\Livewire; beforeEach(function (): void { - $user = User::factory()->create(); - $this->user = $this->actingAs($user); - $this->discussion = Discussion::factory()->create(); + $this->user = $this->login(); }); describe(ConvertDiscussion::class, function (): void { - it('requires authorization to convert discussion', function (): void { + it('requires authorization for user to convert discussion', function (): void { + $user = User::factory()->create(); + $discussion = Discussion::factory()->create(['user_id' => $user->id]); + Livewire::test(ConvertDiscussion::class) - ->set('discussionId', $this->discussion->id) + ->set('discussionId', $discussion->id) ->call('save') ->assertForbidden(); }); From db25b23d018e2af74868b390a3787ae0bafc9325 Mon Sep 17 00:00:00 2001 From: Endaman Stevy Date: Fri, 13 Dec 2024 16:51:13 +0100 Subject: [PATCH 06/13] fix: (LAR-105) fixing stan error --- app/Livewire/Modals/ConvertDiscussion.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Livewire/Modals/ConvertDiscussion.php b/app/Livewire/Modals/ConvertDiscussion.php index c0620081..1ed52138 100644 --- a/app/Livewire/Modals/ConvertDiscussion.php +++ b/app/Livewire/Modals/ConvertDiscussion.php @@ -15,7 +15,8 @@ final class ConvertDiscussion extends ModalComponent public function save(): void { - $discussion = Discussion::findOrFail($this->discussionId); + /** @var Discussion $discussion */ + $discussion = Discussion::query()->findOrFail($this->discussionId); $this->authorize('convertedToThread', $discussion); From 63d3a1f13459028761eb21f901f35e8e36799959 Mon Sep 17 00:00:00 2001 From: Endaman Stevy Date: Fri, 13 Dec 2024 17:07:00 +0100 Subject: [PATCH 07/13] refact(lang):(LAR-105) refactoring lang discussion --- app/Notifications/ThreadConvertedByAdmin.php | 12 ++++++------ app/Notifications/ThreadConvertedByCreator.php | 8 ++++---- lang/en/pages/discussion.php | 17 +++++++++++++++-- lang/fr/pages/discussion.php | 17 +++++++++++++++-- 4 files changed, 40 insertions(+), 14 deletions(-) diff --git a/app/Notifications/ThreadConvertedByAdmin.php b/app/Notifications/ThreadConvertedByAdmin.php index 723f5b97..dc84cda4 100644 --- a/app/Notifications/ThreadConvertedByAdmin.php +++ b/app/Notifications/ThreadConvertedByAdmin.php @@ -31,11 +31,11 @@ public function via(object $notifiable): array public function toMail(object $notifiable): MailMessage { return (new MailMessage) - ->subject('pages/discussion.converted_by_admin') - ->greeting('Hello!') - ->line('An admin has converted a discussion to a thread.') - ->line('Thread Title: '.$this->thread->title) - ->action('View Thread', route('forum.show', $this->thread)) - ->line('This action was performed by an administrator.'); + ->subject(__('pages/discussion.converted_by_admin.subject')) + ->greeting(__('pages/discussion.converted_by_admin.greeting')) + ->line(__('pages/discussion.converted_by_admin.converted_line')) + ->line(__('pages/discussion.converted_by_admin.thread_title').$this->thread->title) + ->action(__('pages/discussion.converted_by_admin.action_text'), route('forum.show', $this->thread)) + ->line(__('pages/discussion.converted_by_admin.admin_action_line')); } } diff --git a/app/Notifications/ThreadConvertedByCreator.php b/app/Notifications/ThreadConvertedByCreator.php index 5f0ebfc1..970429c4 100644 --- a/app/Notifications/ThreadConvertedByCreator.php +++ b/app/Notifications/ThreadConvertedByCreator.php @@ -32,9 +32,9 @@ public function toMail(object $notifiable): MailMessage { return (new MailMessage) ->subject(__('pages/discussion.converted_by_creator')) - ->line('A discussion you participated in has been converted to a thread.') - ->line('Thread Title: '.$this->thread->title) - ->action('View Thread', route('forum.show', $this->thread)) - ->line('Thank you for your participation!'); + ->line(__('pages/discussion.converted_by_creator.converted_line')) + ->line(__('pages/discussion.converted_by_creator.thread_title') . $this->thread->title) + ->action(__('pages/discussion.converted_by_creator.action_text'), route('forum.show', $this->thread)) + ->line(__('pages/discussion.converted_by_creator.thank_you_line')); } } diff --git a/lang/en/pages/discussion.php b/lang/en/pages/discussion.php index bf7d8f65..8d3af371 100644 --- a/lang/en/pages/discussion.php +++ b/lang/en/pages/discussion.php @@ -22,7 +22,20 @@ 'convert_to_thread' => 'Convert to thread', 'confirm_conversion' => 'Confirm conversion', 'text_confirmation' => 'Do you really want to turn this discussion into a topic?', - 'converted_by_creator' => 'Discussion Converted to Thread', - 'converted_by_admin' => 'Discussion Converted to Thread by the administrator', + 'converted_by_admin' => [ + 'subject' => 'Discussion Converted to Thread by the administrator', + 'greeting' => 'Hello!', + 'converted_line' => 'An admin has converted a discussion to a thread.', + 'thread_title' => 'Thread Title: ', + 'action_text' => 'View Thread', + 'admin_action_line' => 'This action was performed by an administrator.', + ], + 'converted_by_creator' => [ + 'subject' => 'Discussion Converted to Thread', + 'converted_line' => 'A discussion you participated in has been converted to a thread.', + 'thread_title' => 'Thread Title: ', + 'action_text' => 'View Thread', + 'thank_you_line' => 'Thank you for your participation!' + ], ]; diff --git a/lang/fr/pages/discussion.php b/lang/fr/pages/discussion.php index 20aca5bb..e795796b 100644 --- a/lang/fr/pages/discussion.php +++ b/lang/fr/pages/discussion.php @@ -22,7 +22,20 @@ 'convert_to_thread' => 'Convertir en sujet', 'confirm_conversion' => 'Confirmez la conversion', 'text_confirmation' => 'Voulez-vous vraiment transformer cette discussion en sujet de forum?', - 'converted_by_creator' => 'Discussion convertie en sujet par le createur', - 'converted_by_admin' => 'Discussion convertie en sujet par l\'administrateur', + 'converted_by_admin' => [ + 'subject' => 'Discussion convertie en sujet par l\'administrateur', + 'greeting' => 'Bonjour !', + 'converted_line' => 'Un administrateur a converti votre discussion en sujet de forum.', + 'thread_title' => 'Titre du sujet : ', + 'action_text' => 'Voir le sujet', + 'admin_action_line' => 'Cette action a été effectuée par un administrateur.', + ], + 'converted_by_creator' => [ + 'subject' => 'Discussion convertie en sujet par le createur', + 'converted_line' => 'Une discussion à laquelle vous avez participé a été convertie en fil de discussion.', + 'thread_title' => 'Titre du fil : ', + 'action_text' => 'Voir le fil', + 'thank_you_line' => 'Merci pour votre participation !' + ], ]; From 2626d99ceca5f5f7ae48eaa380e0bcee8d99ae46 Mon Sep 17 00:00:00 2001 From: Endaman Stevy Date: Fri, 13 Dec 2024 17:10:20 +0100 Subject: [PATCH 08/13] fix: (LAR-105) fixing style lint --- app/Notifications/ThreadConvertedByCreator.php | 2 +- lang/en/pages/discussion.php | 2 +- lang/fr/pages/discussion.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Notifications/ThreadConvertedByCreator.php b/app/Notifications/ThreadConvertedByCreator.php index 970429c4..89eb7b66 100644 --- a/app/Notifications/ThreadConvertedByCreator.php +++ b/app/Notifications/ThreadConvertedByCreator.php @@ -33,7 +33,7 @@ public function toMail(object $notifiable): MailMessage return (new MailMessage) ->subject(__('pages/discussion.converted_by_creator')) ->line(__('pages/discussion.converted_by_creator.converted_line')) - ->line(__('pages/discussion.converted_by_creator.thread_title') . $this->thread->title) + ->line(__('pages/discussion.converted_by_creator.thread_title').$this->thread->title) ->action(__('pages/discussion.converted_by_creator.action_text'), route('forum.show', $this->thread)) ->line(__('pages/discussion.converted_by_creator.thank_you_line')); } diff --git a/lang/en/pages/discussion.php b/lang/en/pages/discussion.php index 8d3af371..a263b708 100644 --- a/lang/en/pages/discussion.php +++ b/lang/en/pages/discussion.php @@ -35,7 +35,7 @@ 'converted_line' => 'A discussion you participated in has been converted to a thread.', 'thread_title' => 'Thread Title: ', 'action_text' => 'View Thread', - 'thank_you_line' => 'Thank you for your participation!' + 'thank_you_line' => 'Thank you for your participation!', ], ]; diff --git a/lang/fr/pages/discussion.php b/lang/fr/pages/discussion.php index e795796b..1e6d0f7a 100644 --- a/lang/fr/pages/discussion.php +++ b/lang/fr/pages/discussion.php @@ -35,7 +35,7 @@ 'converted_line' => 'Une discussion à laquelle vous avez participé a été convertie en fil de discussion.', 'thread_title' => 'Titre du fil : ', 'action_text' => 'Voir le fil', - 'thank_you_line' => 'Merci pour votre participation !' + 'thank_you_line' => 'Merci pour votre participation !', ], ]; From 2ab09803b6ee45f1c4ad1cfe6a235c16f373b1ad Mon Sep 17 00:00:00 2001 From: Endaman Stevy Date: Fri, 13 Dec 2024 17:21:51 +0100 Subject: [PATCH 09/13] refact: (LAR-105) refactoring style --- resources/views/livewire/modals/convert-discussion.blade.php | 4 ++-- .../livewire/pages/discussions/single-discussion.blade.php | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/views/livewire/modals/convert-discussion.blade.php b/resources/views/livewire/modals/convert-discussion.blade.php index eca541c5..82340bcb 100644 --- a/resources/views/livewire/modals/convert-discussion.blade.php +++ b/resources/views/livewire/modals/convert-discussion.blade.php @@ -20,7 +20,7 @@ @@ -29,7 +29,7 @@ class="w-full sm:ml-3 sm:w-auto" wire:click="$dispatch('closeModal')" class="w-full px-4 py-2 mt-3 text-sm sm:mt-0 sm:w-auto" > - {{ __('action.cancel') }} + {{ __('actions.cancel') }} diff --git a/resources/views/livewire/pages/discussions/single-discussion.blade.php b/resources/views/livewire/pages/discussions/single-discussion.blade.php index fdab793c..4119d8a2 100644 --- a/resources/views/livewire/pages/discussions/single-discussion.blade.php +++ b/resources/views/livewire/pages/discussions/single-discussion.blade.php @@ -114,7 +114,6 @@ class="text-sm leading-5 text-red-500 hover:underline focus:outline-none" class="text-sm leading-5 text-gray-500 dark:text-gray-400 hover:underline focus:outline-none" > {{ __('pages/discussion.convert_to_thread') }} - {{ __('pages/home.description') }} @endcan
From d0f95007e5e69c7a2e5c3df1cff84bf3bd45cec0 Mon Sep 17 00:00:00 2001 From: Endaman Stevy Date: Sat, 14 Dec 2024 20:11:57 +0100 Subject: [PATCH 10/13] fix(phpstan):(LAR-105) fixing phpstan error --- app/Filament/Resources/ArticleResource.php | 2 +- .../Resources/ArticleResource/Pages/ListArticles.php | 2 +- app/Filament/Resources/ChannelResource.php | 2 +- app/Filament/Resources/DiscussionResource.php | 2 +- app/Filament/Resources/TagResource.php | 2 +- app/Filament/Resources/UserResource.php | 2 +- app/Livewire/Components/Forum/ReplyForm.php | 2 +- app/Livewire/Modals/Unsplash.php | 2 +- app/Mail/NewReplyEmail.php | 1 - app/Models/Discussion.php | 1 + app/Models/User.php | 9 +++++---- app/Policies/NotificationPolicy.php | 2 +- app/Spotlight/Article.php | 2 +- app/Spotlight/Discussion.php | 2 +- app/Spotlight/Sujet.php | 2 +- app/Spotlight/User.php | 2 +- app/Traits/HasReplies.php | 2 +- app/Traits/HasSocialite.php | 3 +++ app/Traits/UserResponse.php | 3 +++ 19 files changed, 26 insertions(+), 19 deletions(-) diff --git a/app/Filament/Resources/ArticleResource.php b/app/Filament/Resources/ArticleResource.php index a5ea0ba5..e66a284c 100644 --- a/app/Filament/Resources/ArticleResource.php +++ b/app/Filament/Resources/ArticleResource.php @@ -25,7 +25,7 @@ final class ArticleResource extends Resource protected static ?string $navigationIcon = 'heroicon-o-newspaper'; - public static function getNavigationGroup(): ?string + public static function getNavigationGroup(): string { return __('Contenu'); } diff --git a/app/Filament/Resources/ArticleResource/Pages/ListArticles.php b/app/Filament/Resources/ArticleResource/Pages/ListArticles.php index 4341d4ed..a793cae9 100644 --- a/app/Filament/Resources/ArticleResource/Pages/ListArticles.php +++ b/app/Filament/Resources/ArticleResource/Pages/ListArticles.php @@ -13,7 +13,7 @@ final class ListArticles extends ListRecords { protected static string $resource = ArticleResource::class; - public function isTableRecordSelectable(): ?Closure + public function isTableRecordSelectable(): Closure { return fn (Article $record): bool => $record->isNotPublished(); } diff --git a/app/Filament/Resources/ChannelResource.php b/app/Filament/Resources/ChannelResource.php index 9f967ba5..4706efb7 100644 --- a/app/Filament/Resources/ChannelResource.php +++ b/app/Filament/Resources/ChannelResource.php @@ -23,7 +23,7 @@ final class ChannelResource extends Resource protected static ?string $navigationIcon = 'untitledui-git-branch'; - public static function getNavigationGroup(): ?string + public static function getNavigationGroup(): string { return __('Forum'); } diff --git a/app/Filament/Resources/DiscussionResource.php b/app/Filament/Resources/DiscussionResource.php index 99ab6fd0..3f68d24b 100644 --- a/app/Filament/Resources/DiscussionResource.php +++ b/app/Filament/Resources/DiscussionResource.php @@ -18,7 +18,7 @@ final class DiscussionResource extends Resource protected static ?string $navigationIcon = 'untitledui-message-chat-square'; - public static function getNavigationGroup(): ?string + public static function getNavigationGroup(): string { return __('Contenu'); } diff --git a/app/Filament/Resources/TagResource.php b/app/Filament/Resources/TagResource.php index a77dc3f4..e7950e84 100644 --- a/app/Filament/Resources/TagResource.php +++ b/app/Filament/Resources/TagResource.php @@ -20,7 +20,7 @@ final class TagResource extends Resource protected static ?string $navigationIcon = 'untitledui-tag-03'; - public static function getNavigationGroup(): ?string + public static function getNavigationGroup(): string { return __('Contenu'); } diff --git a/app/Filament/Resources/UserResource.php b/app/Filament/Resources/UserResource.php index ca29f1c8..11a77cbc 100644 --- a/app/Filament/Resources/UserResource.php +++ b/app/Filament/Resources/UserResource.php @@ -23,7 +23,7 @@ final class UserResource extends Resource protected static ?string $navigationIcon = 'untitledui-users-02'; - public static function getNavigationGroup(): ?string + public static function getNavigationGroup(): string { return __('Management'); } diff --git a/app/Livewire/Components/Forum/ReplyForm.php b/app/Livewire/Components/Forum/ReplyForm.php index 82731778..56814e2f 100644 --- a/app/Livewire/Components/Forum/ReplyForm.php +++ b/app/Livewire/Components/Forum/ReplyForm.php @@ -41,7 +41,7 @@ public function open(?int $replyId = null): void { $this->reply = Reply::query()->find($replyId); - $this->form->fill(['body' => $this->reply?->body ?? '']); + $this->form->fill(['body' => $this->reply->body ?? '']); $this->show = true; } diff --git a/app/Livewire/Modals/Unsplash.php b/app/Livewire/Modals/Unsplash.php index 3fb57808..142f066a 100644 --- a/app/Livewire/Modals/Unsplash.php +++ b/app/Livewire/Modals/Unsplash.php @@ -20,6 +20,6 @@ public static function modalMaxWidth(): string public function render(): View { - return view('livewire.modals.unsplash'); + return view('livewire.modals.unsplash'); // @phpstan-ignore-line } } diff --git a/app/Mail/NewReplyEmail.php b/app/Mail/NewReplyEmail.php index 6f8cde7e..a71402f6 100644 --- a/app/Mail/NewReplyEmail.php +++ b/app/Mail/NewReplyEmail.php @@ -21,7 +21,6 @@ public function __construct( public function build(): self { - // @phpstan-ignore-next-line return $this->subject("Re: {$this->reply->replyAble->subject()}") ->markdown('emails.new_reply'); } diff --git a/app/Models/Discussion.php b/app/Models/Discussion.php index a2fded4f..2a293e42 100644 --- a/app/Models/Discussion.php +++ b/app/Models/Discussion.php @@ -68,6 +68,7 @@ final class Discussion extends Model implements ReactableInterface, ReplyInterfa ]; protected $appends = [ + // @phpstan-ignore-next-line 'count_all_replies_with_child', ]; diff --git a/app/Models/User.php b/app/Models/User.php index d2bffbb1..83aed4b8 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -105,7 +105,7 @@ final class User extends Authenticatable implements FilamentUser, HasAvatar, Has public function hasProvider(string $provider): bool { foreach ($this->providers as $p) { - if ($p->provider === $provider) { + if ($p->provider === $provider) { // @phpstan-ignore-line return true; } } @@ -183,7 +183,7 @@ public function getFilamentAvatarUrl(): ?string } /** - * @return array{name: string, username: string, picture: string} + * @return array{name: string, username: string, picture: string|null} */ public function profile(): array { @@ -343,6 +343,7 @@ public function hasPassword(): bool { $password = $this->getAuthPassword(); + // @phpstan-ignore-next-line return $password !== '' && $password !== null; } @@ -382,12 +383,12 @@ public function countReplies(): int public function countSolutions(): int { - return $this->replyAble()->isSolution()->count(); + return $this->replyAble()->isSolution()->count(); // @phpstan-ignore-line } public function countArticles(): int { - return $this->articles()->approved()->count(); + return $this->articles()->approved()->count(); // @phpstan-ignore-line } public function countDiscussions(): int diff --git a/app/Policies/NotificationPolicy.php b/app/Policies/NotificationPolicy.php index fcea43cb..bdcd5c2b 100644 --- a/app/Policies/NotificationPolicy.php +++ b/app/Policies/NotificationPolicy.php @@ -16,6 +16,6 @@ final class NotificationPolicy public function markAsRead(User $user, DatabaseNotification $notification): bool { - return $notification->notifiable->is($user); // @phpstan-ignore-line + return $notification->notifiable->is($user); } } diff --git a/app/Spotlight/Article.php b/app/Spotlight/Article.php index e679c217..8a3adbb6 100644 --- a/app/Spotlight/Article.php +++ b/app/Spotlight/Article.php @@ -20,7 +20,7 @@ final class Article extends SpotlightCommand protected array $synonyms = []; - public function dependencies(): ?SpotlightCommandDependencies + public function dependencies(): SpotlightCommandDependencies { return SpotlightCommandDependencies::collection() ->add( diff --git a/app/Spotlight/Discussion.php b/app/Spotlight/Discussion.php index 5d1ab8f3..d5b11292 100644 --- a/app/Spotlight/Discussion.php +++ b/app/Spotlight/Discussion.php @@ -20,7 +20,7 @@ final class Discussion extends SpotlightCommand protected array $synonyms = []; - public function dependencies(): ?SpotlightCommandDependencies + public function dependencies(): SpotlightCommandDependencies { return SpotlightCommandDependencies::collection() ->add( diff --git a/app/Spotlight/Sujet.php b/app/Spotlight/Sujet.php index 2cf9aafb..9703a0f8 100644 --- a/app/Spotlight/Sujet.php +++ b/app/Spotlight/Sujet.php @@ -25,7 +25,7 @@ final class Sujet extends SpotlightCommand 'thread', ]; - public function dependencies(): ?SpotlightCommandDependencies + public function dependencies(): SpotlightCommandDependencies { return SpotlightCommandDependencies::collection() ->add( diff --git a/app/Spotlight/User.php b/app/Spotlight/User.php index 454be24b..6a12fb4f 100644 --- a/app/Spotlight/User.php +++ b/app/Spotlight/User.php @@ -20,7 +20,7 @@ final class User extends SpotlightCommand protected array $synonyms = []; - public function dependencies(): ?SpotlightCommandDependencies + public function dependencies(): SpotlightCommandDependencies { return SpotlightCommandDependencies::collection() ->add( diff --git a/app/Traits/HasReplies.php b/app/Traits/HasReplies.php index b0ae2289..68e692d3 100644 --- a/app/Traits/HasReplies.php +++ b/app/Traits/HasReplies.php @@ -54,7 +54,7 @@ public function isConversationOld(): bool $sixMonthsAgo = now()->subMonths(6); if ($reply = $this->replies()->latest()->first()) { - /** @var $reply Reply */ + /** @var Reply $reply */ return $reply->created_at->lt($sixMonthsAgo); } diff --git a/app/Traits/HasSocialite.php b/app/Traits/HasSocialite.php index 700324ac..64eea203 100644 --- a/app/Traits/HasSocialite.php +++ b/app/Traits/HasSocialite.php @@ -8,6 +8,9 @@ use Laravel\Socialite\Contracts\User; use Laravel\Socialite\Facades\Socialite; +/** + * @phpstan-ignore trait.unused + */ trait HasSocialite { /** diff --git a/app/Traits/UserResponse.php b/app/Traits/UserResponse.php index 31de80f9..e075c99f 100644 --- a/app/Traits/UserResponse.php +++ b/app/Traits/UserResponse.php @@ -8,6 +8,9 @@ use App\Http\Resources\EnterpriseResource; use App\Models\User; +/** + * @phpstan-ignore trait.unused + */ trait UserResponse { /** From 4277e953690016434f33c8aebd1e601acb4b0044 Mon Sep 17 00:00:00 2001 From: Endaman Stevy Date: Sat, 14 Dec 2024 20:19:47 +0100 Subject: [PATCH 11/13] fix(phpstan):(LAR-105) fixing phpstan error --- app/Livewire/Modals/Unsplash.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Livewire/Modals/Unsplash.php b/app/Livewire/Modals/Unsplash.php index 142f066a..3fb57808 100644 --- a/app/Livewire/Modals/Unsplash.php +++ b/app/Livewire/Modals/Unsplash.php @@ -20,6 +20,6 @@ public static function modalMaxWidth(): string public function render(): View { - return view('livewire.modals.unsplash'); // @phpstan-ignore-line + return view('livewire.modals.unsplash'); } } From 07402a1c86e2c183c6ee8f83e0783b923cd46c71 Mon Sep 17 00:00:00 2001 From: Endaman Stevy Date: Sat, 14 Dec 2024 20:32:04 +0100 Subject: [PATCH 12/13] fix(phpstan):(LAR-105) fixing phpstan error on User model --- app/Livewire/Modals/Unsplash.php | 2 +- app/Models/User.php | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/Livewire/Modals/Unsplash.php b/app/Livewire/Modals/Unsplash.php index 3fb57808..142f066a 100644 --- a/app/Livewire/Modals/Unsplash.php +++ b/app/Livewire/Modals/Unsplash.php @@ -20,6 +20,6 @@ public static function modalMaxWidth(): string public function render(): View { - return view('livewire.modals.unsplash'); + return view('livewire.modals.unsplash'); // @phpstan-ignore-line } } diff --git a/app/Models/User.php b/app/Models/User.php index 83aed4b8..6f188bcc 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -102,10 +102,14 @@ final class User extends Authenticatable implements FilamentUser, HasAvatar, Has 'settings' => 'array', ]; + /** + * @param string $provider + * @return bool + */ public function hasProvider(string $provider): bool { foreach ($this->providers as $p) { - if ($p->provider === $provider) { // @phpstan-ignore-line + if ($p->provider === $provider) { return true; } } From b14aaea81a20d54b4901c4baec369fd7e0e77866 Mon Sep 17 00:00:00 2001 From: Endaman Stevy Date: Sat, 14 Dec 2024 20:33:44 +0100 Subject: [PATCH 13/13] fix(pint):(LAR-105) fixing lint error on User model --- app/Models/User.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/Models/User.php b/app/Models/User.php index 6f188bcc..2be01392 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -102,10 +102,6 @@ final class User extends Authenticatable implements FilamentUser, HasAvatar, Has 'settings' => 'array', ]; - /** - * @param string $provider - * @return bool - */ public function hasProvider(string $provider): bool { foreach ($this->providers as $p) {