diff --git a/apps/dav/lib/CalDAV/CalDavBackend.php b/apps/dav/lib/CalDAV/CalDavBackend.php index 43a22651747ad..1e6d9040fc875 100644 --- a/apps/dav/lib/CalDAV/CalDavBackend.php +++ b/apps/dav/lib/CalDAV/CalDavBackend.php @@ -9,6 +9,7 @@ use DateTime; use DateTimeImmutable; use DateTimeInterface; +use OC\DB\QueryBuilder\Literal; use OCA\DAV\AppInfo\Application; use OCA\DAV\CalDAV\Sharing\Backend; use OCA\DAV\Connector\Sabre\Principal; @@ -177,7 +178,9 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription */ protected array $userDisplayNames; + private string $dbObjectsTable = 'calendarobjects'; private string $dbObjectPropertiesTable = 'calendarobjects_props'; + private string $dbObjectInvitationsTable = 'calendar_invitations'; private array $cachedObjects = []; public function __construct( @@ -875,6 +878,8 @@ public function deleteCalendar($calendarId, bool $forceDeletePermanently = false $calendarData = $this->getCalendarById($calendarId); $shares = $this->getShares($calendarId); + $this->purgeCalendarInvitations($calendarId); + $qbDeleteCalendarObjectProps = $this->db->getQueryBuilder(); $qbDeleteCalendarObjectProps->delete($this->dbObjectPropertiesTable) ->where($qbDeleteCalendarObjectProps->expr()->eq('calendarid', $qbDeleteCalendarObjectProps->createNamedParameter($calendarId))) @@ -1142,7 +1147,7 @@ public function getCalendarObject($calendarId, $objectUri, int $calendarType = s return $this->cachedObjects[$key]; } $query = $this->db->getQueryBuilder(); - $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification', 'deleted_at']) + $query->select(['id', 'uri', 'uid', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification', 'deleted_at']) ->from('calendarobjects') ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId))) ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri))) @@ -1164,6 +1169,7 @@ private function rowToCalendarObject(array $row): array { return [ 'id' => $row['id'], 'uri' => $row['uri'], + 'uid' => $row['uid'], 'lastmodified' => $row['lastmodified'], 'etag' => '"' . $row['etag'] . '"', 'calendarid' => $row['calendarid'], @@ -1484,6 +1490,8 @@ public function deleteCalendarObject($calendarId, $objectUri, $calendarType = se $this->purgeProperties($calendarId, $data['id']); + $this->purgeObjectInvitations($data['uid']); + if ($calendarType === self::CALENDAR_TYPE_CALENDAR) { $calendarRow = $this->getCalendarById($calendarId); $shares = $this->getShares($calendarId); @@ -1680,7 +1688,7 @@ public function calendarQuery($calendarId, array $filters, $calendarType = self: } } $query = $this->db->getQueryBuilder(); - $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification', 'deleted_at']) + $query->select(['id', 'uri', 'uid', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification', 'deleted_at']) ->from('calendarobjects') ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId))) ->andWhere($query->expr()->eq('calendartype', $query->createNamedParameter($calendarType))) @@ -3527,4 +3535,40 @@ private function rowToSubscription($row, array $subscription): array { } return $subscription; } + + /** + * delete all invitations from a given calendar + * + * @since 31.0.0 + * + * @param int $calendarId + */ + protected function purgeCalendarInvitations(int $calendarId) { + // select all calendar object uid's + $cmd1 = $this->db->getQueryBuilder(); + $cmd1->select('uid') + ->from($this->dbObjectsTable) + ->where('calendarid = :cid'); + // delete all links that match object uid's + $cmd2 = $this->db->getQueryBuilder(); + $cmd2->delete($this->dbObjectInvitationsTable) + ->where($cmd2->expr()->in('uid', new Literal($cmd1->getSQL()))) + ->setParameter('cid', $calendarId); + + $cmd2->executeStatement(); + } + + /** + * delete all invitations from a given calendar event + * + * @since 31.0.0 + * + * @param string $eventId UID of the event + */ + protected function purgeObjectInvitations(string $eventId) { + $query = $this->db->getQueryBuilder(); + $query->delete($this->dbObjectInvitationsTable) + ->where($query->expr()->eq('uid', $query->createNamedParameter($eventId))); + $query->executeStatement(); + } }