Skip to content

Commit

Permalink
Provide links to calendar in event creation/update activities
Browse files Browse the repository at this point in the history
Signed-off-by: Thomas Citharel <tcit@tcit.fr>
  • Loading branch information
tcitworld committed Jan 21, 2020
1 parent b6f3750 commit 4b908a4
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 28 deletions.
48 changes: 34 additions & 14 deletions apps/dav/lib/CalDAV/Activity/Backend.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@

namespace OCA\DAV\CalDAV\Activity;


use OCA\DAV\CalDAV\Activity\Provider\Calendar;
use OCA\DAV\CalDAV\Activity\Provider\Event;
use OCA\DAV\CalDAV\CalDavBackend;
Expand Down Expand Up @@ -442,27 +441,48 @@ public function onTouchCalendarObject($action, array $calendarData, array $share
continue;
}

$params = [
'actor' => $event->getAuthor(),
'calendar' => [
'id' => (int) $calendarData['id'],
'uri' => $calendarData['uri'],
'name' => $calendarData['{DAV:}displayname'],
],
'object' => [
'id' => $object['id'],
'name' => $classification === CalDavBackend::CLASSIFICATION_CONFIDENTIAL && $user !== $owner ? 'Busy' : $object['name'],
'classified' => $classification === CalDavBackend::CLASSIFICATION_CONFIDENTIAL && $user !== $owner,
],
];

if ($object['type'] === 'event' && strpos($action, Event::SUBJECT_OBJECT_DELETE) === false && $this->checkIfCalendarAppIsActivatedAndCorrectVersion()) {
$objectId = base64_encode('/remote.php/dav/calendars/' . $owner . '/' . $calendarData['uri'] . '/' . $objectData['uri']);
$timeRange = (new \DateTime())->setTimestamp($objectData['firstoccurence']);
$params['object']['link'] = [
'view' => 'dayGridMonth',
'timeRange' => $timeRange->format('Y-m-d'),
'mode' => 'sidebar',
'objectId' => $objectId,
'recurrenceId' => $objectData['firstoccurence']
];
}


$event->setAffectedUser($user)
->setSubject(
$user === $currentUser ? $action . '_self' : $action,
[
'actor' => $event->getAuthor(),
'calendar' => [
'id' => (int) $calendarData['id'],
'uri' => $calendarData['uri'],
'name' => $calendarData['{DAV:}displayname'],
],
'object' => [
'id' => $object['id'],
'name' => $classification === CalDavBackend::CLASSIFICATION_CONFIDENTIAL && $user !== $owner ? 'Busy' : $object['name'],
'classified' => $classification === CalDavBackend::CLASSIFICATION_CONFIDENTIAL && $user !== $owner,
],
]
$params
);

$this->activityManager->publish($event);
}
}

private function checkIfCalendarAppIsActivatedAndCorrectVersion(): bool {
$appManager = \OC::$server->getAppManager();
return $appManager->isEnabledForUser('calendar') && version_compare($appManager->getAppVersion('calendar'), '2.0.0') >= 0;
}

/**
* @param array $objectData
* @return string[]|bool
Expand Down
22 changes: 20 additions & 2 deletions apps/dav/lib/CalDAV/Activity/Provider/Base.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,14 @@

namespace OCA\DAV\CalDAV\Activity\Provider;

use OC_App;
use OCA\DAV\CalDAV\CalDavBackend;
use OCP\Activity\IEvent;
use OCP\Activity\IProvider;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\IUserManager;

Expand All @@ -46,13 +48,18 @@ abstract class Base implements IProvider {
/** @var string[] */
protected $groupDisplayNames = [];

/** @var IURLGenerator */
protected $url;

