diff --git a/src/Command/RedmineCommand.php b/src/Command/RedmineCommand.php index 9ed4b3d..dc1c610 100644 --- a/src/Command/RedmineCommand.php +++ b/src/Command/RedmineCommand.php @@ -41,9 +41,6 @@ class RedmineCommand extends Command $projects = $this->em->getRepository(Project::class)->findAll(); foreach ($projects as $project) { $io->text('> Project = '.$project->getTitle()); - $redmine = $this->redmineService->getProject($project->getId(), $this->params->get('redmineApikey')); - $project->setRedmine($redmine); - $this->em->flush(); $this->redmineService->majProjectIssues($project, $this->params->get('redmineApikey'), true); } diff --git a/src/Controller/IssueController.php b/src/Controller/IssueController.php index 4bd6ec1..ec629c3 100644 --- a/src/Controller/IssueController.php +++ b/src/Controller/IssueController.php @@ -29,8 +29,6 @@ class IssueController extends AbstractController { $projects = $projectRepository->findAll(); foreach ($projects as $project) { - $redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey')); - $project->setRedmine($redmine); $this->redmineService->majProjectIssues($project, $this->getParameter('redmineApikey'), false); } @@ -124,7 +122,11 @@ class IssueController extends AbstractController 'agile_data_attributes' => ['agile_sprint_id' => $targetSprint], 'status_id' => $targetStatus, ]; - $this->redmineService->updateIssue($id, $payload, $this->getUser()->getApikey()); + $user = $this->getUser(); + if ($user instanceof \App\Entity\User) { + $apikey = $user->getApikey(); + $this->redmineService->updateIssue($id, $payload, $apikey); + } } catch (\RuntimeException $e) { return new JsonResponse(['message' => $e->getMessage()], 400); } diff --git a/src/Controller/ProjectController.php b/src/Controller/ProjectController.php index 3d3c806..21b60bf 100644 --- a/src/Controller/ProjectController.php +++ b/src/Controller/ProjectController.php @@ -36,12 +36,9 @@ class ProjectController extends AbstractController throw new AccessDeniedException('Vous n\'avez pas accès à cette ressource.'); } - $redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey')); - $project->setRedmine($redmine); $this->redmineService->majProjectIssues($project, $this->getParameter('redmineApikey'), false); $predmine = $project->getRedmine(); - foreach ($project->getIssues() as $issue) { foreach ($predmine['sprints'] as $key => $sprint) { if ($sprint['id'] === $issue->getRedmine()['sprint']['agile_sprint_id']) { @@ -71,11 +68,9 @@ class ProjectController extends AbstractController #[Route('/user/report/{month}', name: 'app_project_report')] public function reportProject(int $month, ProjectRepository $projectRepository, IssueRepository $issueRepository): Response { - $date=new \DateTime($month.'01'); + $date = new \DateTime($month.'01'); $projects = $projectRepository->findAll(); - foreach($projects as $project) { - $redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey')); - $project->setRedmine($redmine); + foreach ($projects as $project) { $this->redmineService->majProjectIssues($project, $this->getParameter('redmineApikey'), false); } @@ -83,10 +78,10 @@ class ProjectController extends AbstractController 'usemenu' => true, 'usesidebar' => false, 'project' => $project, - 'issues' => $issueRepository->findIssues(null,true,$this->getUser()), + 'issues' => $issueRepository->findIssues(null, true, $this->getUser()), 'date' => $date, - ]); - } + ]); + } #[Route('/admin/project', name: 'app_admin_project')] public function list(ProjectRepository $projectRepository): Response @@ -111,10 +106,9 @@ class ProjectController extends AbstractController $form = $this->createForm(ProjectType::class, $project, ['mode' => 'submit', 'redmineprojects' => $this->redmineService->getProjects($this->getParameter('redmineApikey'))]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey')); - $project->setRedmine($redmine); $em->persist($project); $em->flush(); + $this->redmineService->majProjectIssues($project, $this->getParameter('redmineApikey'), false); return $this->redirectToRoute('app_admin_project'); @@ -139,17 +133,11 @@ class ProjectController extends AbstractController throw new NotFoundHttpException('La ressource demandée est introuvable.'); } - $redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey')); - $project->setRedmine($redmine); - $em->persist($project); - $em->flush(); - - $form = $this->createForm(ProjectType::class, $project, ['mode' => 'update', 'redmineprojects' => $this->redmineService->getProjects($this->getParameter('redmineApikey')), 'redmine' => $redmine]); + $form = $this->createForm(ProjectType::class, $project, ['mode' => 'update', 'redmineprojects' => $this->redmineService->getProjects($this->getParameter('redmineApikey')), 'redmine' => $project->getRedmine()]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey')); - $project->setRedmine($redmine); $em->flush(); + $this->redmineService->majProjectIssues($project, $this->getParameter('redmineApikey'), false); return $this->redirectToRoute('app_admin_project'); @@ -175,9 +163,8 @@ class ProjectController extends AbstractController throw new NotFoundHttpException('La ressource demandée est introuvable.'); } - $redmine = $this->redmineService->getProject($project->getId(), $this->getParameter('redmineApikey')); - $project->setRedmine($redmine); $em->flush(); + $this->redmineService->majProjectIssues($project, $this->getParameter('redmineApikey'), true); return $this->redirectToRoute('app_admin_project'); diff --git a/src/Entity/Project.php b/src/Entity/Project.php index 0039c6a..30c4eb0 100644 --- a/src/Entity/Project.php +++ b/src/Entity/Project.php @@ -24,6 +24,9 @@ class Project #[ORM\Column(type: 'datetime', nullable: true)] private ?\DateTimeInterface $updateAt = null; + #[ORM\Column(type: 'datetime', nullable: true)] + private ?\DateTimeInterface $updateIssuesAt = null; + #[ORM\Column(nullable: false)] private array $redmine; @@ -109,6 +112,18 @@ class Project return $this; } + public function getUpdateIssuesAt(): ?\DateTimeInterface + { + return $this->updateIssuesAt; + } + + public function setUpdateIssuesAt(?\DateTimeInterface $updateIssuesAt): static + { + $this->updateIssuesAt = $updateIssuesAt; + + return $this; + } + public function getRedmine(): array { return $this->redmine; diff --git a/src/Service/RedmineService.php b/src/Service/RedmineService.php index 7dcc017..6b0cb3b 100644 --- a/src/Service/RedmineService.php +++ b/src/Service/RedmineService.php @@ -27,9 +27,6 @@ class RedmineService $this->em = $em; } - /** - * Récupère les projets accessibles via l'API key. - */ public function getProjects(string $apiKey): array { try { @@ -51,7 +48,20 @@ class RedmineService } } - public function getProject(int|string $id, string $apiKey): ?array + public function majProject(Project $project, string $apiKey, bool $force = false): void + { + $updatedAt = $project->getUpdateAt(); + $updatedMinus10 = $updatedAt instanceof \DateTime ? (clone $updatedAt)->sub(new \DateInterval('PT10M')) : null; + + $redmine = $this->getProject($project->getId(), $apiKey, $updatedMinus10, $force); + if ($redmine) { + $project->setRedmine($redmine); + } + $project->setUpdateIssuesAt(new \DateTime()); + $this->em->flush(); + } + + public function getProject(int|string $id, string $apiKey, \DateTimeInterface $date, bool $force = false): ?array { try { $response = $this->client->request('GET', $this->baseUrl.'/projects/'.$id.'.json?include=trackers,issue_categories,issue_custom_fields', [ @@ -66,6 +76,10 @@ class RedmineService } $data = $response->toArray(); + if (!$force && $date && $data['project']['updated_on'] <= $date) { + return null; + } + $data['project']['issue_statuses'] = $this->getIssueStatuses($apiKey); $data['project']['issue_priorities'] = $this->getIssuePriorities($apiKey); @@ -173,8 +187,10 @@ class RedmineService public function majProjectIssues(Project $project, string $apiKey, bool $force = false) { - $updatedAt = $project->getUpdateAt(); - $updatedMinus10 = $updatedAt ? (clone $updatedAt)->sub(new \DateInterval('PT10M')) : null; + $this->majProject($project, $apiKey, $force); + + $updatedAt = $project->getUpdateIssuesAt(); + $updatedMinus10 = $updatedAt instanceof \DateTime ? (clone $updatedAt)->sub(new \DateInterval('PT10M')) : null; $rissues = $this->getProjectIssues($project->getId(), $apiKey, $force ? null : $updatedMinus10); $rissueids = []; @@ -231,7 +247,7 @@ class RedmineService */ $this->em->persist($issue); - $project->setUpdateAt(new \DateTime()); + $project->setUpdateIssuesAt(new \DateTime()); $this->em->flush(); } diff --git a/templates/issue/view.html.twig b/templates/issue/view.html.twig index a6aa6aa..b5afa40 100644 --- a/templates/issue/view.html.twig +++ b/templates/issue/view.html.twig @@ -2,8 +2,9 @@