A dashboard widget lists what expires in the next two weeks, and a daily command reminds whoever edits it a week and a day ahead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
61 lines
1.8 KiB
PHP
61 lines
1.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\User;
|
|
use App\Notifications\ExpiringSoon;
|
|
use App\Support\Expiring;
|
|
use Illuminate\Console\Command;
|
|
|
|
/**
|
|
* Tells editors, once a day, about what closes or comes off the site on one
|
|
* of the reminder days ahead (a week and a day, by default) — so each thing
|
|
* is mentioned a couple of times rather than every morning for a fortnight.
|
|
*/
|
|
class NotifyExpiringCommand extends Command
|
|
{
|
|
protected $signature = 'content:expiring
|
|
{--dry-run : List who would be told what, without telling them}';
|
|
|
|
protected $description = 'Remind editors of calls closing and content coming off the site soon';
|
|
|
|
public function handle(): int
|
|
{
|
|
$days = array_map('intval', (array) config('site.expiry_reminders', [7, 1]));
|
|
|
|
$due = Expiring::within(max($days))
|
|
->filter(fn (array $item) => in_array((int) now()->startOfDay()->diffInDays($item['at']->copy()->startOfDay()), $days, true))
|
|
->values();
|
|
|
|
if ($due->isEmpty()) {
|
|
$this->components->info(__('console.expiring.none'));
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
$told = 0;
|
|
|
|
User::query()->where('is_active', true)->get()->each(function (User $user) use ($due, &$told): void {
|
|
$mine = Expiring::for($due, $user);
|
|
|
|
if ($mine->isEmpty()) {
|
|
return;
|
|
}
|
|
|
|
$this->components->twoColumnDetail($user->name, (string) $mine->count());
|
|
|
|
if (! $this->option('dry-run')) {
|
|
$user->notify(new ExpiringSoon($mine));
|
|
}
|
|
|
|
$told++;
|
|
});
|
|
|
|
$this->components->info(trans_choice('console.expiring.summary', $told, ['count' => $told]));
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
}
|