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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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 OCA\DAV\CalDAV\CalDavBackend;
  26. use OCP\Activity\IEvent;
  27. use OCP\Activity\IEventMerger;
  28. use OCP\Activity\IManager;
  29. use OCP\IGroupManager;
  30. use OCP\IL10N;
  31. use OCP\IURLGenerator;
  32. use OCP\IUserManager;
  33. use OCP\L10N\IFactory;
  34. class Event extends Base {
  35. const SUBJECT_OBJECT_ADD = 'object_add';
  36. const SUBJECT_OBJECT_UPDATE = 'object_update';
  37. const SUBJECT_OBJECT_DELETE = 'object_delete';
  38. /** @var IFactory */
  39. protected $languageFactory;
  40. /** @var IL10N */
  41. protected $l;
  42. /** @var IURLGenerator */
  43. protected $url;
  44. /** @var IManager */
  45. protected $activityManager;
  46. /** @var IEventMerger */
  47. protected $eventMerger;
  48. /**
  49. * @param IFactory $languageFactory
  50. * @param IURLGenerator $url
  51. * @param IManager $activityManager
  52. * @param IUserManager $userManager
  53. * @param IGroupManager $groupManager
  54. * @param IEventMerger $eventMerger
  55. */
  56. public function __construct(IFactory $languageFactory, IURLGenerator $url, IManager $activityManager, IUserManager $userManager, IGroupManager $groupManager, IEventMerger $eventMerger) {
  57. parent::__construct($userManager, $groupManager);
  58. $this->languageFactory = $languageFactory;
  59. $this->url = $url;
  60. $this->activityManager = $activityManager;
  61. $this->eventMerger = $eventMerger;
  62. }
  63. /**
  64. * @param string $language
  65. * @param IEvent $event
  66. * @param IEvent|null $previousEvent
  67. * @return IEvent
  68. * @throws \InvalidArgumentException
  69. * @since 11.0.0
  70. */
  71. public function parse($language, IEvent $event, IEvent $previousEvent = null) {
  72. if ($event->getApp() !== 'dav' || $event->getType() !== 'calendar_event') {
  73. throw new \InvalidArgumentException();
  74. }
  75. $this->l = $this->languageFactory->get('dav', $language);
  76. if ($this->activityManager->getRequirePNG()) {
  77. $event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/calendar-dark.png')));
  78. } else {
  79. $event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/calendar.svg')));
  80. }
  81. if ($event->getSubject() === self::SUBJECT_OBJECT_ADD . '_event') {
  82. $subject = $this->l->t('{actor} created event {event} in calendar {calendar}');
  83. } else if ($event->getSubject() === self::SUBJECT_OBJECT_ADD . '_event_self') {
  84. $subject = $this->l->t('You created event {event} in calendar {calendar}');
  85. } else if ($event->getSubject() === self::SUBJECT_OBJECT_DELETE . '_event') {
  86. $subject = $this->l->t('{actor} deleted event {event} from calendar {calendar}');
  87. } else if ($event->getSubject() === self::SUBJECT_OBJECT_DELETE . '_event_self') {
  88. $subject = $this->l->t('You deleted event {event} from calendar {calendar}');
  89. } else if ($event->getSubject() === self::SUBJECT_OBJECT_UPDATE . '_event') {
  90. $subject = $this->l->t('{actor} updated event {event} in calendar {calendar}');
  91. } else if ($event->getSubject() === self::SUBJECT_OBJECT_UPDATE . '_event_self') {
  92. $subject = $this->l->t('You updated event {event} in calendar {calendar}');
  93. } else {
  94. throw new \InvalidArgumentException();
  95. }
  96. $parsedParameters = $this->getParameters($event);
  97. $this->setSubjects($event, $subject, $parsedParameters);
  98. $event = $this->eventMerger->mergeEvents('event', $event, $previousEvent);
  99. return $event;
  100. }
  101. /**
  102. * @param IEvent $event
  103. * @return array
  104. */
  105. protected function getParameters(IEvent $event) {
  106. $subject = $event->getSubject();
  107. $parameters = $event->getSubjectParameters();
  108. // Nextcloud 13+
  109. if (isset($parameters['calendar'])) {
  110. switch ($subject) {
  111. case self::SUBJECT_OBJECT_ADD . '_event':
  112. case self::SUBJECT_OBJECT_DELETE . '_event':
  113. case self::SUBJECT_OBJECT_UPDATE . '_event':
  114. return [
  115. 'actor' => $this->generateUserParameter($parameters['actor']),
  116. 'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l),
  117. 'event' => $this->generateClassifiedObjectParameter($parameters['object']),
  118. ];
  119. case self::SUBJECT_OBJECT_ADD . '_event_self':
  120. case self::SUBJECT_OBJECT_DELETE . '_event_self':
  121. case self::SUBJECT_OBJECT_UPDATE . '_event_self':
  122. return [
  123. 'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l),
  124. 'event' => $this->generateClassifiedObjectParameter($parameters['object']),
  125. ];
  126. }
  127. }
  128. // Legacy - Do NOT Remove unless necessary
  129. // Removing this will break parsing of activities that were created on
  130. // Nextcloud 12, so we should keep this as long as it's acceptable.
  131. // Otherwise if people upgrade over multiple releases in a short period,
  132. // they will get the dead entries in their stream.
  133. switch ($subject) {
  134. case self::SUBJECT_OBJECT_ADD . '_event':
  135. case self::SUBJECT_OBJECT_DELETE . '_event':
  136. case self::SUBJECT_OBJECT_UPDATE . '_event':
  137. return [
  138. 'actor' => $this->generateUserParameter($parameters[0]),
  139. 'calendar' => $this->generateLegacyCalendarParameter((int)$event->getObjectId(), $parameters[1]),
  140. 'event' => $this->generateObjectParameter($parameters[2]),
  141. ];
  142. case self::SUBJECT_OBJECT_ADD . '_event_self':
  143. case self::SUBJECT_OBJECT_DELETE . '_event_self':
  144. case self::SUBJECT_OBJECT_UPDATE . '_event_self':
  145. return [
  146. 'calendar' => $this->generateLegacyCalendarParameter((int)$event->getObjectId(), $parameters[1]),
  147. 'event' => $this->generateObjectParameter($parameters[2]),
  148. ];
  149. }
  150. throw new \InvalidArgumentException();
  151. }
  152. private function generateClassifiedObjectParameter(array $eventData) {
  153. $parameter = $this->generateObjectParameter($eventData);
  154. if (!empty($eventData['classified'])) {
  155. $parameter['name'] = $this->l->t('Busy');
  156. }
  157. return $parameter;
  158. }
  159. }