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 <noreply@anthropic.com>
54 lines
1.5 KiB
PHP
Executable File
54 lines
1.5 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Console;
|
|
|
|
use Illuminate\Console\Scheduling\Schedule;
|
|
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
|
|
|
|
class Kernel extends ConsoleKernel
|
|
{
|
|
/**
|
|
* Define the application's command schedule.
|
|
*/
|
|
protected function schedule(Schedule $schedule): void
|
|
{
|
|
$interval = $this->getCleanupInterval();
|
|
$schedule->command('cleanup:orphaned-videos --force')
|
|
->cron("*/{$interval} * * * *")
|
|
->withoutOverlapping()
|
|
->runInBackground();
|
|
|
|
// Evict NAS stream-cache files older than 24 hours
|
|
$schedule->call(function () {
|
|
$nas = app(\App\Services\NasSyncService::class);
|
|
if ($nas->isEnabled()) {
|
|
$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();
|
|
}
|
|
|
|
/**
|
|
* Register the commands for the application.
|
|
*/
|
|
protected function commands(): void
|
|
{
|
|
$this->load(__DIR__.'/Commands');
|
|
|
|
require base_path('routes/console.php');
|
|
}
|
|
|
|
/**
|
|
* Get the interval in minutes for cleanup (from .env)
|
|
*/
|
|
protected function getCleanupInterval(): int
|
|
{
|
|
return (int) env('CLEANUP_INTERVAL_MINUTES', 30);
|
|
}
|
|
}
|