/**
* @param IUserManager $userManager
* @param IGroupManager $groupManager
* @param IURLGenerator $urlGenerator
*/
public function __construct(IUserManager $userManager, IGroupManager $groupManager) {
public function __construct(IUserManager $userManager, IGroupManager $groupManager, IURLGenerator $urlGenerator) {
$this->userManager = $userManager;
$this->groupManager = $groupManager;
$this->url = $urlGenerator;
}

/**
Expand Down Expand Up @@ -80,11 +87,22 @@ protected function generateObjectParameter($eventData) {
throw new \InvalidArgumentException();
}

return [
$params = [
'type' => 'calendar-event',
'id' => $eventData['id'],
'name' => $eventData['name'],

];
if (isset($eventData['link']) && \OC::$server->getAppManager()->isEnabledForUser('calendar')) {
try {
// The calendar app needs to be manually loaded for the routes to be loaded for some reason
OC_App::loadApp('calendar');
$params['link'] = $this->url->linkToRouteAbsolute('calendar.view.indexview.timerange.edit', $eventData['link']);
} catch (\Exception $error) {
// Do nothing
}
}
return $params;
}

/**
Expand Down
6 changes: 1 addition & 5 deletions apps/dav/lib/CalDAV/Activity/Provider/Calendar.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,6 @@ class Calendar extends Base {
/** @var IL10N */
protected $l;

/** @var IURLGenerator */
protected $url;

/** @var IManager */
protected $activityManager;

Expand All @@ -71,9 +68,8 @@ class Calendar extends Base {
* @param IEventMerger $eventMerger
*/
public function __construct(IFactory $languageFactory, IURLGenerator $url, IManager $activityManager, IUserManager $userManager, IGroupManager $groupManager, IEventMerger $eventMerger) {
parent::__construct($userManager, $groupManager);
parent::__construct($userManager, $groupManager, $url);
$this->languageFactory = $languageFactory;
$this->url = $url;
$this->activityManager = $activityManager;
$this->eventMerger = $eventMerger;
}
Expand Down
6 changes: 1 addition & 5 deletions apps/dav/lib/CalDAV/Activity/Provider/Event.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,6 @@ class Event extends Base {
/** @var IL10N */
protected $l;

/** @var IURLGenerator */
protected $url;

/** @var IManager */
protected $activityManager;

Expand All @@ -64,9 +61,8 @@ class Event extends Base {
* @param IEventMerger $eventMerger
*/
public function __construct(IFactory $languageFactory, IURLGenerator $url, IManager $activityManager, IUserManager $userManager, IGroupManager $groupManager, IEventMerger $eventMerger) {
parent::__construct($userManager, $groupManager);
parent::__construct($userManager, $groupManager, $url);
$this->languageFactory = $languageFactory;
$this->url = $url;
$this->activityManager = $activityManager;
$this->eventMerger = $eventMerger;
}
Expand Down
3 changes: 2 additions & 1 deletion apps/dav/lib/CalDAV/CalDavBackend.php
Original file line number Diff line number Diff line change
Expand Up @@ -955,7 +955,7 @@ public function getCalendarObjects($id, $calendarType=self::CALENDAR_TYPE_CALEND
*/
public function getCalendarObject($id, $objectUri, $calendarType=self::CALENDAR_TYPE_CALENDAR) {
$query = $this->db->getQueryBuilder();
$query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification'])
$query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'firstoccurence', 'classification'])
->from('calendarobjects')
->where($query->expr()->eq('calendarid', $query->createNamedParameter($id)))
->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri)))
Expand All @@ -976,6 +976,7 @@ public function getCalendarObject($id, $objectUri, $calendarType=self::CALENDAR_
'size' => (int)$row['size'],
'calendardata' => $this->readBlob($row['calendardata']),
'component' => strtolower($row['componenttype']),
'firstoccurence'=> (int)$row['firstoccurence'],
'classification'=> (int)$row['classification']
];
}
Expand Down
8 changes: 7 additions & 1 deletion apps/dav/tests/unit/CalDAV/Activity/Provider/BaseTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
use OCP\Activity\IProvider;
use OCP\IGroupManager;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\IUserManager;
use Test\TestCase;
Expand All @@ -42,17 +43,22 @@ class BaseTest extends TestCase {
/** @var IGroupManager|\PHPUnit_Framework_MockObject_MockObject */
protected $groupManager;

/** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */
protected $url;

/** @var IProvider|Base|\PHPUnit_Framework_MockObject_MockObject */
protected $provider;

protected function setUp(): void {
parent::setUp();
$this->userManager = $this->createMock(IUserManager::class);
$this->groupManager = $this->createMock(IGroupManager::class);
$this->url = $this->createMock(IURLGenerator::class);
$this->provider = $this->getMockBuilder(Base::class)
->setConstructorArgs([
$this->userManager,
$this->groupManager
$this->groupManager,
$this->url,
])
->setMethods(['parse'])
->getMock();
Expand Down
6 changes: 6 additions & 0 deletions lib/public/RichObjectStrings/Definitions.php
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,12 @@ class Definitions {
'description' => 'The display name of the event which should be used in the visual representation',
'example' => 'Workout',
],
'link' => [
'since' => '19.0.0',
'required' => false,
'description' => 'A link to the page displaying the calendar',
'example' => 'http://localhost/index.php/apps/calendar/dayGridMonth/2020-01-20/edit/sidebar/base64string/1579046400'
]
],
],
'call' => [
Expand Down

0 comments on commit 4b908a4

Please sign in to comment.