You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Event.php 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2016 Joas Schilling <coding@schilljs.com>
  4. *
  5. * @author Joas Schilling <coding@schilljs.com>
  6. * @author Julius Härtl <jus@bitgrid.net>
  7. *
  8. * @license GNU AGPL version 3 or any later version
  9. *
  10. * This program is free software: you can redistribute it and/or modify
  11. * it under the terms of the GNU Affero General Public License as
  12. * published by the Free Software Foundation, either version 3 of the
  13. * License, or (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU Affero General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU Affero General Public License
  21. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  22. *
  23. */
  24. namespace OCA\DAV\CalDAV\Activity\Provider;
  25. use OCP\Activity\IEvent;
  26. use OCP\Activity\IEventMerger;
  27. use OCP\Activity\IManager;
  28. use OCP\IGroupManager;
  29. use OCP\IL10N;
  30. use OCP\IURLGenerator;
  31. use OCP\IUserManager;
  32. use OCP\L10N\IFactory;
  33. class Event extends Base {
  34. const SUBJECT_OBJECT_ADD = 'object_add';
  35. const SUBJECT_OBJECT_UPDATE = 'object_update';
  36. const SUBJECT_OBJECT_DELETE = 'object_delete';
  37. /** @var IFactory */
  38. protected $languageFactory;
  39. /** @var IL10N */
  40. protected $l;
  41. /** @var IURLGenerator */
  42. protected $url;
  43. /** @var IManager */
  44. protected $activityManager;
  45. /** @var IEventMerger */
  46. protected $eventMerger;
  47. /**
  48. * @param IFactory $languageFactory
  49. * @param IURLGenerator $url
  50. * @param IManager $activityManager
  51. * @param IUserManager $userManager
  52. * @param IGroupManager $groupManager
  53. * @param IEventMerger $eventMerger
  54. */
  55. public function __construct(IFactory $languageFactory, IURLGenerator $url, IManager $activityManager, IUserManager $userManager, IGroupManager $groupManager, IEventMerger $eventMerger) {
  56. parent::__construct($userManager, $groupManager);
  57. $this->languageFactory = $languageFactory;
  58. $this->url = $url;
  59. $this->activityManager = $activityManager;
  60. $this->eventMerger = $eventMerger;
  61. }
  62. /**
  63. * @param string $language
  64. * @param IEvent $event
  65. * @param IEvent|null $previousEvent
  66. * @return IEvent
  67. * @throws \InvalidArgumentException
  68. * @since 11.0.0
  69. */
  70. public function parse($language, IEvent $event, IEvent $previousEvent = null) {
  71. if ($event->getApp() !== 'dav' || $event->getType() !== 'calendar_event') {
  72. throw new \InvalidArgumentException();
  73. }
  74. $this->l = $this->languageFactory->get('dav', $language);
  75. if ($this->activityManager->getRequirePNG()) {
  76. $event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/calendar-dark.png')));
  77. } else {
  78. $event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/calendar.svg')));
  79. }
  80. if ($event->getSubject() === self::SUBJECT_OBJECT_ADD . '_event') {
  81. $subject = $this->l->t('{actor} created event {event} in calendar {calendar}');
  82. } elseif ($event->getSubject() === self::SUBJECT_OBJECT_ADD . '_event_self') {
  83. $subject = $this->l->t('You created event {event} in calendar {calendar}');
  84. } elseif ($event->getSubject() === self::SUBJECT_OBJECT_DELETE . '_event') {
  85. $subject = $this->l->t('{actor} deleted event {event} from calendar {calendar}');
  86. } elseif ($event->getSubject() === self::SUBJECT_OBJECT_DELETE . '_event_self') {
  87. $subject = $this->l->t('You deleted event {event} from calendar {calendar}');
  88. } elseif ($event->getSubject() === self::SUBJECT_OBJECT_UPDATE . '_event') {
  89. $subject = $this->l->t('{actor} updated event {event} in calendar {calendar}');
  90. } elseif ($event->getSubject() === self::SUBJECT_OBJECT_UPDATE . '_event_self') {
  91. $subject = $this->l->t('You updated event {event} in calendar {calendar}');
  92. } else {
  93. throw new \InvalidArgumentException();
  94. }
  95. $parsedParameters = $this->getParameters($event);
  96. $this->setSubjects($event, $subject, $parsedParameters);
  97. $event = $this->eventMerger->mergeEvents('event', $event, $previousEvent);
  98. return $event;
  99. }
  100. /**
  101. * @param IEvent $event
  102. * @return array
  103. */
  104. protected function getParameters(IEvent $event) {
  105. $subject = $event->getSubject();
  106. $parameters = $event->getSubjectParameters();
  107. // Nextcloud 13+
  108. if (isset($parameters['calendar'])) {
  109. switch ($subject) {
  110. case self::SUBJECT_OBJECT_ADD . '_event':
  111. case self::SUBJECT_OBJECT_DELETE . '_event':
  112. case self::SUBJECT_OBJECT_UPDATE . '_event':
  113. return [
  114. 'actor' => $this->generateUserParameter($parameters['actor']),
  115. 'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l),
  116. 'event' => $this->generateClassifiedObjectParameter($parameters['object']),
  117. ];
  118. case self::SUBJECT_OBJECT_ADD . '_event_self':
  119. case self::SUBJECT_OBJECT_DELETE . '_event_self':
  120. case self::SUBJECT_OBJECT_UPDATE . '_event_self':
  121. return [
  122. 'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l),
  123. 'event' => $this->generateClassifiedObjectParameter($parameters['object']),
  124. ];
  125. }
  126. }
  127. // Legacy - Do NOT Remove unless necessary
  128. // Removing this will break parsing of activities that were created on
  129. // Nextcloud 12, so we should keep this as long as it's acceptable.
  130. // Otherwise if people upgrade over multiple releases in a short period,
  131. // they will get the dead entries in their stream.
  132. switch ($subject) {
  133. case self::SUBJECT_OBJECT_ADD . '_event':
  134. case self::SUBJECT_OBJECT_DELETE . '_event':
  135. case self::SUBJECT_OBJECT_UPDATE . '_event':
  136. return [
  137. 'actor' => $this->generateUserParameter($parameters[0]),
  138. 'calendar' => $this->generateLegacyCalendarParameter((int)$event->getObjectId(), $parameters[1]),
  139. 'event' => $this->generateObjectParameter($parameters[2]),
  140. ];
  141. case self::SUBJECT_OBJECT_ADD . '_event_self':
  142. case self::SUBJECT_OBJECT_DELETE . '_event_self':
  143. case self::SUBJECT_OBJECT_UPDATE . '_event_self':
  144. return [
  145. 'calendar' => $this->generateLegacyCalendarParameter((int)$event->getObjectId(), $parameters[1]),
  146. 'event' => $this->generateObjectParameter($parameters[2]),
  147. ];
  148. }
  149. throw new \InvalidArgumentException();
  150. }
  151. private function generateClassifiedObjectParameter(array $eventData) {
  152. $parameter = $this->generateObjectParameter($eventData);
  153. if (!empty($eventData['classified'])) {
  154. $parameter['name'] = $this->l->t('Busy');
  155. }
  156. return $parameter;
  157. }
  158. }