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) {