AssignTaskUseCase.php

Code Hygiene Score: 98

Keine Issues gefunden.

Dependencies 9

Klassen 1

Funktionen 3

Verwendet von 2

Versionen 2

Code

<?php

declare(strict_types=1);

namespace UseCases\Task;

// @responsibility: Weist Tasks an Personen oder KI-Modelle zu

use Domain\Entity\TaskAssignment;
use Domain\Entity\TaskComment;
use Domain\Repository\TaskRepositoryInterface;
use Domain\ValueObject\AssigneeType;
use Infrastructure\Persistence\TaskAssignmentRepository;
use Infrastructure\Persistence\TaskCommentRepository;

class AssignTaskUseCase
{
    public function __construct(
        private TaskRepositoryInterface $taskRepository,
        private TaskAssignmentRepository $assignmentRepository,
        private TaskCommentRepository $commentRepository
    ) {
    }

    public function execute(int $taskId, array $data): TaskAssignment
    {
        $this->validate($data);

        $task = $this->taskRepository->find($taskId);
        if ($task === null) {
            throw new \InvalidArgumentException("Task {$taskId} not found");
        }

        $assigneeType = AssigneeType::from($data['assignee_type']);

        $assignment = new TaskAssignment();
        $assignment->setTaskId($taskId);
        $assignment->setAssignee($data['assignee']);
        $assignment->setAssigneeType($assigneeType);
        $assignment->setAssignedBy($data['assigned_by'] ?? 'system');
        $assignment->setAssignedByType($data['assigned_by_type'] ?? 'human');

        if (isset($data['model_name'])) {
            $assignment->setModelName($data['model_name']);
        }

        if (isset($data['notes'])) {
            $assignment->setNotes($data['notes']);
        }

        $id = $this->assignmentRepository->save($assignment);
        $assignment->setId($id);

        $comment = TaskComment::createAssignmentNote(
            $taskId,
            $assignment->getAssignedBy(),
            $assignment->getAssignedByType(),
            $assignment->getAssignee(),
            $assigneeType->label()
        );
        $this->commentRepository->save($comment);

        return $assignment;
    }

    private function validate(array $data): void
    {
        if (!isset($data['assignee']) || $data['assignee'] === '') {
            throw new \InvalidArgumentException('Assignee is required');
        }

        if (!isset($data['assignee_type']) || $data['assignee_type'] === '') {
            throw new \InvalidArgumentException('Assignee type is required');
        }

        try {
            AssigneeType::from($data['assignee_type']);
        } catch (\ValueError $e) {
            throw new \InvalidArgumentException('Invalid assignee type');
        }
    }
}
← Übersicht Graph