Signed-off-by: Joas Schilling <coding@schilljs.com>tags/v11.0RC2
@@ -30,6 +30,7 @@ use OCP\IGroup; | |||
use OCP\IGroupManager; | |||
use OCP\IUser; | |||
use OCP\IUserSession; | |||
use Sabre\VObject\Reader; | |||
/** | |||
* Class Backend | |||
@@ -70,7 +71,7 @@ class Backend { | |||
* @param array $properties | |||
*/ | |||
public function addCalendar($calendarId, array $properties) { | |||
$this->triggerActivity(Extension::SUBJECT_ADD, $calendarId, $properties); | |||
$this->triggerCalendarActivity(Extension::SUBJECT_ADD, $calendarId, $properties); | |||
} | |||
/** | |||
@@ -80,7 +81,7 @@ class Backend { | |||
* @param array $properties | |||
*/ | |||
public function updateCalendar($calendarId, array $properties) { | |||
$this->triggerActivity(Extension::SUBJECT_UPDATE, $calendarId, $properties); | |||
$this->triggerCalendarActivity(Extension::SUBJECT_UPDATE, $calendarId, $properties); | |||
} | |||
/** | |||
@@ -89,10 +90,9 @@ class Backend { | |||
* @param int $calendarId | |||
*/ | |||
public function deleteCalendar($calendarId) { | |||
$this->triggerActivity(Extension::SUBJECT_DELETE, $calendarId); | |||
$this->triggerCalendarActivity(Extension::SUBJECT_DELETE, $calendarId); | |||
} | |||
/** | |||
* Creates activities for all related users when a calendar was touched | |||
* | |||
@@ -100,7 +100,7 @@ class Backend { | |||
* @param int $calendarId | |||
* @param array $changedProperties | |||
*/ | |||
protected function triggerActivity($action, $calendarId, array $changedProperties = []) { | |||
protected function triggerCalendarActivity($action, $calendarId, array $changedProperties = []) { | |||
$properties = $this->calDavBackend->getCalendarById($calendarId); | |||
if (!isset($properties['principaluri'])) { | |||
return; | |||
@@ -362,6 +362,119 @@ class Backend { | |||
$this->activityManager->publish($event); | |||
} | |||
/** | |||
* Creates activities when a calendar object was created | |||
* | |||
* @param int $calendarId | |||
* @param string $objectUri | |||
*/ | |||
public function addCalendarObject($calendarId, $objectUri) { | |||
$this->triggerCalendarObjectActivity(Extension::SUBJECT_OBJECT_ADD, $calendarId, $objectUri); | |||
} | |||
/** | |||
* Creates activities when a calendar object was updated | |||
* | |||
* @param int $calendarId | |||
* @param string $objectUri | |||
*/ | |||
public function updateCalendarObject($calendarId, $objectUri) { | |||
$this->triggerCalendarObjectActivity(Extension::SUBJECT_OBJECT_UPDATE, $calendarId, $objectUri); | |||
} | |||
/** | |||
* Creates activities when a calendar object was deleted | |||
* | |||
* @param int $calendarId | |||
* @param string $objectUri | |||
*/ | |||
public function deleteCalendarObject($calendarId, $objectUri) { | |||
$this->triggerCalendarObjectActivity(Extension::SUBJECT_OBJECT_DELETE, $calendarId, $objectUri); | |||
} | |||
/** | |||
* Creates activities for all related users when a calendar was touched | |||
* | |||
* @param string $action | |||
* @param int $calendarId | |||
* @param string $objectUri | |||
*/ | |||
protected function triggerCalendarObjectActivity($action, $calendarId, $objectUri) { | |||
$properties = $this->calDavBackend->getCalendarById($calendarId); | |||
if (!isset($properties['principaluri'])) { | |||
return; | |||
} | |||
$principal = explode('/', $properties['principaluri']); | |||
$owner = $principal[2]; | |||
$currentUser = $this->userSession->getUser(); | |||
if ($currentUser instanceof IUser) { | |||
$currentUser = $currentUser->getUID(); | |||
} else { | |||
$currentUser = $owner; | |||
} | |||
$object = $this->getObjectNameAndType($calendarId, $objectUri); | |||
$action = $action . '_' . $object['type']; | |||
if ($object['type'] === 'todo' && strpos($action, Extension::SUBJECT_OBJECT_UPDATE) === 0 && $object['status'] === 'COMPLETED') { | |||
$action .= '_completed'; | |||
} else if ($object['type'] === 'todo' && strpos($action, Extension::SUBJECT_OBJECT_UPDATE) === 0 && $object['status'] === 'NEEDS-ACTION') { | |||
$action .= '_needs_action'; | |||
} | |||
$event = $this->activityManager->generateEvent(); | |||
$event->setApp('dav') | |||
->setObject(Extension::CALENDAR, $calendarId) | |||
->setType(Extension::CALENDAR) | |||
->setAuthor($currentUser); | |||
$users = $this->getUsersForCalendar($calendarId); | |||
$users[] = $owner; | |||
foreach ($users as $user) { | |||
$event->setAffectedUser($user) | |||
->setSubject( | |||
$user === $currentUser ? $action . '_self' : $action, | |||
[ | |||
$currentUser, | |||
$properties['{DAV:}displayname'], | |||
$object['name'], | |||
] | |||
); | |||
$this->activityManager->publish($event); | |||
} | |||
} | |||
/** | |||
* @param int $calendarId | |||
* @param string $objectUri | |||
* @return string[]|bool | |||
*/ | |||
protected function getObjectNameAndType($calendarId, $objectUri) { | |||
$data = $this->calDavBackend->getCalendarObject($calendarId, $objectUri); | |||
$vObject = Reader::read($data['calendardata']); | |||
$component = $componentType = null; | |||
foreach($vObject->getComponents() as $component) { | |||
if (in_array($component->name, ['VEVENT', 'VTODO'])) { | |||
$componentType = $component->name; | |||
break; | |||
} | |||
} | |||
if (!$componentType) { | |||
// Calendar objects must have a VEVENT or VTODO component | |||
return false; | |||
} | |||
if ($componentType === 'VEVENT') { | |||
return ['name' => (string) $component->SUMMARY, 'type' => 'event']; | |||
} | |||
return ['name' => (string) $component->SUMMARY, 'type' => 'todo', 'status' => (string) $component->STATUS]; | |||
} | |||
/** | |||
* Get all users that have access to a given calendar | |||
* | |||
@@ -391,6 +504,6 @@ class Backend { | |||
} | |||
} | |||
return $users; | |||
return array_unique($users); | |||
} | |||
} |
@@ -40,6 +40,10 @@ class Extension implements IExtension { | |||
const SUBJECT_UNSHARE_USER = 'calendar_user_unshare'; | |||
const SUBJECT_UNSHARE_GROUP = 'calendar_group_unshare'; | |||
const SUBJECT_OBJECT_ADD = 'object_add'; | |||
const SUBJECT_OBJECT_UPDATE = 'object_update'; | |||
const SUBJECT_OBJECT_DELETE = 'object_delete'; | |||
/** @var IFactory */ | |||
protected $languageFactory; | |||
@@ -138,6 +142,7 @@ class Extension implements IExtension { | |||
return (string) $l->t('%1$s updated calendar %2$s', $params); | |||
case self::SUBJECT_UPDATE . '_self': | |||
return (string) $l->t('You updated calendar %2$s', $params); | |||
case self::SUBJECT_SHARE_USER: | |||
return (string) $l->t('%1$s shared calendar %2$s with you', $params); | |||
case self::SUBJECT_SHARE_USER . '_you': | |||
@@ -152,6 +157,7 @@ class Extension implements IExtension { | |||
return (string) $l->t('%3$s unshared calendar %2$s from %1$s', $params); | |||
case self::SUBJECT_UNSHARE_USER . '_self': | |||
return (string) $l->t('%1$s unshared calendar %2$s from themselves', $params); | |||
case self::SUBJECT_SHARE_GROUP . '_you': | |||
return (string) $l->t('You shared calendar %2$s with group %1$s', $params); | |||
case self::SUBJECT_SHARE_GROUP . '_by': | |||
@@ -160,6 +166,42 @@ class Extension implements IExtension { | |||
return (string) $l->t('You unshared calendar %2$s from group %1$s', $params); | |||
case self::SUBJECT_UNSHARE_GROUP . '_by': | |||
return (string) $l->t('%3$s unshared calendar %2$s from group %1$s', $params); | |||
case self::SUBJECT_OBJECT_ADD . '_event': | |||
return (string) $l->t('%1$s created event %3$s in calendar %2$s', $params); | |||
case self::SUBJECT_OBJECT_ADD . '_event_self': | |||
return (string) $l->t('You created event %3$s in calendar %2$s', $params); | |||
case self::SUBJECT_OBJECT_DELETE . '_event': | |||
return (string) $l->t('%1$s deleted event %3$s from calendar %2$s', $params); | |||
case self::SUBJECT_OBJECT_DELETE . '_event_self': | |||
return (string) $l->t('You deleted event %3$s from calendar %2$s', $params); | |||
case self::SUBJECT_OBJECT_UPDATE . '_event': | |||
return (string) $l->t('%1$s updated event %3$s in calendar %2$s', $params); | |||
case self::SUBJECT_OBJECT_UPDATE . '_event_self': | |||
return (string) $l->t('You updated event %3$s in calendar %2$s', $params); | |||
case self::SUBJECT_OBJECT_ADD . '_todo': | |||
return (string) $l->t('%1$s created todo %3$s in list %2$s', $params); | |||
case self::SUBJECT_OBJECT_ADD . '_todo_self': | |||
return (string) $l->t('You created todo %3$s in list %2$s', $params); | |||
case self::SUBJECT_OBJECT_DELETE . '_todo': | |||
return (string) $l->t('%1$s deleted todo %3$s from list %2$s', $params); | |||
case self::SUBJECT_OBJECT_DELETE . '_todo_self': | |||
return (string) $l->t('You deleted todo %3$s from list %2$s', $params); | |||
case self::SUBJECT_OBJECT_UPDATE . '_todo': | |||
return (string) $l->t('%1$s updated todo %3$s in list %2$s', $params); | |||
case self::SUBJECT_OBJECT_UPDATE . '_todo_self': | |||
return (string) $l->t('You updated todo %3$s in list %2$s', $params); | |||
case self::SUBJECT_OBJECT_UPDATE . '_todo_completed': | |||
return (string) $l->t('%1$s solved todo %3$s in list %2$s', $params); | |||
case self::SUBJECT_OBJECT_UPDATE . '_todo_completed_self': | |||
return (string) $l->t('You solved todo %3$s in list %2$s', $params); | |||
case self::SUBJECT_OBJECT_UPDATE . '_todo_needs_action': | |||
return (string) $l->t('%1$s reopened todo %3$s in list %2$s', $params); | |||
case self::SUBJECT_OBJECT_UPDATE . '_todo_needs_action_self': | |||
return (string) $l->t('You reopened todo %3$s in list %2$s', $params); | |||
} | |||
return false; | |||
@@ -214,6 +256,30 @@ class Extension implements IExtension { | |||
//1 => 'calendar', | |||
2 => 'username', | |||
]; | |||
case self::SUBJECT_OBJECT_ADD . '_event': | |||
case self::SUBJECT_OBJECT_ADD . '_event_self': | |||
case self::SUBJECT_OBJECT_DELETE . '_event': | |||
case self::SUBJECT_OBJECT_DELETE . '_event_self': | |||
case self::SUBJECT_OBJECT_UPDATE . '_event': | |||
case self::SUBJECT_OBJECT_UPDATE . '_event_self': | |||
case self::SUBJECT_OBJECT_ADD . '_todo': | |||
case self::SUBJECT_OBJECT_ADD . '_todo_self': | |||
case self::SUBJECT_OBJECT_DELETE . '_todo': | |||
case self::SUBJECT_OBJECT_DELETE . '_todo_self': | |||
case self::SUBJECT_OBJECT_UPDATE . '_todo': | |||
case self::SUBJECT_OBJECT_UPDATE . '_todo_self': | |||
case self::SUBJECT_OBJECT_UPDATE . '_todo_completed': | |||
case self::SUBJECT_OBJECT_UPDATE . '_todo_completed_self': | |||
case self::SUBJECT_OBJECT_UPDATE . '_todo_needs_action': | |||
case self::SUBJECT_OBJECT_UPDATE . '_todo_needs_action_self': | |||
return [ | |||
0 => 'username', | |||
//1 => 'calendar', | |||
//2 => 'object', | |||
]; | |||
} | |||
} | |||
@@ -892,6 +892,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription | |||
]) | |||
->execute(); | |||
$this->activityBackend->addCalendarObject($calendarId, $objectUri); | |||
$this->addChange($calendarId, $objectUri, 1); | |||
return '"' . $extraData['etag'] . '"'; | |||
@@ -933,6 +934,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription | |||
->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri))) | |||
->execute(); | |||
$this->activityBackend->updateCalendarObject($calendarId, $objectUri); | |||
$this->addChange($calendarId, $objectUri, 2); | |||
return '"' . $extraData['etag'] . '"'; | |||
@@ -965,6 +967,8 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription | |||
* @return void | |||
*/ | |||
function deleteCalendarObject($calendarId, $objectUri) { | |||
$this->activityBackend->deleteCalendarObject($calendarId, $objectUri); | |||
$stmt = $this->db->prepare('DELETE FROM `*PREFIX*calendarobjects` WHERE `calendarid` = ? AND `uri` = ?'); | |||
$stmt->execute([$calendarId, $objectUri]); | |||