getContainer()->getPermissionsService()->currentUserCanWrite(Entities::SERVICES)) { throw new AccessDeniedException('You are not allowed to update service.'); } $result = new CommandResult(); $this->checkMandatoryFields($command); $service = ServiceFactory::create($command->getFields()); if (!$service instanceof Service) { $result->setResult(CommandResult::RESULT_ERROR); $result->setMessage('Unable to update service.'); return $result; } /** @var ServiceRepository $serviceRepository */ $serviceRepository = $this->container->get('domain.bookable.service.repository'); /** @var ExtraRepository $extraRepository */ $extraRepository = $this->container->get('domain.bookable.extra.repository'); /** @var ProviderServiceRepository $providerServiceRepo */ $providerServiceRepo = $this->container->get('domain.bookable.service.providerService.repository'); /** @var ProviderRepository $providerRepository */ $providerRepository = $this->container->get('domain.users.providers.repository'); /** @var BookableApplicationService $bookableService */ $bookableService = $this->container->get('application.bookable.service'); /** @var GalleryApplicationService $galleryService */ $galleryService = $this->container->get('application.gallery.service'); $serviceRepository->beginTransaction(); $serviceId = $command->getArg('id'); if ($command->getField('applyGlobally') && !$providerServiceRepo->updateServiceForAllProviders($service, $serviceId)) { $serviceRepository->rollback(); } if (!$serviceRepository->update($serviceId, $service)) { $serviceRepository->rollback(); } $providers = $command->getField('providers') ? $providerRepository->getFiltered(['providers' => $command->getField('providers')], 0) : new Collection(); $bookableService->manageProvidersForServiceUpdate( $service, $providers, $serviceRepository, $providerServiceRepo ); $bookableService->manageExtrasForServiceUpdate($service, $serviceRepository, $extraRepository); $galleryService->manageGalleryForEntityUpdate($service->getGallery(), $serviceId, Entities::SERVICE); $serviceRepository->commit(); $result->setResult(CommandResult::RESULT_SUCCESS); $result->setMessage('Successfully updated service.'); $result->setData( [ Entities::SERVICE => $service->toArray(), ] ); return $result; } }