diff --git a/src/Controller/AdminController.php b/src/Controller/AdminController.php index 48db35b..1dcb351 100644 --- a/src/Controller/AdminController.php +++ b/src/Controller/AdminController.php @@ -442,7 +442,7 @@ class AdminController extends AbstractController */ public function calendarShares(ManagerRegistry $doctrine, string $username, string $calendarid, TranslatorInterface $trans) { - $instances = $doctrine->getRepository(CalendarInstance::class)->findSharedInstancesOfInstance($calendarid); + $instances = $doctrine->getRepository(CalendarInstance::class)->findSharedInstancesOfInstance($calendarid, true); $response = []; foreach ($instances as $instance) { @@ -535,9 +535,19 @@ class AdminController extends AbstractController foreach ($instance->getCalendar()->getChanges() ?? [] as $change) { $entityManager->remove($change); } - $entityManager->remove($instance->getCalendar()); + + // Remove the original calendar instance $entityManager->remove($instance); + // Remove shared instances + $sharedInstances = $doctrine->getRepository(CalendarInstance::class)->findSharedInstancesOfInstance($instance->getCalendar()->getId(), false); + foreach ($sharedInstances as $sharedInstance) { + $entityManager->remove($sharedInstance); + } + + // Finally remove the calendar itself + $entityManager->remove($instance->getCalendar()); + $entityManager->flush(); $this->addFlash('success', $trans->trans('calendar.deleted')); diff --git a/src/Repository/CalendarInstanceRepository.php b/src/Repository/CalendarInstanceRepository.php index ef73bd4..f84a754 100644 --- a/src/Repository/CalendarInstanceRepository.php +++ b/src/Repository/CalendarInstanceRepository.php @@ -23,17 +23,25 @@ class CalendarInstanceRepository extends ServiceEntityRepository /** * @return CalendarInstance[] Returns an array of CalendarInstance objects */ - public function findSharedInstancesOfInstance(int $calendarId) + public function findSharedInstancesOfInstance(int $calendarId, bool $withCalendar = false) { - return $this->createQueryBuilder('c') + $query = $this->createQueryBuilder('c') ->leftJoin(Principal::class, 'p', \Doctrine\ORM\Query\Expr\Join::WITH, 'c.principalUri = p.uri') - ->addSelect('p.displayName', 'p.email') ->where('c.calendar = :id') ->setParameter('id', $calendarId) ->andWhere('c.access != :ownerAccess') - ->setParameter('ownerAccess', CalendarInstance::ACCESS_OWNER) - ->getQuery() - ->getArrayResult(); + ->setParameter('ownerAccess', CalendarInstance::ACCESS_OWNER); + + if ($withCalendar) { + // Returns CalendarInstances as arrays, with displayName and email of the owner + return $query->addSelect('p.displayName', 'p.email') + ->getQuery() + ->getArrayResult(); + } else { + // Returns CalendarInstances as objects + return $query->getQuery() + ->getResult(); + } } /**