Add full notification preferences system
Users can now control which in-app and email notifications they receive from their Settings tab on their channel page. Bell (in-app) preferences: - New comment on my video (default: on) - Reply to my comment (default: on) - Comment liked (default: on) - Video liked (default: on) - New subscriber (default: on) - New video from channels I follow (default: on) - New post from channels I follow (default: on) - New user registration — super admins only (default: on) Email preferences (same set plus): - Comment liked (default: off — too noisy) - Video liked (default: off — too noisy) - New post from channels I follow (default: off) - My video finished processing (default: on) - Weekly activity digest every Monday (default: on) - New user registration — super admins only (default: on) Implementation: - Migration: notification_preferences JSON column on users table - User::notificationPref($key) helper with typed defaults - All existing notification classes updated to check prefs in via() - 4 new notification classes: NewSubscriberNotification, VideoLikedNotification, NewPostNotification, WeeklyDigestNotification - 8 new email views matching existing dark theme - SendWeeklyDigest artisan command, scheduled every Monday 09:00 - NewSubscriberNotification wired into UserController::toggleSubscribe - VideoLikedNotification wired into UserController::toggleLike - NewPostNotification wired into PostController::store (to all subscribers) - Bell renderer updated for new_subscriber, video_like, new_post types - Preferences saved via AJAX (POST /settings/notifications) — instant toggle with automatic revert on failure Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
This commit is contained in:
1 parent
3fe167e33f
commit
f8d13457fa
26 files changed
+808
-18
No files matched your search
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Notifications\WeeklyDigestNotification;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
class SendWeeklyDigest extends Command
|
||||
{
|
||||
protected $signature = 'digest:weekly';
|
||||
protected $description = 'Send weekly activity digest emails to creators who have it enabled';
|
||||
|
||||
public function handle(): void
|
||||
{
|
||||
$users = User::whereHas('videos')->get();
|
||||
|
||||
$sent = 0;
|
||||
foreach ($users as $user) {
|
||||
if (! $user->notificationPref('email_weekly_digest')) {
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
$user->notify(new WeeklyDigestNotification($user));
|
||||
$sent++;
|
||||
} catch (\Throwable $e) {
|
||||
\Log::error('Weekly digest failed for user ' . $user->id . ': ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
$this->info("Sent weekly digest to {$sent} users.");
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,12 @@ class Kernel extends ConsoleKernel
|
||||
$nas->clearNasCache(24);
|
||||
}
|
||||
})->daily()->name('nas-cache-evict')->withoutOverlapping();
|
||||
|
||||
// Weekly activity digest — every Monday at 9:00 AM (Bahrain time)
|
||||
$schedule->command('digest:weekly')
|
||||
->weeklyOn(1, '09:00')
|
||||
->withoutOverlapping()
|
||||
->runInBackground();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user