Skip to content

Commit 24f11cf

Browse files
mckenzieartsdependabot[bot]StevyMarlinogithub-actions[bot]
authored
MEP > merge develop into main (#355)
Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Endaman Stevy <[email protected]> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Stevy Endaman <[email protected]>
1 parent 6426bd5 commit 24f11cf

22 files changed

+1569
-110
lines changed

.github/workflows/dependabot-auto-merge.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313

1414
- name: Dependabot metadata
1515
id: metadata
16-
uses: dependabot/fetch-metadata@v2.2.0
16+
uses: dependabot/fetch-metadata@v2.3.0
1717
with:
1818
github-token: "${{ secrets.GITHUB_TOKEN }}"
1919
- name: Auto-merge Dependabot PRs for semver-minor updates

app/Actions/Article/CreateArticleAction.php

+21-1
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,35 @@ public function execute(ArticleData $articleData): Article
2727
);
2828
}
2929

30+
$user = Auth::user();
31+
32+
if ($user->isAdmin() || $user->isModerator()) {
33+
$articleData->published_at = new Carbon(
34+
time: today(),
35+
timezone: config('app.timezone')
36+
);
37+
38+
$articleData->submitted_at = new Carbon(
39+
time: $articleData->submitted_at,
40+
timezone: config('app.timezone')
41+
);
42+
43+
$articleData->approved_at = new Carbon(
44+
time: today(),
45+
timezone: config('app.timezone')
46+
);
47+
}
48+
3049
// @phpstan-ignore-next-line
3150
return Article::query()->create([
3251
'title' => $articleData->title,
3352
'slug' => $articleData->slug,
3453
'body' => $articleData->body,
3554
'published_at' => $articleData->published_at,
3655
'submitted_at' => $articleData->submitted_at,
56+
'approved_at' => $articleData->approved_at,
3757
'canonical_url' => $articleData->canonical_url,
38-
'user_id' => Auth::id(),
58+
'user_id' => $user->id,
3959
]);
4060
}
4161
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Actions\Article;
6+
7+
use App\Models\Article;
8+
use App\Notifications\ArticleDeclinedNotification;
9+
use Carbon\Carbon;
10+
use Illuminate\Support\Facades\DB;
11+
12+
final class DeclineArticleAction
13+
{
14+
public function execute(string $reason, Article $article): Article
15+
{
16+
return DB::transaction(function () use ($reason, $article) {
17+
18+
$article->update([
19+
'declined_at' => Carbon::now(),
20+
'reason' => $reason,
21+
'submitted_at' => null,
22+
]);
23+
24+
$article->user->notify(new ArticleDeclinedNotification($article));
25+
26+
$article->refresh();
27+
28+
return $article;
29+
});
30+
}
31+
}

app/Actions/Article/UpdateArticleAction.php

+4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ public function execute(ArticleData $articleData, Article $article): Article
3131
);
3232
}
3333

34+
if ($articleData->declined_at) {
35+
$articleData->declined_at = null;
36+
}
37+
3438
$article->update($articleData->toArray());
3539

3640
$article->refresh();

app/Data/ArticleData.php

+2
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,7 @@ public function __construct(
1717
public ?string $canonical_url = null,
1818
public ?Carbon $published_at = null,
1919
public ?Carbon $submitted_at = null,
20+
public ?Carbon $declined_at = null,
21+
public ?Carbon $approved_at = null,
2022
) {}
2123
}

app/Filament/Resources/ArticleResource.php

+20-6
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
namespace App\Filament\Resources;
66

77
use App\Actions\Article\ApprovedArticleAction;
8+
use App\Actions\Article\DeclineArticleAction;
89
use App\Filament\Resources\ArticleResource\Pages;
910
use App\Models\Article;
1011
use Awcodes\FilamentBadgeableColumn\Components\Badge;
1112
use Awcodes\FilamentBadgeableColumn\Components\BadgeableColumn;
13+
use Filament\Forms\Components\Textarea;
14+
use Filament\Notifications\Notification;
1215
use Filament\Resources\Resource;
1316
use Filament\Support\Enums\MaxWidth;
1417
use Filament\Tables;
@@ -99,7 +102,6 @@ public static function table(Table $table): Table
99102

