Skip to content

Commit fa898a9

Browse files
committed
Add forum subscription support
1 parent 8db01ad commit fa898a9

17 files changed

Lines changed: 596 additions & 0 deletions
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::create('forum_post_subscriptions', function (Blueprint $table) {
15+
$table->id();
16+
$tenantColumn = null;
17+
18+
if (config('filament-forum.tenancy.enabled')) {
19+
$tenantModel = config('filament-forum.tenancy.model');
20+
$tenantColumn = config('filament-forum.tenancy.column')
21+
?: str($tenantModel)->classBasename()->snake()->append('_id')->toString();
22+
23+
$table->foreignIdFor($tenantModel)
24+
->constrained()
25+
->cascadeOnDelete();
26+
}
27+
28+
$table->foreignId('forum_post_id')->constrained()->cascadeOnDelete();
29+
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
30+
$table->timestamps();
31+
32+
$uniqueColumns = config('filament-forum.tenancy.enabled')
33+
? [(string) $tenantColumn, 'forum_post_id', 'user_id']
34+
: ['forum_post_id', 'user_id'];
35+
36+
$table->unique($uniqueColumns);
37+
});
38+
}
39+
40+
/**
41+
* Reverse the migrations.
42+
*/
43+
public function down(): void
44+
{
45+
Schema::dropIfExists('forum_post_subscriptions');
46+
}
47+
};
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
use Illuminate\Database\Migrations\Migration;
4+
use Illuminate\Database\Schema\Blueprint;
5+
use Illuminate\Support\Facades\Schema;
6+
7+
return new class extends Migration
8+
{
9+
/**
10+
* Run the migrations.
11+
*/
12+
public function up(): void
13+
{
14+
Schema::create('forum_subscriptions', function (Blueprint $table) {
15+
$table->id();
16+
$tenantColumn = null;
17+
18+
if (config('filament-forum.tenancy.enabled')) {
19+
$tenantModel = config('filament-forum.tenancy.model');
20+
$tenantColumn = config('filament-forum.tenancy.column')
21+
?: str($tenantModel)->classBasename()->snake()->append('_id')->toString();
22+
23+
$table->foreignIdFor($tenantModel)
24+
->constrained()
25+
->cascadeOnDelete();
26+
}
27+
28+
$table->foreignId('forum_id')->constrained()->cascadeOnDelete();
29+
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
30+
$table->timestamps();
31+
32+
$uniqueColumns = config('filament-forum.tenancy.enabled')
33+
? [(string) $tenantColumn, 'forum_id', 'user_id']
34+
: ['forum_id', 'user_id'];
35+
36+
$table->unique($uniqueColumns);
37+
});
38+
}
39+
40+
/**
41+
* Reverse the migrations.
42+
*/
43+
public function down(): void
44+
{
45+
Schema::dropIfExists('forum_subscriptions');
46+
}
47+
};

resources/lang/en/filament-forum.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
'forum.delete.modal.heading' => 'Delete Forum',
1818
'forum.delete.modal.description' => 'Are you sure you want to delete this forum? This action cannot be undone.',
1919
'forum.delete.notification' => 'Forum deleted successfully',
20+
'forum.subscribe' => 'Follow forum',
21+
'forum.unsubscribe' => 'Unfollow forum',
2022

