From 8bc58f69663ff608c3209a697c1aa2dabfc97e5a Mon Sep 17 00:00:00 2001 From: afornerot Date: Fri, 14 Jun 2024 18:44:30 +0200 Subject: [PATCH] optimisation getissue gitea --- src/Controller/ScrumController.php | 1 - src/Controller/ScrumissueController.php | 2 +- src/Repository/ScrumRepository.php | 165 +++++++++++++++--------- src/Service/giteaService.php | 10 +- 4 files changed, 110 insertions(+), 68 deletions(-) diff --git a/src/Controller/ScrumController.php b/src/Controller/ScrumController.php index 57af9bb..da0c3c7 100755 --- a/src/Controller/ScrumController.php +++ b/src/Controller/ScrumController.php @@ -433,7 +433,6 @@ class ScrumController extends AbstractController ]); } - public function table($id, Request $request) { $em = $this->getDoctrine()->getManager(); diff --git a/src/Controller/ScrumissueController.php b/src/Controller/ScrumissueController.php index 24ef27a..9cda814 100755 --- a/src/Controller/ScrumissueController.php +++ b/src/Controller/ScrumissueController.php @@ -85,7 +85,7 @@ class ScrumissueController extends AbstractController // Récupérer l'issue modifiée pour mettre à jour la date de modification gitea $giteaissue=$this->giteaservice->getIssue($scrumissue->getScrum()->getGiteajson()["owner"]["login"],$scrumissue->getScrum()->getGiteajson()["name"],$scrumissue->getGiteanumber()); if(!$giteaissue) return new JsonResponse(['message' => 'No API getIssue'], 403); - $updateissue=new \DateTime($giteaissue->updated_at); + $updateissue=new \DateTime(json_decode(json_encode($giteaissue), true)["updated_at"]); $updateissue->setTimezone(new \DateTimeZone("UTC")); $lastupdate=$scrumissue->getScrum()->getUpdatedate(); diff --git a/src/Repository/ScrumRepository.php b/src/Repository/ScrumRepository.php index 73b22b7..ef3473a 100644 --- a/src/Repository/ScrumRepository.php +++ b/src/Repository/ScrumRepository.php @@ -13,13 +13,32 @@ class ScrumRepository extends ServiceEntityRepository { private $session; private $firstcolumn; - private $datescrumupdate; - + private $totalTime; + private $startTime; + private $showTime; + public function __construct(ManagerRegistry $registry,giteaService $giteaservice,SessionInterface $session) { parent::__construct($registry, Scrum::class); $this->giteaservice = $giteaservice; $this->session = $session; + $this->showTime = false; + } + + private function showtime($istart,$title="") { + if($this->showTime) { + if($istart) { + $this->totalTime = microtime(true); + $this->startTime = microtime(true); + } + else { + $endTime = microtime(true); + $executionTime = $endTime - $this->startTime; + $totalTime = $endTime - $this->totalTime; + dump($executionTime." / ".$totalTime." = ".$title); + $this->startTime = microtime(true); + } + } } public function findByUser($user) { @@ -40,17 +59,30 @@ class ScrumRepository extends ServiceEntityRepository public function getGitea($scrum,&$giteaassignees,&$giteacolumns,&$giteamilestones,&$giteateams,&$giteaprioritys,&$giteatypes,&$gitealabels, $forcereload=false) { + $this->showtime(true); + $lastupdate = $scrum->getUpdatedate(); + if(!$lastupdate) $lastupdate = new \DateTime(("19000101")); + $lastupdate->sub(new \DateInterval('PT30M')); + $viewclosed = $this->session->get("viewclosed"); - + // Récupérer les labels de gitea $gitealabels=$this->giteaservice->getLabels($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); if(!is_array($gitealabels)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); + $giteaidlabels=array_column($gitealabels, 'id'); + + // Récupérer les jalons de gitea + $giteamilestones=$this->giteaservice->getMilestones($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); + if(!is_array($giteamilestones)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); + $giteaidmilestones=array_column($giteamilestones, 'id'); + + // Temps d'execution + $this->showtime(false,"Récupération gitealabels & giteamilestones"); // S'assurer que nos colonnes existes toujours $scrumcolumns=$scrum->getScrumcolumns(); foreach($scrumcolumns as $scrumcolumn) { - $gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumcolumn->getGiteaid()); - if(!$gitealabel) { + if(!in_array($scrumcolumn->getGiteaid(),$giteaidlabels)) { $this->_em->remove($scrumcolumn); $this->_em->flush(); } @@ -59,8 +91,7 @@ class ScrumRepository extends ServiceEntityRepository // S'assurer que nos teams existes toujours $scrumteams=$scrum->getScrumteams(); foreach($scrumteams as $scrumteam) { - $gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumteam->getGiteaid()); - if(!$gitealabel) { + if(!in_array($scrumteam->getGiteaid(),$giteaidlabels)) { $this->_em->remove($scrumteam); $this->_em->flush(); } @@ -69,8 +100,7 @@ class ScrumRepository extends ServiceEntityRepository // S'assurer que nos prioritys existes toujours $scrumprioritys=$scrum->getScrumprioritys(); foreach($scrumprioritys as $scrumpriority) { - $gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumpriority->getGiteaid()); - if(!$gitealabel) { + if(!in_array($scrumpriority->getGiteaid(),$giteaidlabels)) { $this->_em->remove($scrumpriority); $this->_em->flush(); } @@ -79,23 +109,27 @@ class ScrumRepository extends ServiceEntityRepository // S'assurer que nos types existes toujours $scrumtypes=$scrum->getScrumtypes(); foreach($scrumtypes as $scrumtype) { - $gitealabel=$this->giteaservice->getLabel($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumtype->getGiteaid()); - if(!$gitealabel) { + if(!in_array($scrumtype->getGiteaid(),$giteaidlabels)) { $this->_em->remove($scrumtype); $this->_em->flush(); } } + // Temps d'execution + $this->showtime(false,"S'assurer que nos labels colonnes teams prioritys types existes toujours"); + // S'assurer que nos sprint sont toujours lié à un jalon existant $scrumsprints=$scrum->getScrumsprints(); foreach($scrumsprints as $scrumsprint) { - $giteamilestone=$this->giteaservice->getMilestone($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumsprint->getGiteamilestone()); - if(!$giteamilestone) { + if(!in_array($scrumsprint->getGiteamilestone(),$giteaidmilestones)) { $this->_em->remove($scrumsprint); $this->_em->flush(); } } + // Temps d'execution + $this->showtime(false,"S'assurer que nos sprint sont toujours lié à un jalon existant"); + // Récupérer le dernier order $last = $this->_em->getRepository('App:Scrumissue')->findOneBy(["scrum"=>$scrum], ['rowid' => 'DESC']); if(!$last) $lastrowid=-1; @@ -139,51 +173,40 @@ class ScrumRepository extends ServiceEntityRepository else $giteaassignees=[]; - $giteacollaborators=$this->giteaservice->getOrgateams($scrum->getGiteajson()["owner"]["login"]); - if($giteacollaborators&&is_array($giteacollaborators)) { - foreach($giteacollaborators as $team) { - $giteamembers=$this->giteaservice->getTeammembers($team->id); - if($giteamembers&&is_array($giteamembers)) { - foreach($giteamembers as $giteamember) { - if(!in_array($giteamember,$giteaassignees)) - array_push($giteaassignees,$giteamember); - } - } - } - } - $giteacollaborators=$this->giteaservice->getCollaborators($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); + // Temps d'execution + $this->showtime(false,"Récupérer info ninegitea"); + + // Récupérer les intervenants + $giteacollaborators=$this->giteaservice->getAssignees($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); if(!is_array($giteacollaborators)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); foreach($giteacollaborators as $giteacollaborator) { if(!in_array($giteacollaborator,$giteaassignees)) array_push($giteaassignees,$giteacollaborator); } + // Temps d'execution + $this->showtime(false,"Récupérer les intervenants"); + // Récupérer les milestones de gitea $giteamilestones=$this->giteaservice->getMilestones($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=".($viewclosed=="true"?"all":"open")); if(!is_array($giteamilestones)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); $keysort = array_column($giteamilestones, 'title'); array_multisort($keysort, SORT_DESC, $giteamilestones); - // Récupérer les labels de gitea - $gitealabels=$this->giteaservice->getLabels($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"]); - - // Formatter les labels non colomn/team/priority/type - /* - foreach($gitealabels as $key => $gitealabel) { - if(in_array($gitealabel->id,$giteacolumns)||in_array($gitealabel->id,$giteateams)||in_array($gitealabel->id,$giteaprioritys)||in_array($gitealabel->id,$giteatypes)) - unset($gitealabels[$key]); - } - */ + // Temps d'execution + $this->showtime(false,"Récupérer les milestones"); // Récupérer les issues de gitea - $giteaissues=$this->giteaservice->getIssues($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=".($viewclosed=="true"?"all":"open")); + $giteaissues=$this->giteaservice->getIssues($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],"?state=all".(!$forcereload?"&since=".urlencode($lastupdate->format(\DateTime::RFC3339_EXTENDED)):"")); if(!is_array($giteaissues)) die("Probleme de connexion avec gitea veuillez vous reconnecter"); + // Temps d'execution + $this->showtime(false,"Récupérer les issues"); + // Génération des issues $tbgiteaissues=[]; $fgscrumupdate=false; - $this->datescrumupdate=new \DateTime("01/01/1900"); - $this->datescrumupdate->setTimezone(new \DateTimeZone("UTC")); + $updatedates=[]; foreach($giteaissues as $giteaissue) { @@ -215,11 +238,13 @@ class ScrumRepository extends ServiceEntityRepository if($fgissueupdated) { $updateissue=new \DateTime(json_decode(json_encode($giteaissue), true)["updated_at"]); $updateissue->setTimezone(new \DateTimeZone("UTC")); + array_push($updatedates,$updateissue); - $closeissue=new \DateTime(json_decode(json_encode($giteaissue), true)["closed_at"]); - $closeissue->setTimezone(new \DateTimeZone("UTC")); - - $this->datescrumupdate=max($this->datescrumupdate,$updateissue,$closeissue); + if($giteaissue->closed_at) { + $closeissue=new \DateTime(json_decode(json_encode($giteaissue), true)["closed_at"]); + $closeissue->setTimezone(new \DateTimeZone("UTC")); + array_push($updatedates,$closeissue); + } $fgscrumupdate=true; $this->majissue($scrumissue,$giteaissue,false); @@ -228,30 +253,28 @@ class ScrumRepository extends ServiceEntityRepository array_push($tbgiteaissues,$giteaissue->number); } - // Placer à closed l'ensemble des issues vu comme open mais qui ne le sont plus - if($viewclosed=="false") { - $scrumissues=$scrum->getScrumissues(); - foreach($scrumissues as $scrumissue) { - if($scrumissue->getGiteastate()=="open"&&!in_array($scrumissue->getGiteanumber(),$tbgiteaissues)) { - $giteaissue=$this->giteaservice->getIssue($scrum->getGiteajson()["owner"]["login"],$scrum->getGiteajson()["name"],$scrumissue->getGiteanumber()); - $fgscrumupdate=true; - - // S'il ne trouve pas d'issue c'est qu'elle n'existe plus - if(!$giteaissue) { - // Faudrait supprimer mais pour l'instant pas touche - //dump("netrouvepasissue alors"); - //dump($scrumissue->getGiteanumber()); - } - // Sinon mise - else $this->majissue($scrumissue,$giteaissue,false); - } - } - } + // Temps d'execution + $this->showtime(false,"Traiter les issues"); if($fgscrumupdate) { - $scrum->setUpdatedate($this->datescrumupdate); - $this->_em->persist($scrum); + // Convertir les objets DateTime en timestamps + $timestamps = array_map(function($date) { + return $date->getTimestamp(); + }, $updatedates); + + // Trouver le timestamp le plus récent + $mostRecentTimestamp = max($timestamps); + + // Créer une nouvelle instance de DateTime à partir du timestamp le plus récent + $mostRecentDate = (new \DateTime())->setTimestamp($mostRecentTimestamp); + + // Mettre à jour la date update du scrum + $scrum->setUpdatedate($mostRecentDate); $this->_em->flush(); + + // Temps d'execution + $this->showtime(false,"Mettre à jour le scrum"); + } } @@ -315,4 +338,18 @@ class ScrumRepository extends ServiceEntityRepository $this->_em->persist($scrumissue); $this->_em->flush(); } + + private function getMaxDate(\DateTime ...$dates): \DateTime { + // Initialiser la date maximale avec la première date de la liste + $maxDate = $dates[0]; + + // Comparer chaque date avec la date maximale actuelle + foreach ($dates as $date) { + if ($date > $maxDate) { + $maxDate = $date; + } + } + + return $maxDate; + } } diff --git a/src/Service/giteaService.php b/src/Service/giteaService.php index 975be1f..d6dc5d4 100644 --- a/src/Service/giteaService.php +++ b/src/Service/giteaService.php @@ -222,6 +222,13 @@ class giteaService } else return $response->body; } + + public function getassignees($owner,$name) { + $apiurl = $this->url."/repos/$owner/$name/assignees"; + $response=$this->api("GET",$apiurl,null,$this->session->get("giteatoken")); + if(!$response||$response->code!="200") return false; + else return $response->body; + } public function getcollaborators($owner,$name) { $apiurl = $this->url."/repos/$owner/$name/collaborators"; @@ -252,8 +259,7 @@ class giteaService } public function getissues($owner,$name,$state="?state=open") { - $apiurl = $this->url."/repos/$owner/$name/issues".$state."&type=issues"; - + $apiurl = $this->url."/repos/$owner/$name/issues".$state.($state==""?"?":"&")."type=issues"; $page=1; $limit=20; $issues=[];