Merge pull request #43904 from nextcloud/fix/dav/dirty-caldav-updates

fix(dav): Fix atomic calendar/subscription updates
pull/44014/head
Richard Steinmetz 3 months ago committed by GitHub
commit 00e0fa48a0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -848,24 +848,24 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
* @return void * @return void
*/ */
public function updateCalendar($calendarId, PropPatch $propPatch) { public function updateCalendar($calendarId, PropPatch $propPatch) {
$this->atomic(function () use ($calendarId, $propPatch) { $supportedProperties = array_keys($this->propertyMap);
$supportedProperties = array_keys($this->propertyMap); $supportedProperties[] = '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp';
$supportedProperties[] = '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp';
$propPatch->handle($supportedProperties, function ($mutations) use ($calendarId) {
$propPatch->handle($supportedProperties, function ($mutations) use ($calendarId) { $newValues = [];
$newValues = []; foreach ($mutations as $propertyName => $propertyValue) {
foreach ($mutations as $propertyName => $propertyValue) { switch ($propertyName) {
switch ($propertyName) { case '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp':
case '{' . Plugin::NS_CALDAV . '}schedule-calendar-transp': $fieldName = 'transparent';
$fieldName = 'transparent'; $newValues[$fieldName] = (int) ($propertyValue->getValue() === 'transparent');
$newValues[$fieldName] = (int) ($propertyValue->getValue() === 'transparent'); break;
break; default:
default: $fieldName = $this->propertyMap[$propertyName][0];
$fieldName = $this->propertyMap[$propertyName][0]; $newValues[$fieldName] = $propertyValue;
$newValues[$fieldName] = $propertyValue; break;
break;
}
} }
}
[$calendarData, $shares] = $this->atomic(function () use ($calendarId, $newValues) {
$query = $this->db->getQueryBuilder(); $query = $this->db->getQueryBuilder();
$query->update('calendars'); $query->update('calendars');
foreach ($newValues as $fieldName => $value) { foreach ($newValues as $fieldName => $value) {
@ -878,11 +878,13 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$calendarData = $this->getCalendarById($calendarId); $calendarData = $this->getCalendarById($calendarId);
$shares = $this->getShares($calendarId); $shares = $this->getShares($calendarId);
$this->dispatcher->dispatchTyped(new CalendarUpdatedEvent($calendarId, $calendarData, $shares, $mutations)); return [$calendarData, $shares];
}, $this->db);
return true; $this->dispatcher->dispatchTyped(new CalendarUpdatedEvent($calendarId, $calendarData, $shares, $mutations));
});
}, $this->db); return true;
});
} }
/** /**
@ -2570,22 +2572,22 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
* @return void * @return void
*/ */
public function updateSubscription($subscriptionId, PropPatch $propPatch) { public function updateSubscription($subscriptionId, PropPatch $propPatch) {
$this->atomic(function () use ($subscriptionId, $propPatch) { $supportedProperties = array_keys($this->subscriptionPropertyMap);
$supportedProperties = array_keys($this->subscriptionPropertyMap); $supportedProperties[] = '{http://calendarserver.org/ns/}source';
$supportedProperties[] = '{http://calendarserver.org/ns/}source';
$propPatch->handle($supportedProperties, function ($mutations) use ($subscriptionId) {
$propPatch->handle($supportedProperties, function ($mutations) use ($subscriptionId) { $newValues = [];
$newValues = [];
foreach ($mutations as $propertyName => $propertyValue) {
foreach ($mutations as $propertyName => $propertyValue) { if ($propertyName === '{http://calendarserver.org/ns/}source') {
if ($propertyName === '{http://calendarserver.org/ns/}source') { $newValues['source'] = $propertyValue->getHref();
$newValues['source'] = $propertyValue->getHref(); } else {
} else { $fieldName = $this->subscriptionPropertyMap[$propertyName][0];
$fieldName = $this->subscriptionPropertyMap[$propertyName][0]; $newValues[$fieldName] = $propertyValue;
$newValues[$fieldName] = $propertyValue;
}
} }
}
$subscriptionRow = $this->atomic(function () use ($subscriptionId, $newValues) {
$query = $this->db->getQueryBuilder(); $query = $this->db->getQueryBuilder();
$query->update('calendarsubscriptions') $query->update('calendarsubscriptions')
->set('lastmodified', $query->createNamedParameter(time())); ->set('lastmodified', $query->createNamedParameter(time()));
@ -2595,12 +2597,13 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
$query->where($query->expr()->eq('id', $query->createNamedParameter($subscriptionId))) $query->where($query->expr()->eq('id', $query->createNamedParameter($subscriptionId)))
->executeStatement(); ->executeStatement();
$subscriptionRow = $this->getSubscriptionById($subscriptionId); return $this->getSubscriptionById($subscriptionId);
$this->dispatcher->dispatchTyped(new SubscriptionUpdatedEvent((int)$subscriptionId, $subscriptionRow, [], $mutations)); }, $this->db);
return true; $this->dispatcher->dispatchTyped(new SubscriptionUpdatedEvent((int)$subscriptionId, $subscriptionRow, [], $mutations));
});
}, $this->db); return true;
});
} }
/** /**

Loading…
Cancel
Save