fix: only delete assignments on unshared board (#6932)

Signed-off-by: grnd-alt <github@belakkaf.net>
This commit is contained in:
grnd-alt
2025-04-23 11:37:17 +02:00
committed by GitHub
parent 9a2fcf6925
commit 899d8a6531
3 changed files with 19 additions and 7 deletions

View File

@@ -76,6 +76,21 @@ class AssignmentMapper extends DeckMapper implements IPermissionMapper {
return $this->findEntities($qb);
}
public function deleteByParticipantOnBoard(string $participant, int $boardId, $type = Assignment::TYPE_USER) {
$qb = $this->db->getQueryBuilder();
$cardIdQuery = $this->db->getQueryBuilder();
$cardIdQuery->select('a.card_id')
->from('deck_assigned_users', 'a')
->innerJoin('a', 'deck_cards', 'c', 'c.id = a.card_id')
->innerJoin('c', 'deck_stacks', 's', 's.id = c.stack_id')
->where($cardIdQuery->expr()->eq('a.participant', $qb->createNamedParameter($participant, IQueryBuilder::PARAM_STR)))
->andWhere($cardIdQuery->expr()->eq('s.board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->andWhere($cardIdQuery->expr()->eq('a.type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_INT)));
$qb->delete('deck_assigned_users')
->where($qb->expr()->in('card_id', $qb->createFunction($cardIdQuery->getSQL()), IQueryBuilder::PARAM_INT_ARRAY));
$qb->executeStatement();
}
public function isOwner($userId, $id): bool {
return $this->cardMapper->isOwner($userId, $id);

View File

@@ -444,10 +444,7 @@ class BoardService {
$acl = $this->aclMapper->find($id);
$this->boardMapper->mapAcl($acl);
if ($acl->getType() === Acl::PERMISSION_TYPE_USER) {
$assignements = $this->assignedUsersMapper->findByParticipant($acl->getParticipant());
foreach ($assignements as $assignement) {
$this->assignedUsersMapper->delete($assignement);
}
$this->assignedUsersMapper->deleteByParticipantOnBoard($acl->getParticipant(), $acl->getBoardId());
}
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_BOARD, $acl, ActivityManager::SUBJECT_BOARD_UNSHARE);

View File

@@ -437,10 +437,10 @@ class BoardServiceTest extends TestCase {
$assignment = new Assignment();
$assignment->setParticipant('admin');
$this->assignedUsersMapper->expects($this->once())
->method('findByParticipant')
->with('admin')
->method('deleteByParticipantOnBoard')
->with('admin', 123)
->willReturn([$assignment]);
$this->assignedUsersMapper->expects($this->once())
$this->assignedUsersMapper->expects($this->never())
->method('delete')
->with($assignment);
$this->aclMapper->expects($this->once())