<?php
declare(strict_types=1);
namespace UseCases\Task;
// @responsibility: Erstellt neue Tasks mit optionalen Kommentaren und Parent-Verknüpfung
use Domain\Entity\Task;
use Domain\Entity\TaskComment;
use Domain\Repository\TaskRepositoryInterface;
use Infrastructure\Persistence\TaskCommentRepository;
class CreateTaskUseCase
{
public function __construct(
private TaskRepositoryInterface $taskRepository,
private TaskCommentRepository $commentRepository
) {
}
public function execute(array $data): Task
{
$this->validate($data);
$task = new Task();
$task->setTitle($data['title']);
$task->setCreatedBy($data['created_by'] ?? 'system');
$task->setCreatedByType($data['created_by_type'] ?? 'human');
if (isset($data['description'])) {
$task->setDescription($data['description']);
}
if (isset($data['type'])) {
$task->setType($data['type']);
}
if (isset($data['parent_task_id'])) {
$task->setParentTaskId((int) $data['parent_task_id']);
}
if (isset($data['due_date'])) {
$task->setDueDate(new \DateTimeImmutable($data['due_date']));
}
if (isset($data['metadata'])) {
$task->setMetadata($data['metadata']);
}
$id = $this->taskRepository->save($task);
$task->setId($id);
$comment = new TaskComment();
$comment->setTaskId($id);
$comment->setAuthor($task->getCreatedBy());
$comment->setAuthorType($task->getCreatedByType());
$comment->setCommentType('note');
$comment->setContent('Task erstellt');
$this->commentRepository->save($comment);
return $task;
}
private function validate(array $data): void
{
if (!isset($data['title']) || $data['title'] === '') {
throw new \InvalidArgumentException('Title is required');
}
if (strlen($data['title']) > 255) {
throw new \InvalidArgumentException('Title must be 255 characters or less');
}
if (isset($data['type']) && !in_array($data['type'], ['human_task', 'ai_task', 'mixed'])) {
throw new \InvalidArgumentException('Invalid task type');
}
}
}