Skip to content

Commit cb09517

Browse files
committed
feat: sending notification after creation of a discussion
1 parent b723494 commit cb09517

File tree

23 files changed

+3300
-1900
lines changed

23 files changed

+3300
-1900
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ composer.phar
1515

1616
# Laravel Exclude
1717
#
18+
/.phpunit.cache
1819
.phpunit.result.cache
1920
/public/build
2021
/public/hot

.phpunit.cache/test-results

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Actions\Discussion;
6+
7+
use App\Data\Discussion\CreateDiscussionData;
8+
use App\Gamify\Points\DiscussionCreated;
9+
use App\Models\Discussion;
10+
use App\Notifications\PostDiscussionToTelegram;
11+
use Illuminate\Support\Facades\Auth;
12+
13+
final class CreateDiscussionAction
14+
{
15+
public function execute(CreateDiscussionData $discussionData): Discussion
16+
{
17+
/** @var Discussion $discussion */
18+
$discussion = Discussion::query()->create([
19+
'title' => $discussionData->title,
20+
'slug' => $discussionData->title,
21+
'body' => $discussionData->body,
22+
'user_id' => Auth::id(),
23+
]);
24+
25+
if (collect($discussionData->tags)->isNotEmpty()) {
26+
$discussion->syncTags($discussionData->tags);
27+
}
28+
29+
givePoint(new DiscussionCreated($discussion));
30+
31+
Auth::user()?->notify(new PostDiscussionToTelegram($discussion));
32+
33+
return $discussion;
34+
}
35+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Data\Discussion;
6+
7+
use Spatie\LaravelData\Data;
8+
9+
final class CreateDiscussionData extends Data
10+
{
11+
public function __construct(
12+
public string $title,
13+
public string $body,
14+
public array $tags = [],
15+
) {}
16+
}

app/Livewire/Discussions/Create.php

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,26 @@
44

55
namespace App\Livewire\Discussions;
66

7-
use App\Gamify\Points\DiscussionCreated;
8-
use App\Models\Discussion;
7+
use App\Actions\Discussion\CreateDiscussionAction;
8+
use App\Data\Discussion\CreateDiscussionData;
99
use App\Models\Tag;
10-
use App\Notifications\PostDiscussionToTelegram;
1110
use App\Traits\WithTagsAssociation;
1211
use Illuminate\Contracts\View\View;
13-
use Illuminate\Support\Facades\Auth;
12+
use Livewire\Attributes\On;
13+
use Livewire\Attributes\Validate;
1414
use Livewire\Component;
1515

1616
final class Create extends Component
1717
{
1818
use WithTagsAssociation;
1919

20+
#[Validate('required')]
2021
public string $title = '';
2122

23+
#[Validate('required')]
2224
public string $body = '';
2325

24-
/**
25-
* @var string[]
26-
*/
27-
protected $listeners = ['markdown-x:update' => 'onMarkdownUpdate'];
28-
29-
/**
30-
* @var array<string, string[]|string>
31-
*/
32-
protected $rules = [
33-
'title' => ['required', 'max:150'],
34-
'body' => ['required'],
35-
'tags_selected' => 'nullable|array',
36-
];
37-
26+
#[On('markdown-x:update')]
3827
public function onMarkdownUpdate(string $content): void
3928
{
4029
$this->body = $content;
@@ -44,24 +33,13 @@ public function store(): void
4433
{
4534
$this->validate();
4635

47-
$discussion = Discussion::create([
36+
$discussion = app(CreateDiscussionAction::class)->execute(CreateDiscussionData::from([
4837
'title' => $this->title,
49-
'slug' => $this->title,
5038
'body' => $this->body,
51-
'user_id' => Auth::id(),
52-
]);
53-
54-
if (collect($this->associateTags)->isNotEmpty()) {
55-
$discussion->syncTags($this->associateTags);
56-
}
57-
58-
givePoint(new DiscussionCreated($discussion));
59-
60-
if (app()->environment('production')) {
61-
Auth::user()->notify(new PostDiscussionToTelegram($discussion)); // @phpstan-ignore-line
62-
}
39+
'tags' => $this->associateTags,
40+
]));
6341

64-
$this->redirectRoute('discussions.show', $discussion);
42+
$this->redirectRoute('discussions.show', $discussion, navigate: true);
6543
}
6644

6745
public function render(): View

app/Models/Discussion.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,15 @@
2222
use Illuminate\Support\Str;
2323

2424
/**
25-
* @mixin IdeHelperDiscussion
25+
* @property int $id
26+
* @property int $user_id
27+
* @property string $title
28+
* @property string $slug
29+
* @property string $body
30+
* @property bool $is_pinned
31+
* @property bool $locked
32+
* @property \Illuminate\Support\Carbon|null $created_at
33+
* @property \Illuminate\Support\Carbon|null $updated_at
2634
*/
2735
final class Discussion extends Model implements ReactableInterface, ReplyInterface, SubscribeInterface, Viewable
2836
{

app/Traits/WithTagsAssociation.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44

55
namespace App\Traits;
66

7+
use Livewire\Attributes\Validate;
8+
79
trait WithTagsAssociation
810
{
911
/**
1012
* @var array<string, string>
1113
*/
14+
#[Validate('nullable|array')]
1215
public array $tags_selected = [];
1316

1417
/**

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
"ramsey/uuid": "^4.7.4",
3939
"sentry/sentry-laravel": "^3.7",
4040
"socialiteproviders/twitter": "^4.1.2",
41+
"spatie/laravel-data": "^4.10",
4142
"spatie/laravel-feed": "^4.2.1",
4243
"spatie/laravel-google-fonts": "^1.2.3",
4344
"spatie/laravel-medialibrary": "^10.10.0",

0 commit comments

Comments
 (0)