agent/php/Actions/Sprint/UpdateSprint.php
2026-03-21 11:10:44 +00:00

60 lines
1.6 KiB
PHP

<?php
declare(strict_types=1);
namespace Core\Mod\Agentic\Actions\Sprint;
use Core\Actions\Action;
use Core\Mod\Agentic\Models\Sprint;
/**
* Update a sprint's fields.
*
* Usage:
* $sprint = UpdateSprint::run('sprint-1', ['status' => 'active'], 1);
*/
class UpdateSprint
{
use Action;
/**
* @param array{status?: string, title?: string, description?: string, goal?: string} $data
*
* @throws \InvalidArgumentException
*/
public function handle(string $slug, array $data, int $workspaceId): Sprint
{
if ($slug === '') {
throw new \InvalidArgumentException('slug is required');
}
$sprint = Sprint::forWorkspace($workspaceId)
->where('slug', $slug)
->first();
if (! $sprint) {
throw new \InvalidArgumentException("Sprint not found: {$slug}");
}
if (isset($data['status'])) {
$valid = [Sprint::STATUS_PLANNING, Sprint::STATUS_ACTIVE, Sprint::STATUS_COMPLETED, Sprint::STATUS_CANCELLED];
if (! in_array($data['status'], $valid, true)) {
throw new \InvalidArgumentException(
sprintf('status must be one of: %s', implode(', ', $valid))
);
}
if ($data['status'] === Sprint::STATUS_ACTIVE && ! $sprint->started_at) {
$data['started_at'] = now();
}
if (in_array($data['status'], [Sprint::STATUS_COMPLETED, Sprint::STATUS_CANCELLED], true)) {
$data['ended_at'] = now();
}
}
$sprint->update($data);
return $sprint->fresh()->load('issues');
}
}