Просмотр исходного кода

emit pre-update event for comments

* notifications can be cleaned up, no polluted DB
* updating comments will re-notify users or remove notifications, depending on the message

Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
tags/v11.0RC2
Arthur Schiwon 7 лет назад
Родитель
Сommit
1bcd2ca8e3
Аккаунт пользователя с таким Email не найден

+ 19
- 8
apps/comments/lib/EventHandler.php Просмотреть файл

@@ -57,14 +57,29 @@ class EventHandler implements ICommentsEventHandler {
if( $eventType === CommentsEvent::EVENT_ADD
&& $event instanceof CommentsEvent
) {
$this->onAdd($event);
$this->notificationHandler($event);
$this->activityHandler($event);
return;
}

if( $eventType === CommentsEvent::EVENT_PRE_UPDATE
&& $event instanceof CommentsEvent
) {
$this->notificationHandler($event);
return;
}

if( $eventType === CommentsEvent::EVENT_UPDATE
&& $event instanceof CommentsEvent
) {
$this->notificationHandler($event);
return;
}

if( $eventType === CommentsEvent::EVENT_DELETE
&& $event instanceof CommentsEvent
) {
$this->onDelete($event);
$this->notificationHandler($event);
return;
}
}
@@ -72,13 +87,9 @@ class EventHandler implements ICommentsEventHandler {
/**
* @param CommentsEvent $event
*/
private function onAdd(CommentsEvent $event) {
private function activityHandler(CommentsEvent $event) {
$c = $this->app->getContainer();

/** @var NotificationListener $notificationListener */
$notificationListener = $c->query(NotificationListener::class);
$notificationListener->evaluate($event);

/** @var ActivityListener $listener */
$activityListener = $c->query(ActivityListener::class);
$activityListener->commentEvent($event);
@@ -87,7 +98,7 @@ class EventHandler implements ICommentsEventHandler {
/**
* @param CommentsEvent $event
*/
private function onDelete(CommentsEvent $event) {
private function notificationHandler(CommentsEvent $event) {
$c = $this->app->getContainer();

/** @var NotificationListener $notificationListener */

+ 3
- 1
apps/comments/lib/Notification/Listener.php Просмотреть файл

@@ -85,7 +85,9 @@ class Listener {
}

$notification->setUser($user);
if($event->getEvent() === CommentsEvent::EVENT_DELETE) {
if( $event->getEvent() === CommentsEvent::EVENT_DELETE
|| $event->getEvent() === CommentsEvent::EVENT_PRE_UPDATE)
{
$this->notificationManager->markProcessed($notification);
} else {
$this->notificationManager->notify($notification);

+ 3
- 34
apps/comments/tests/Unit/EventHandlerTest.php Просмотреть файл

@@ -69,42 +69,11 @@ class EventHandlerTest extends TestCase {
$this->eventHandler->handle($event);
}

public function notHandledProvider() {
return [
[CommentsEvent::EVENT_UPDATE]
];
}

/**
* @dataProvider notHandledProvider
* @param string $eventType
*/
public function testNotHandled($eventType) {
/** @var IComment|\PHPUnit_Framework_MockObject_MockObject $comment */
$comment = $this->getMockBuilder(IComment::class)->getMock();
$comment->expects($this->once())
->method('getObjectType')
->willReturn('files');

/** @var CommentsEvent|\PHPUnit_Framework_MockObject_MockObject $event */
$event = $this->getMockBuilder(CommentsEvent::class)
->disableOriginalConstructor()
->getMock();
$event->expects($this->once())
->method('getComment')
->willReturn($comment);
$event->expects($this->once())
->method('getEvent')
->willReturn($eventType);

// further processing does not happen, because $event methods cannot be
// access more than once.
$this->eventHandler->handle($event);
}

public function handledProvider() {
return [
[CommentsEvent::EVENT_DELETE],
[CommentsEvent::EVENT_UPDATE],
[CommentsEvent::EVENT_PRE_UPDATE],
[CommentsEvent::EVENT_ADD]
];
}
@@ -152,7 +121,7 @@ class EventHandlerTest extends TestCase {
->withConsecutive([NotificationListener::class], [ActivityListener::class])
->willReturnOnConsecutiveCalls($notificationListener, $activityListener);

$this->app->expects($this->once())
$this->app->expects($this->atLeastOnce())
->method('getContainer')
->willReturn($c);


+ 2
- 0
apps/comments/tests/Unit/Notification/ListenerTest.php Просмотреть файл

@@ -60,6 +60,8 @@ class ListenerTest extends TestCase {
public function eventProvider() {
return [
[CommentsEvent::EVENT_ADD, 'notify'],
[CommentsEvent::EVENT_UPDATE, 'notify'],
[CommentsEvent::EVENT_PRE_UPDATE, 'markProcessed'],
[CommentsEvent::EVENT_DELETE, 'markProcessed']
];
}

+ 1
- 1
apps/dav/lib/Comments/CommentNode.php Просмотреть файл

@@ -173,7 +173,7 @@ class CommentNode implements \Sabre\DAV\INode, \Sabre\DAV\IProperties {
* @param $propertyValue
* @return bool
* @throws BadRequest
* @throws Forbidden
* @throws \Exception
*/
public function updateComment($propertyValue) {
$this->checkWriteAccessOnComment();

+ 6
- 0
lib/private/Comments/Manager.php Просмотреть файл

@@ -536,6 +536,12 @@ class Manager implements ICommentsManager {
* @throws NotFoundException
*/
protected function update(IComment $comment) {
// for properly working preUpdate Events we need the old comments as is
// in the DB and overcome caching. Also avoid that outdated information stays.
$this->uncache($comment->getId());
$this->sendEvent(CommentsEvent::EVENT_PRE_UPDATE, $this->get($comment->getId()));
$this->uncache($comment->getId());

$qb = $this->dbConn->getQueryBuilder();
$affectedRows = $qb
->update('comments')

+ 4
- 3
lib/public/Comments/CommentsEvent.php Просмотреть файл

@@ -32,9 +32,10 @@ use Symfony\Component\EventDispatcher\Event;
*/
class CommentsEvent extends Event {

const EVENT_ADD = 'OCP\Comments\ICommentsManager::addComment';
const EVENT_UPDATE = 'OCP\Comments\ICommentsManager::updateComment';
const EVENT_DELETE = 'OCP\Comments\ICommentsManager::deleteComment';
const EVENT_ADD = 'OCP\Comments\ICommentsManager::addComment';
const EVENT_PRE_UPDATE = 'OCP\Comments\ICommentsManager::preUpdateComment';
const EVENT_UPDATE = 'OCP\Comments\ICommentsManager::updateComment';
const EVENT_DELETE = 'OCP\Comments\ICommentsManager::deleteComment';

/** @var string */
protected $event;

+ 2
- 2
tests/lib/Comments/ManagerTest.php Просмотреть файл

@@ -635,11 +635,11 @@ class ManagerTest extends TestCase {

public function testSendEvent() {
$handler1 = $this->getMockBuilder(ICommentsEventHandler::class)->getMock();
$handler1->expects($this->exactly(3))
$handler1->expects($this->exactly(4))
->method('handle');

$handler2 = $this->getMockBuilder(ICommentsEventHandler::class)->getMock();
$handler1->expects($this->exactly(3))
$handler1->expects($this->exactly(4))
->method('handle');

$manager = $this->getManager();

Загрузка…
Отмена
Сохранить