100103
return '';
101104
})
102-
->searchable()
103105
->sortable(),
104106
])
105107
->actions([
@@ -123,15 +125,27 @@ public static function table(Table $table): Table
123125
->label('Décliner')
124126
->icon('heroicon-s-x-mark')
125127
->color('warning')
126-
->modalHeading(__('Voulez vous décliner cet article'))
127-
->successNotificationTitle(__('Opération effectuée avec succès'))
128+
->form([
129+
Textarea::make('reason')
130+
->label(__('Raison du refus'))
131+
->maxLength(255)
132+
->required(),
133+
])
134+
->modalHeading('Décliner l\'article')
135+
->modalDescription('Veuillez fournir une raison détaillée pour le refus de cet article. L\'auteur recevra cette explication.')
136+
->successNotificationTitle('Article décliné avec succès')
128137
->requiresConfirmation()
129138
->modalIcon('heroicon-s-x-mark')
130-
->action(function ($record): void {
139+
->action(function (array $data, Article $record): void {
131140
Gate::authorize('decline', $record);
132141

133-
$record->declined_at = now();
134-
$record->save();
142+
app(DeclineArticleAction::class)->execute($data['reason'], $record);
143+
144+
Notification::make()
145+
->title('Article décliné')
146+
->body('L\'auteur a été notifié de la raison du refus.')
147+
->success()
148+
->send();
135149
}),
136150
Tables\Actions\Action::make('show')
137151
->icon('untitledui-eye')

app/Filament/Resources/ArticleResource/Pages/ListArticles.php

+10
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use App\Filament\Resources\ArticleResource;
88
use App\Models\Article;
99
use Closure;
10+
use Filament\Resources\Components\Tab;
1011
use Filament\Resources\Pages\ListRecords;
1112

1213
final class ListArticles extends ListRecords
@@ -17,4 +18,13 @@ public function isTableRecordSelectable(): Closure
1718
{
1819
return fn (Article $record): bool => $record->isNotPublished();
1920
}
21+
22+
public function getTabs(): array
23+
{
24+
return [
25+
'En attente' => Tab::make()->query(fn ($query) => $query->awaitingApproval()),
26+
'Apprové' => Tab::make()->query(fn ($query) => $query->published()),
27+
'Décliné' => Tab::make()->query(fn ($query) => $query->declined()),
28+
];
29+
}
2030
}

app/Models/Article.php

+2
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
* @property bool $is_pinned
3333
* @property int $is_sponsored
3434
* @property string | null $canonical_url
35+
* @property string | null $reason
3536
* @property int | null $tweet_id
3637
* @property int $user_id
3738
* @property string | null $locale
@@ -63,6 +64,7 @@ final class Article extends Model implements HasMedia, ReactableInterface, Sitem
6364
'body',
6465
'slug',
6566
'canonical_url',
67+
'reason',
6668
'show_toc',
6769
'is_pinned',
6870
'user_id',
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Notifications;
6+
7+
use App\Models\Article;
8+
use Illuminate\Bus\Queueable;
9+
use Illuminate\Notifications\Messages\MailMessage;
10+
use Illuminate\Notifications\Notification;
11+
12+
final class ArticleDeclinedNotification extends Notification
13+
{
14+
use Queueable;
15+
16+
public function __construct(public Article $article) {}
17+
18+
public function via(mixed $notifiable): array
19+
{
20+
return ['mail', 'database'];
21+
}
22+
23+
public function toMail(mixed $notifiable): MailMessage
24+
{
25+
return (new MailMessage)
26+
->subject(__('emails/article.article_declined.subject'))
27+
->markdown('emails.article_declined', ['article' => $this->article]);
28+
}
29+
30+
/**
31+
* @return array<string, mixed>
32+
*/
33+
public function toArray(): array
34+
{
35+
return [
36+
'article' => $this->article,
37+
'owner' => $this->article->user->name,
38+
'email' => $this->article->user->email,
39+
];
40+
}
41+
}

app/Providers/EventServiceProvider.php

-7
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,15 @@
99
use App\Events\CommentWasAdded;
1010
use App\Events\ReplyWasCreated;
1111
use App\Events\SponsoringPaymentInitialize;
12-
use App\Events\ThreadWasCreated;
1312
use App\Events\UserBannedEvent;
1413
use App\Events\UserUnbannedEvent;
1514
// use App\Listeners\SendCompanyEmailVerificationNotification;
1615
use App\Listeners\NotifyMentionedUsers;
17-
use App\Listeners\PostNewThreadNotification;
1816
use App\Listeners\SendBanNotificationListener;
1917
use App\Listeners\SendNewArticleNotification;
2018
use App\Listeners\SendNewCommentNotification;
2119
// use App\Listeners\SendWelcomeCompanyNotification;
2220
use App\Listeners\SendNewReplyNotification;
23-
use App\Listeners\SendNewThreadNotification;
2421
use App\Listeners\SendPaymentNotification;
2522
use App\Listeners\SendUnbanNotificationListener;
2623
use App\Listeners\SendWelcomeMailNotification;
@@ -42,10 +39,6 @@ final class EventServiceProvider extends ServiceProvider
4239
SendNewReplyNotification::class,
4340
NotifyMentionedUsers::class,
4441
],
45-
ThreadWasCreated::class => [
46-
SendNewThreadNotification::class,
47-
PostNewThreadNotification::class,
48-
],
4942
ArticleWasSubmittedForApproval::class => [
5043
SendNewArticleNotification::class,
5144
],

composer.json

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"gehrisandro/tailwind-merge-laravel": "^1.2",
2424
"graham-campbell/markdown": "^15.2",
2525
"guzzlehttp/guzzle": "^7.7.0",
26+
"internachi/modular": "^2.3",
2627
"jenssegers/agent": "^2.6.4",
2728
"laravel-notification-channels/telegram": "^5.0",
2829
"laravel-notification-channels/twitter": "^8.1",

0 commit comments

Comments
 (0)