Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BCrwHHnGCB5XH968Nxokqw
46 lines
1.3 KiB
PHP
46 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Delivery;
|
|
|
|
use App\Channels\ChannelRegistry;
|
|
use App\Enums\EventState;
|
|
use App\Models\Event;
|
|
use App\Scheduling\DueResolver;
|
|
use App\Scheduling\QuietRule;
|
|
|
|
final class EventActions
|
|
{
|
|
public function __construct(
|
|
private readonly DueResolver $due,
|
|
private readonly QuietRule $quiet,
|
|
private readonly ChannelRegistry $channels,
|
|
) {}
|
|
|
|
/** «Помню»: молчать до следующей контрольной точки текущего состояния. */
|
|
public function ack(Event $event): void
|
|
{
|
|
if ($event->isTerminal()) {
|
|
return;
|
|
}
|
|
$user = $event->user;
|
|
$now = $user->now();
|
|
$event->quiet_until = $this->quiet->afterAck($event, $user, $event->state, $this->due->resolve($event, $user), $now);
|
|
$event->save();
|
|
}
|
|
|
|
/** «Сделано»: закрыть событие целиком. */
|
|
public function done(Event $event): void
|
|
{
|
|
if ($event->isTerminal()) {
|
|
return;
|
|
}
|
|
$event->state = EventState::Done;
|
|
$event->done_at = now();
|
|
$event->save();
|
|
|
|
foreach ($event->deliveries()->with('channel')->get() as $delivery) {
|
|
$this->channels->for($delivery->channel->type)->onDone($event, $delivery);
|
|
}
|
|
}
|
|
}
|