Skip to content

Commit cee548b

Browse files
committed
transfer deleted-user team boards in listener by highest member level
Signed-off-by: samin-z <samin.zavarkesh@gmail.com>
1 parent e37ff4e commit cee548b

4 files changed

Lines changed: 24 additions & 63 deletions

File tree

lib/Listeners/ParticipantCleanupListener.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
use OCA\Deck\Db\Acl;
1414
use OCA\Deck\Db\AclMapper;
1515
use OCA\Deck\Db\AssignmentMapper;
16+
use OCA\Deck\Db\BoardMapper;
17+
use OCA\Deck\Service\CirclesService;
1618
use OCA\Deck\Service\TeamBoardService;
1719
use OCP\EventDispatcher\Event;
1820
use OCP\EventDispatcher\IEventListener;
@@ -24,14 +26,28 @@ class ParticipantCleanupListener implements IEventListener {
2426
public function __construct(
2527
private AclMapper $aclMapper,
2628
private AssignmentMapper $assignmentMapper,
29+
private BoardMapper $boardMapper,
30+
private CirclesService $circlesService,
2731
private TeamBoardService $teamBoardService,
2832
) {
2933
}
3034

3135
public function handle(Event $event): void {
3236
if ($event instanceof UserDeletedEvent) {
3337
$userId = $event->getUser()->getUID();
34-
$this->teamBoardService->handleBoardsOwnedByDeletedUser($userId);
38+
$boards = $this->boardMapper->findAllByOwner($userId);
39+
foreach ($boards as $board) {
40+
$teamId = $board->getTeamId();
41+
if ($teamId !== null && $teamId !== '') {
42+
$nextOwner = $this->circlesService->findNextMemberUserId($teamId, $userId);
43+
if ($nextOwner !== null) {
44+
$this->boardMapper->transferOwnership($userId, $nextOwner, $board->getId());
45+
continue;
46+
}
47+
}
48+
$this->boardMapper->delete($board);
49+
}
50+
3551
$this->cleanupByParticipant(Acl::PERMISSION_TYPE_USER, $userId);
3652
}
3753

lib/Service/CirclesService.php

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public function getUserCircles(string $userId): array {
107107
}
108108

109109
/**
110-
* Find a remaining team owner or admin to take over board ownership.
110+
* Find a remaining team member with the highest level to take over board ownership.
111111
*/
112112
public function findNextMemberUserId(string $circleId, ?string $excludeUserId = null): ?string {
113113
if (!$this->circlesEnabled) {
@@ -118,7 +118,8 @@ public function findNextMemberUserId(string $circleId, ?string $excludeUserId =
118118
$circlesManager = Server::get(CirclesManager::class);
119119
$circlesManager->startSuperSession();
120120
$circle = $circlesManager->getCircle($circleId);
121-
$adminUserId = null;
121+
$maxUserId = null;
122+
$maxLevel = -1;
122123
foreach ($circle->getMembers() as $member) {
123124
if ($member->getUserType() !== Member::TYPE_USER) {
124125
continue;
@@ -129,12 +130,13 @@ public function findNextMemberUserId(string $circleId, ?string $excludeUserId =
129130
if ($member->getLevel() === Member::LEVEL_OWNER) {
130131
return $member->getUserId();
131132
}
132-
if ($adminUserId === null && $member->getLevel() >= Member::LEVEL_ADMIN) {
133-
$adminUserId = $member->getUserId();
133+
if ($member->getLevel() > $maxLevel) {
134+
$maxLevel = $member->getLevel();
135+
$maxUserId = $member->getUserId();
134136
}
135137
}
136138

137-
return $adminUserId;
139+
return $maxUserId;
138140
} catch (Throwable $e) {
139141
}
140142

lib/Service/TeamBoardService.php

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,6 @@ public function __construct(
1818
) {
1919
}
2020

21-
/**
22-
* When user is deleted transfer team boards to another owner/admin when possible,otherwise delete them.
23-
*/
24-
public function handleBoardsOwnedByDeletedUser(string $userId): void {
25-
foreach ($this->boardMapper->findAllByOwner($userId) as $board) {
26-
$teamId = $board->getTeamId();
27-
if ($teamId !== null && $teamId !== '') {s
28-
$nextOwner = $this->circlesService->findNextMemberUserId($teamId, $userId);
29-
if ($nextOwner !== null) {
30-
$this->boardMapper->transferOwnership($userId, $nextOwner, $board->getId());
31-
continue;
32-
}
33-
}
34-
35-
$this->boardMapper->delete($board);
36-
}
37-
}
38-
3921
/**
4022
* When a user leaves the team,transfer ownership, or delete board
4123
*/

tests/unit/Service/TeamBoardServiceTest.php

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -33,45 +33,6 @@ public function setUp(): void {
3333
);
3434
}
3535

36-
public function testHandleBoardsOwnedByDeletedUser(): void {
37-
$personalBoard = new Board();
38-
$personalBoard->setId(1);
39-
$personalBoard->setOwner($this->userId1);
40-
$personalBoard->setTeamId(null);
41-
42-
$orphanedTeamBoard = new Board();
43-
$orphanedTeamBoard->setId(2);
44-
$orphanedTeamBoard->setOwner($this->userId1);
45-
$orphanedTeamBoard->setTeamId('team-a');
46-
47-
$transferableBoard = new Board();
48-
$transferableBoard->setId(3);
49-
$transferableBoard->setOwner($this->userId1);
50-
$transferableBoard->setTeamId('team-b');
51-
52-
$this->boardMapper->expects($this->once())
53-
->method('findAllByOwner')
54-
->with($this->userId1)
55-
->willReturn([$personalBoard, $orphanedTeamBoard, $transferableBoard]);
56-
57-
$this->circlesService->expects($this->exactly(2))
58-
->method('findNextMemberUserId')
59-
->willReturnMap([
60-
['team-a', $this->userId1, null],
61-
['team-b', $this->userId1, $this->userId2],
62-
]);
63-
64-
$this->boardMapper->expects($this->once())
65-
->method('transferOwnership')
66-
->with($this->userId1, $this->userId2, 3);
67-
68-
$this->boardMapper->expects($this->exactly(2))
69-
->method('delete')
70-
->withConsecutive([$personalBoard], [$orphanedTeamBoard]);
71-
72-
$this->service->handleBoardsOwnedByDeletedUser($this->userId1);
73-
}
74-
7536
public function testHandleMemberLeftTeamTransfersOwnership(): void {
7637
$board = new Board();
7738
$board->setId(10);

0 commit comments

Comments
 (0)