entityManager = $entityManager; $this->projectRepository = $projectRepository; $this->exportsRepository = $exportsRepository; $this->story = $story; $this->dataDiff = $dataDiff; $this->draftQuery = $draftQuery; } public function update(ProjectUpdateView $projectUpdateView, bool $lastStep, $documents = []): ?ProjectReadView { $project = $this->projectRepository->findById($projectUpdateView->id); //SAVE UPLOADED DOCUMENTS IN DATABASE foreach ($documents as $document) { $projectDocument = new ProjectDocument(); $projectDocument->setFilename($document['filename']); $projectDocument->setMimeType($document['mimeType']); $projectDocument->setSize($document['size']); $projectDocument->setPath(str_replace('/var/www/html/public', '', $document['path'])); $projectDocument->setProject($project); $this->entityManager->persist($projectDocument); } $this->entityManager->flush(); //END SAVE UPLOADED DOCUMENTS IN DATABASE $project->setName($projectUpdateView->name); $project->setDescription($projectUpdateView->description); $project->setProductsImport($projectUpdateView->productsImport); $project->setArchiving(0); if ($project->getCurrentStep() === null) { $project->setCurrentStep(0); } $this->manageGroups($projectUpdateView, $project); $diff = $this->projectRepository->diff($project); $projectEntity = $this->projectRepository->update($project); if ($projectEntity) { if (!empty($diff)) { $this->story->execute('Step 1', $this->dataDiff->viewDiff($diff), $projectUpdateView->id, get_class($project), 0); } $export = $this->exportsRepository->list($projectEntity->getId()); if (empty($export)) { $this->addExportByDefault($projectEntity); } if (isset($lastStep) && $lastStep) { $this->draftQuery->changeDraft($projectUpdateView->id); } $projectDocuments = []; foreach ($project->getProjectDocuments() as $projectDocument) { $projectDocuments[] = new ProjectDocumentView( $projectDocument->getId(), $projectDocument->getFilename(), $projectDocument->getSize(), $projectDocument->getMimeType() ); } $result = new ProjectReadView( $project->getId(), $project->getName(), $project->getDescription() ?: '', $project->getDraft(), $project->getProductsImport(), $project->getIdUser(), $project->getIdOwnerGroup(), $projectDocuments, !empty($project->getFlux()) ? true : false ); //$result = $projectEntity->getId(); } else { $result = null; } return $result; } private function addExportByDefault(Project $project): void { $exports = new Exports(); $exports->setName('Default'); $exports->setExportType(null); $exports->setProject($project); $this->exportsRepository->save($exports); } /** * @param ProjectUpdateView $view * @param Project $entity * * @return void */ private function manageGroups(ProjectUpdateView $view, Project $entity): void { $idOwnerGroup = $view->idOwnerGroup; $idsAssociatedGroups = $view->idsAssociatedGroups; $idOwnerGroup ? $idsAssociatedGroups[] = $idOwnerGroup : null; $entity->setIdOwnerGroup($idOwnerGroup); $groups = $entity->getGroupProject()->toArray(); $groupIds = array_map(function ($group) use ($idsAssociatedGroups, $entity) { $id = $group->getGroup(); if (!in_array($id, $idsAssociatedGroups)) { $entity->removeGroupProject($group); } return $id; }, $groups); $newGroupsIds = array_diff($idsAssociatedGroups, $groupIds); foreach ($newGroupsIds as $newGroupId) { $newGroup = new GroupProject(); $newGroup->setGroup($newGroupId); $entity->addGroupProject($newGroup); } } }