Warn about calls closing and content coming off the site
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>
This commit is contained in:
60
app/Console/Commands/NotifyExpiringCommand.php
Normal file
60
app/Console/Commands/NotifyExpiringCommand.php
Normal file
@@ -0,0 +1,60 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user