2123
/*
2224
|--------------------------------------------------------------------------
@@ -32,6 +34,8 @@
3234
'forum-post.unknown' => 'Unknown',
3335
'forum-post.last-reply' => 'Last reply',
3436
'forum-post.toggle-favorite' => 'Toggle Favorite',
37+
'forum-post.subscribe' => 'Follow post',
38+
'forum-post.unsubscribe' => 'Unfollow post',
3539
'forum-post.views' => '{0} No views yet|{1} :value view|[2,*] :value views',
3640
'forum-post.replies' => '{0} No reply yet|{1} :value reply|[2,*] :value replies',
3741

src/Events/ForumPostSubscribed.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Tapp\FilamentForum\Events;
4+
5+
use Illuminate\Foundation\Events\Dispatchable;
6+
use Illuminate\Queue\SerializesModels;
7+
use Tapp\FilamentForum\Models\ForumPost;
8+
9+
class ForumPostSubscribed
10+
{
11+
use Dispatchable;
12+
use SerializesModels;
13+
14+
public function __construct(
15+
public mixed $user,
16+
public ForumPost $forumPost,
17+
) {}
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Tapp\FilamentForum\Events;
4+
5+
use Illuminate\Foundation\Events\Dispatchable;
6+
use Illuminate\Queue\SerializesModels;
7+
use Tapp\FilamentForum\Models\ForumPost;
8+
9+
class ForumPostUnsubscribed
10+
{
11+
use Dispatchable;
12+
use SerializesModels;
13+
14+
public function __construct(
15+
public mixed $user,
16+
public ForumPost $forumPost,
17+
) {}
18+
}

src/Events/ForumSubscribed.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Tapp\FilamentForum\Events;
4+
5+
use Illuminate\Foundation\Events\Dispatchable;
6+
use Illuminate\Queue\SerializesModels;
7+
use Tapp\FilamentForum\Models\Forum;
8+
9+
class ForumSubscribed
10+
{
11+
use Dispatchable;
12+
use SerializesModels;
13+
14+
public function __construct(
15+
public mixed $user,
16+
public Forum $forum,
17+
) {}
18+
}

src/Events/ForumUnsubscribed.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?php
2+
3+
namespace Tapp\FilamentForum\Events;
4+
5+
use Illuminate\Foundation\Events\Dispatchable;
6+
use Illuminate\Queue\SerializesModels;
7+
use Tapp\FilamentForum\Models\Forum;
8+
9+
class ForumUnsubscribed
10+
{
11+
use Dispatchable;
12+
use SerializesModels;
13+
14+
public function __construct(
15+
public mixed $user,
16+
public Forum $forum,
17+
) {}
18+
}

src/Filament/Resources/ForumPosts/Schemas/ForumPostInfolist.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ public static function configure(Schema $schema): Schema
2828
->tooltip(__('filament-forum::filament-forum.forum-post.toggle-favorite'))
2929
->icon(fn (ForumPost $record) => $record->isFavorite() ? 'heroicon-s-star' : 'heroicon-o-star')
3030
->action(fn (ForumPost $record) => $record->toggleFavorite()),
31+
Action::make('subscription')
32+
->iconButton()
33+
->tooltip(fn (ForumPost $record) => $record->isSubscribed()
34+
? __('filament-forum::filament-forum.forum-post.unsubscribe')
35+
: __('filament-forum::filament-forum.forum-post.subscribe'))
36+
->icon(fn (ForumPost $record) => $record->isSubscribed() ? 'heroicon-s-bell' : 'heroicon-o-bell')
37+
->action(fn (ForumPost $record) => $record->toggleSubscription()),
3138
Action::make('share')
3239
->icon('heroicon-o-share')
3340
->action(function ($livewire) {

src/Filament/Resources/Forums/Pages/ManageForumPosts.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@
33
namespace Tapp\FilamentForum\Filament\Resources\Forums\Pages;
44

55
use BackedEnum;
6+
use Filament\Actions\Action;
67
use Filament\Actions\CreateAction;
78
use Filament\Panel;
89
use Filament\Resources\Pages\ManageRelatedRecords;
910
use Filament\Tables\Table;
1011
use Illuminate\Contracts\Support\Htmlable;
12+
use Illuminate\Support\Facades\Auth;
1113
use Tapp\FilamentForum\Filament\Resources\ForumPosts\ForumPostResource;
1214
use Tapp\FilamentForum\Filament\Resources\ForumPosts\Tables\ForumPostsTable;
1315
use Tapp\FilamentForum\Filament\Resources\Forums\ForumResource;
16+
use Tapp\FilamentForum\Models\Forum;
1417
use Tapp\FilamentForum\Models\ForumPost;
1518

1619
class ManageForumPosts extends ManageRelatedRecords
@@ -43,15 +46,35 @@ public function table(Table $table): Table
4346
{
4447
return ForumPostsTable::configure($table)
4548
->headerActions([
49+
Action::make('subscription')
50+
->label(fn (): string => $this->forumSubscriptionRecord()->isSubscribed()
51+
? __('filament-forum::filament-forum.forum.unsubscribe')
52+
: __('filament-forum::filament-forum.forum.subscribe'))
53+
->icon(fn (): string => $this->forumSubscriptionRecord()->isSubscribed() ? 'heroicon-s-bell' : 'heroicon-o-bell')
54+
->visible(fn (): bool => Auth::check())
55+
->action(fn () => $this->toggleForumSubscription()),
4656
CreateAction::make(),
4757
]);
4858
}
4959

60+
public function toggleForumSubscription(): void
61+
{
62+
$this->forumSubscriptionRecord()->toggleSubscription();
63+
}
64+
5065
public function toggleFavorite($recordId)
5166
{
5267
$forumPostrecord = ForumPost::find($recordId);
5368
$forumPostrecord->toggleFavorite();
5469

5570
$this->dispatch('favorite-toggled', recordId: $recordId, isFavorite: $forumPostrecord->isFavorite());
5671
}
72+
73+
protected function forumSubscriptionRecord(): Forum
74+
{
75+
/** @var Forum $forum */
76+
$forum = $this->getOwnerRecord();
77+
78+
return $forum;
79+
}
5780
}

src/FilamentForumServiceProvider.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public function configurePackage(Package $package): void
3434
'create_forum_user_table',
3535
'create_forum_posts_table',
3636
'create_favorite_forum_post_table',
37+
'create_forum_subscriptions_table',
38+
'create_forum_post_subscriptions_table',
3739
'create_forum_post_views_table',
3840
'create_forum_comments_table',
3941
'create_forum_comment_reactions_table',

0 commit comments

Comments
 (0)