diff --git a/src/Controller/Mail/MailCreateTaskController.php b/src/Controller/Mail/MailCreateTaskController.php index 651c661..436b8f7 100644 --- a/src/Controller/Mail/MailCreateTaskController.php +++ b/src/Controller/Mail/MailCreateTaskController.php @@ -8,7 +8,8 @@ use App\Entity\Project; use App\Entity\Task; use App\Entity\TaskGroup; use App\Entity\TaskMailLink; -use App\Entity\TaskPriority; +use App\Entity\TaskStatus; +use App\Entity\User; use App\Repository\MailMessageRepository; use App\Repository\TaskRepository; use App\Security\MailAccessChecker; @@ -74,13 +75,25 @@ class MailCreateTaskController extends AbstractController } } - if (isset($body['priorityId']) && null !== $body['priorityId']) { - $priority = $this->em->getRepository(TaskPriority::class)->find($body['priorityId']); - if (null !== $priority) { - $task->setPriority($priority); + if (isset($body['assigneeId']) && null !== $body['assigneeId']) { + $assignee = $this->em->getRepository(User::class)->find($body['assigneeId']); + if (null !== $assignee) { + $task->setAssignee($assignee); } } + // Statut : celui fourni, sinon le premier statut du workflow du projet (par position) + $status = null; + if (isset($body['statusId']) && null !== $body['statusId']) { + $status = $this->em->getRepository(TaskStatus::class)->find($body['statusId']); + } + if (null === $status) { + $status = $project->getWorkflow()?->getStatuses()->first() ?: null; + } + if (null !== $status) { + $task->setStatus($status); + } + $this->em->persist($task); $link = new TaskMailLink(); diff --git a/tests/Functional/Controller/Mail/MailTaskIntegrationControllerTest.php b/tests/Functional/Controller/Mail/MailTaskIntegrationControllerTest.php index 83feeb5..e8b7f1c 100644 --- a/tests/Functional/Controller/Mail/MailTaskIntegrationControllerTest.php +++ b/tests/Functional/Controller/Mail/MailTaskIntegrationControllerTest.php @@ -4,7 +4,12 @@ declare(strict_types=1); namespace App\Tests\Functional\Controller\Mail; +use App\Entity\MailFolder; +use App\Entity\MailMessage; +use App\Entity\Project; +use App\Entity\Task; use App\Entity\User; +use DateTimeImmutable; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; /** @@ -69,4 +74,67 @@ class MailTaskIntegrationControllerTest extends WebTestCase self::assertResponseStatusCodeSame(401); } + + public function testCreateTaskAppliesStatusAndAssigneeAndIgnoresPriority(): void + { + $client = static::createClient(); + $container = static::getContainer(); + $em = $container->get('doctrine.orm.entity_manager'); + + $admin = $em->getRepository(User::class)->findOneBy(['username' => 'admin']); + $client->loginUser($admin); + + $project = $em->getRepository(Project::class)->findOneBy([]); + self::assertNotNull($project); + $status = $project->getWorkflow()->getStatuses()->first(); + self::assertNotFalse($status); + + // Create a mail folder + message in the test DB (none in fixtures) + $folder = new MailFolder(); + $folder->setDisplayName('Boîte de réception'); + $folder->setUnreadCount(0); + $folder->setTotalCount(0); + $em->persist($folder); + + $rand = random_int(100000, 999999); + $folder->setPath('INBOX.'.$rand); + + $message = new MailMessage(); + $message->setMessageId('test-'.$rand.'@example.com'); + $message->setFolder($folder); + $message->setUid($rand); + $message->setFromAddress('sender@example.com'); + $message->setToAddresses([]); + $message->setSentAt(new DateTimeImmutable()); + $message->setIsRead(false); + $message->setIsFlagged(false); + $message->setHasAttachments(false); + $message->setSyncedAt(new DateTimeImmutable()); + $message->setSubject('Sujet de test'); + $em->persist($message); + $em->flush(); + + $client->request( + 'POST', + '/api/mail/messages/'.$message->getId().'/create-task', + [], + [], + ['CONTENT_TYPE' => 'application/json'], + json_encode([ + 'projectId' => $project->getId(), + 'assigneeId' => $admin->getId(), + 'statusId' => $status->getId(), + 'priorityId' => 999, // doit être ignoré + ]) + ); + + self::assertResponseStatusCodeSame(201); + $payload = json_decode($client->getResponse()->getContent(), true); + + $em->clear(); + $task = $em->getRepository(Task::class)->find($payload['taskId']); + self::assertSame($status->getId(), $task->getStatus()?->getId()); + self::assertSame($admin->getId(), $task->getAssignee()?->getId()); + self::assertNull($task->getPriority()); + } }