From 90b45e17e086edb4279a26916f9bd41ecf286ea9 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Joshua=20R=C3=BCsweg?= Date: Thu, 30 Aug 2018 17:26:39 +0200 Subject: [PATCH] Add recent activity events for articles See #2625 --- com.woltlab.wcf/objectType.xml | 5 +++ .../lib/data/article/ArticleAction.class.php | 22 ++++++++-- .../event/ArticleUserActivityEvent.class.php | 44 +++++++++++++++++++ wcfsetup/install/lang/de.xml | 2 + wcfsetup/install/lang/en.xml | 2 + 5 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 wcfsetup/install/files/lib/system/user/activity/event/ArticleUserActivityEvent.class.php diff --git a/com.woltlab.wcf/objectType.xml b/com.woltlab.wcf/objectType.xml index 20dc196cac..5599d13ddb 100644 --- a/com.woltlab.wcf/objectType.xml +++ b/com.woltlab.wcf/objectType.xml @@ -115,6 +115,11 @@ wcf\system\user\notification\object\type\ArticleUserNotificationObjectType com.woltlab.wcf.page + + com.woltlab.wcf.article.recentActivityEvent + com.woltlab.wcf.user.recentActivityEvent + wcf\system\user\activity\event\ArticleUserActivityEvent + diff --git a/wcfsetup/install/files/lib/data/article/ArticleAction.class.php b/wcfsetup/install/files/lib/data/article/ArticleAction.class.php index ee7eb976f8..737c7b5757 100644 --- a/wcfsetup/install/files/lib/data/article/ArticleAction.class.php +++ b/wcfsetup/install/files/lib/data/article/ArticleAction.class.php @@ -16,6 +16,7 @@ use wcf\system\message\embedded\object\MessageEmbeddedObjectManager; use wcf\system\request\LinkHandler; use wcf\system\search\SearchIndexManager; use wcf\system\tagging\TagEngine; +use wcf\system\user\activity\event\UserActivityEventHandler; use wcf\system\user\notification\object\ArticleUserNotificationObject; use wcf\system\user\notification\UserNotificationHandler; use wcf\system\user\object\watch\UserObjectWatchHandler; @@ -153,6 +154,8 @@ class ArticleAction extends AbstractDatabaseObjectAction { 'com.woltlab.wcf.article.notification', new ArticleUserNotificationObject($article) ); + + UserActivityEventHandler::getInstance()->fireEvent('com.woltlab.wcf.article.recentActivityEvent', $article->articleID, null, $article->userID, $article->time); } return $article; @@ -263,7 +266,7 @@ class ArticleAction extends AbstractDatabaseObjectAction { $publicationStatus = (isset($this->parameters['data']['publicationStatus'])) ? $this->parameters['data']['publicationStatus'] : null; if ($publicationStatus !== null) { - $usersToArticles = $resetNotifications = []; + $usersToArticles = $resetArticleIDs = []; /** @var ArticleEditor $articleEditor */ foreach ($this->objects as $articleEditor) { if ($publicationStatus != $articleEditor->publicationStatus) { @@ -284,16 +287,20 @@ class ArticleAction extends AbstractDatabaseObjectAction { 'com.woltlab.wcf.article.notification', new ArticleUserNotificationObject($articleEditor->getDecoratedObject()) ); + + UserActivityEventHandler::getInstance()->fireEvent('com.woltlab.wcf.article.recentActivityEvent', $articleEditor->articleID, null, $articleEditor->userID, $articleEditor->time); } else { - $resetNotifications[] = $articleEditor->articleID; + $resetArticleIDs[] = $articleEditor->articleID; } } } - if (!empty($resetNotifications)) { + if (!empty($resetArticleIDs)) { // delete user notifications - UserNotificationHandler::getInstance()->removeNotifications('com.woltlab.wcf.article.notification', $resetNotifications); + UserNotificationHandler::getInstance()->removeNotifications('com.woltlab.wcf.article.notification', $resetArticleIDs); + // delete recent activity events + UserActivityEventHandler::getInstance()->removeEvents('com.woltlab.wcf.article.recentActivityEvent', $resetArticleIDs); } if (!empty($usersToArticles)) { @@ -353,6 +360,8 @@ class ArticleAction extends AbstractDatabaseObjectAction { SearchIndexManager::getInstance()->delete('com.woltlab.wcf.article', $articleContentIDs); // delete user notifications UserNotificationHandler::getInstance()->removeNotifications('com.woltlab.wcf.article.notification', $articleIDs); + // delete recent activity events + UserActivityEventHandler::getInstance()->removeEvents('com.woltlab.wcf.article.recentActivityEvent', $articleIDs); } $this->unmarkItems(); @@ -648,6 +657,8 @@ class ArticleAction extends AbstractDatabaseObjectAction { 'com.woltlab.wcf.article.notification', new ArticleUserNotificationObject($articleEditor->getDecoratedObject()) ); + + UserActivityEventHandler::getInstance()->fireEvent('com.woltlab.wcf.article.recentActivityEvent', $articleEditor->articleID, null, $articleEditor->userID, TIME_NOW); } ArticleEditor::updateArticleCounter($usersToArticles); @@ -707,6 +718,9 @@ class ArticleAction extends AbstractDatabaseObjectAction { // delete user notifications UserNotificationHandler::getInstance()->removeNotifications('com.woltlab.wcf.article.notification', $articleIDs); + // delete recent activity events + UserActivityEventHandler::getInstance()->removeEvents('com.woltlab.wcf.article.recentActivityEvent', $articleIDs); + ArticleEditor::updateArticleCounter($usersToArticles); $this->unmarkItems(); diff --git a/wcfsetup/install/files/lib/system/user/activity/event/ArticleUserActivityEvent.class.php b/wcfsetup/install/files/lib/system/user/activity/event/ArticleUserActivityEvent.class.php new file mode 100644 index 0000000000..3f45280fbd --- /dev/null +++ b/wcfsetup/install/files/lib/system/user/activity/event/ArticleUserActivityEvent.class.php @@ -0,0 +1,44 @@ + + * @package WoltLabSuite\Core\System\User\Activity\Event + */ +class ArticleUserActivityEvent extends SingletonFactory implements IUserActivityEvent { + /** + * @inheritDoc + */ + public function prepare(array $events) { + $objectIDs = []; + foreach ($events as $event) { + $objectIDs[] = $event->objectID; + } + + ViewableArticleRuntimeCache::getInstance()->cacheObjectIDs($objectIDs); + + // set message + foreach ($events as $event) { + $article = ViewableArticleRuntimeCache::getInstance()->getObject($event->objectID); + if ($article !== null) { + if ($article->canRead()) { + $event->setIsAccessible(); + + $text = WCF::getLanguage()->getDynamicVariable('wcf.article.recentActivity', ['article' => $article]); + $event->setTitle($text); + $event->setDescription($article->getFormattedTeaser()); + } + } + else { + $event->setIsOrphaned(); + } + } + } +} diff --git a/wcfsetup/install/lang/de.xml b/wcfsetup/install/lang/de.xml index 987c245ba6..95458d5276 100644 --- a/wcfsetup/install/lang/de.xml +++ b/wcfsetup/install/lang/de.xml @@ -2396,6 +2396,7 @@ Benutzerkontos nun in vollem Umfang nutzen.]]> username}]]> + getLink()}">{$article->getTitle()} verfasst.]]> @@ -3986,6 +3987,7 @@ Die E-Mail-Adresse des neuen Benutzers lautet: {@$user->email} + diff --git a/wcfsetup/install/lang/en.xml b/wcfsetup/install/lang/en.xml index e52586745d..3481c4c6ab 100644 --- a/wcfsetup/install/lang/en.xml +++ b/wcfsetup/install/lang/en.xml @@ -2333,6 +2333,7 @@ full extend.]]> username}]]> + getLink()}">{$article->getTitle()}.]]> @@ -3981,6 +3982,7 @@ Open the link below to access the user profile: + -- 2.20.1