Skip to content

Commit 755f59c

Browse files
committed
fix: restored circle destroyed listener and pr comments
Signed-off-by: Stefan Dietrich <5716289+stediefan@users.noreply.github.com>
1 parent 6b38e0c commit 755f59c

6 files changed

Lines changed: 135 additions & 11 deletions

File tree

lib/AppInfo/Application.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
namespace OCA\GroupFolders\AppInfo;
1010

11+
use OCA\Circles\Events\CircleDestroyedEvent;
1112
use OCA\DAV\Connector\Sabre\Principal;
1213
use OCA\Files\Event\LoadAdditionalScriptsEvent;
1314
use OCA\Files_Sharing\Event\BeforeTemplateRenderedEvent;
@@ -25,6 +26,7 @@
2526
use OCA\GroupFolders\Command\ExpireGroup\ExpireGroupVersionsTrash;
2627
use OCA\GroupFolders\Folder\FolderManager;
2728
use OCA\GroupFolders\Listeners\CacheListener;
29+
use OCA\GroupFolders\Listeners\CircleDestroyedEventListener;
2830
use OCA\GroupFolders\Listeners\DeleteListener;
2931
use OCA\GroupFolders\Listeners\LoadAdditionalScriptsListener;
3032
use OCA\GroupFolders\Listeners\NodeRenamedListener;
@@ -84,6 +86,7 @@ public function register(IRegistrationContext $context): void {
8486

8587
$context->registerEventListener(LoadAdditionalScriptsEvent::class, LoadAdditionalScriptsListener::class);
8688
$context->registerEventListener(BeforeTemplateRenderedEvent::class, LoadAdditionalScriptsListener::class);
89+
$context->registerEventListener(CircleDestroyedEvent::class, CircleDestroyedEventListener::class);
8790
$context->registerTeamResourceProvider(TeamSpaceProvider::class);
8891
$context->registerEventListener(NodeRenamedEvent::class, NodeRenamedListener::class);
8992
$context->registerEventListener(CacheEntryInsertedEvent::class, CacheListener::class, 99999);

lib/Folder/FolderDefinition.php

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,4 @@ public function useSeparateStorage(): bool {
3737
public function isTeamSpace(): bool {
3838
return $this->teamCircleId !== null;
3939
}
40-
41-
/**
42-
* The circle single id this team space belongs to, or null for regular
43-
* team folders.
44-
*/
45-
public function getTeamCircleId(): ?string {
46-
return $this->teamCircleId;
47-
}
4840
}

lib/Folder/FolderManager.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1230,10 +1230,14 @@ public function deleteUser(string $userId): void {
12301230
* @throws Exception
12311231
*/
12321232
public function deleteCircle(string $circleId): void {
1233-
$query = $this->connection->getQueryBuilder();
1233+
$teamFolderId = $this->getFolderIdByTeamCircleId($circleId);
12341234

1235+
$query = $this->connection->getQueryBuilder();
12351236
$query->delete('group_folders_groups')
12361237
->where($query->expr()->eq('circle_id', $query->createNamedParameter($circleId)));
1238+
if ($teamFolderId !== null) {
1239+
$query->andWhere($query->expr()->neq('folder_id', $query->createNamedParameter($teamFolderId, IQueryBuilder::PARAM_INT)));
1240+
}
12371241
$query->executeStatement();
12381242

12391243
$query = $this->connection->getQueryBuilder();
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
7+
* SPDX-License-Identifier: AGPL-3.0-or-later
8+
*/
9+
10+
namespace OCA\GroupFolders\Listeners;
11+
12+
use OCA\Circles\Events\CircleDestroyedEvent;
13+
use OCA\GroupFolders\Folder\FolderManager;
14+
use OCP\EventDispatcher\Event;
15+
use OCP\EventDispatcher\IEventListener;
16+
17+
/**
18+
* @template-implements IEventListener<CircleDestroyedEvent>
19+
*/
20+
class CircleDestroyedEventListener implements IEventListener {
21+
public function __construct(
22+
private readonly FolderManager $folderManager,
23+
) {
24+
}
25+
26+
#[\Override]
27+
public function handle(Event $event): void {
28+
/** @phpstan-ignore instanceof.alwaysTrue */
29+
if (!$event instanceof CircleDestroyedEvent) {
30+
return;
31+
}
32+
33+
$this->folderManager->deleteCircle($event->getCircle()->getSingleId());
34+
}
35+
}

tests/Folder/FolderManagerTest.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -784,14 +784,41 @@ public function testTeamCircleIdIsHydratedAsNullableString(): void {
784784
$folder = $this->manager->getAllFolders()[$folderId];
785785
$this->assertNull($folder->teamCircleId);
786786
$this->assertFalse($folder->isTeamSpace());
787-
$this->assertNull($folder->getTeamCircleId());
788787

789788
$this->manager->setTeamCircleId($folderId, 'circle-owner');
790789

791790
$folder = $this->manager->getAllFolders()[$folderId];
792791
$this->assertSame('circle-owner', $folder->teamCircleId);
793792
$this->assertTrue($folder->isTeamSpace());
794-
$this->assertSame('circle-owner', $folder->getTeamCircleId());
793+
}
794+
795+
public function testDeleteCircleKeepsTeamFolderMapping(): void {
796+
$classicFolderId = $this->manager->createFolder('classic-folder');
797+
$teamFolderId = $this->manager->createFolder('team-folder');
798+
$this->manager->setTeamCircleId($teamFolderId, 'circle-owner');
799+
800+
$query = Server::get(IDBConnection::class)->getQueryBuilder();
801+
foreach ([$classicFolderId, $teamFolderId] as $folderId) {
802+
$query->insert('group_folders_groups')
803+
->values([
804+
'folder_id' => $query->createNamedParameter($folderId, IQueryBuilder::PARAM_INT),
805+
'group_id' => $query->createNamedParameter(''),
806+
'circle_id' => $query->createNamedParameter('circle-owner'),
807+
'permissions' => $query->createNamedParameter(Constants::PERMISSION_ALL),
808+
]);
809+
$query->executeStatement();
810+
}
811+
812+
$this->manager->deleteCircle('circle-owner');
813+
814+
$query = Server::get(IDBConnection::class)->getQueryBuilder();
815+
$query->select('folder_id')
816+
->from('group_folders_groups')
817+
->where($query->expr()->eq('circle_id', $query->createNamedParameter('circle-owner')));
818+
$mappings = $query->executeQuery()->fetchAll();
819+
820+
$this->assertCount(1, $mappings);
821+
$this->assertSame($teamFolderId, (int)$mappings[0]['folder_id']);
795822
}
796823

797824
/**
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
7+
* SPDX-License-Identifier: AGPL-3.0-or-later
8+
*/
9+
10+
namespace OCA\GroupFolders\Tests\Listeners;
11+
12+
use OCA\Circles\Events\CircleDestroyedEvent;
13+
use OCA\Circles\Model\Circle;
14+
use OCA\GroupFolders\Folder\FolderManager;
15+
use OCA\GroupFolders\Listeners\CircleDestroyedEventListener;
16+
use OCP\EventDispatcher\Event;
17+
use PHPUnit\Framework\MockObject\MockObject;
18+
use Test\TestCase;
19+
20+
class CircleDestroyedEventListenerTest extends TestCase {
21+
private FolderManager&MockObject $folderManager;
22+
private CircleDestroyedEventListener $listener;
23+
24+
#[\Override]
25+
protected function setUp(): void {
26+
parent::setUp();
27+
28+
$this->folderManager = $this->createMock(FolderManager::class);
29+
$this->listener = new CircleDestroyedEventListener($this->folderManager);
30+
}
31+
32+
public function testHandleInvalid(): void {
33+
$event = $this->createMock(Event::class);
34+
35+
$this->folderManager
36+
->expects($this->never())
37+
->method('deleteCircle');
38+
39+
/** @phpstan-ignore argument.type */
40+
$this->listener->handle($event);
41+
}
42+
43+
public function testHandle(): void {
44+
$circle = $this->createMock(Circle::class);
45+
$circle
46+
->expects($this->once())
47+
->method('getSingleId')
48+
->willReturn('123');
49+
50+
$event = $this->createMock(CircleDestroyedEvent::class);
51+
$event
52+
->expects($this->once())
53+
->method('getCircle')
54+
->willReturn($circle);
55+
56+
$this->folderManager
57+
->expects($this->once())
58+
->method('deleteCircle')
59+
->with('123');
60+
61+
$this->listener->handle($event);
62+
}
63+
}

0 commit comments

Comments
 (0)