Skip to content

Commit

Permalink
🐛 fix company role deletion (#176)
Browse files Browse the repository at this point in the history
* 🐛 fix bug that company role could not be deleted
- delete company users before deleting the role
  • Loading branch information
julianzimmermann authored Dec 19, 2023
1 parent 42ea166 commit 0ffb153
Show file tree
Hide file tree
Showing 12 changed files with 369 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
use FondOfImpala\Zed\CompanyTypeRole\Business\Mapper\PermissionKeyMapperInterface;
use FondOfImpala\Zed\CompanyTypeRole\Business\Model\CompanyRoleAssigner;
use FondOfImpala\Zed\CompanyTypeRole\Business\Model\CompanyRoleAssignerInterface;
use FondOfImpala\Zed\CompanyTypeRole\Business\Model\CompanyRoleDeleter;
use FondOfImpala\Zed\CompanyTypeRole\Business\Model\CompanyRoleDeleterInterface;
use FondOfImpala\Zed\CompanyTypeRole\Business\Model\PermissionReader;
use FondOfImpala\Zed\CompanyTypeRole\Business\Model\PermissionReaderInterface;
use FondOfImpala\Zed\CompanyTypeRole\Business\Reader\AssignableCompanyRoleReader;
Expand Down Expand Up @@ -142,6 +144,18 @@ public function createAssignableCompanyRoleReader(): AssignableCompanyRoleReader
);
}

/**
* @return \FondOfImpala\Zed\CompanyTypeRole\Business\Model\CompanyRoleDeleterInterface
*/
public function createCompanyRoleDeleter(): CompanyRoleDeleterInterface
{
return new CompanyRoleDeleter(
$this->getCompanyUserFacade(),
$this->getCompanyRoleFacade(),
$this->getRepository(),
);
}

/**
* @return \FondOfImpala\Zed\CompanyTypeRole\Business\Generator\AssignPermissionKeyGeneratorInterface
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Generated\Shared\Transfer\AssignableCompanyRoleCriteriaFilterTransfer;
use Generated\Shared\Transfer\CompanyResponseTransfer;
use Generated\Shared\Transfer\CompanyRoleCollectionTransfer;
use Generated\Shared\Transfer\CompanyRoleResponseTransfer;
use Generated\Shared\Transfer\CompanyRoleTransfer;
use Generated\Shared\Transfer\CompanyTypeTransfer;
use Generated\Shared\Transfer\EventEntityTransfer;
Expand Down Expand Up @@ -107,4 +108,16 @@ public function getAssignableCompanyRoles(
$assignableCompanyRoleCriteriaFilterTransfer,
);
}

/**
* @param \Generated\Shared\Transfer\CompanyRoleTransfer $companyRoleTransfer
*
* @return \Generated\Shared\Transfer\CompanyRoleResponseTransfer
*/
public function deleteCompanyRoleAndCompanyUserByCompanyRole(CompanyRoleTransfer $companyRoleTransfer): CompanyRoleResponseTransfer
{
return $this->getFactory()->createCompanyRoleDeleter()->deleteCompanyRoleAndCompanyUserByCompanyRole(
$companyRoleTransfer,
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Generated\Shared\Transfer\AssignableCompanyRoleCriteriaFilterTransfer;
use Generated\Shared\Transfer\CompanyResponseTransfer;
use Generated\Shared\Transfer\CompanyRoleCollectionTransfer;
use Generated\Shared\Transfer\CompanyRoleResponseTransfer;
use Generated\Shared\Transfer\CompanyRoleTransfer;
use Generated\Shared\Transfer\CompanyTypeTransfer;
use Generated\Shared\Transfer\EventEntityTransfer;
Expand Down Expand Up @@ -89,4 +90,11 @@ public function syncCompanyRoles(): void;
public function getAssignableCompanyRoles(
AssignableCompanyRoleCriteriaFilterTransfer $assignableCompanyRoleCriteriaFilterTransfer
): CompanyRoleCollectionTransfer;

/**
* @param \Generated\Shared\Transfer\CompanyRoleTransfer $companyRoleTransfer
*
* @return \Generated\Shared\Transfer\CompanyRoleResponseTransfer
*/
public function deleteCompanyRoleAndCompanyUserByCompanyRole(CompanyRoleTransfer $companyRoleTransfer): CompanyRoleResponseTransfer;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

namespace FondOfImpala\Zed\CompanyTypeRole\Business\Model;

use FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToCompanyRoleFacadeInterface;
use FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToCompanyUserFacadeInterface;
use FondOfImpala\Zed\CompanyTypeRole\Persistence\CompanyTypeRoleRepositoryInterface;
use Generated\Shared\Transfer\CompanyRoleResponseTransfer;
use Generated\Shared\Transfer\CompanyRoleTransfer;

class CompanyRoleDeleter implements CompanyRoleDeleterInterface
{
protected CompanyTypeRoleToCompanyUserFacadeInterface $companyUserFacade;

protected CompanyTypeRoleToCompanyRoleFacadeInterface $companyRoleFacade;

protected CompanyTypeRoleRepositoryInterface $repository;

/**
* @param \FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToCompanyUserFacadeInterface $companyUserFacade
* @param \FondOfImpala\Zed\CompanyTypeRole\Dependency\Facade\CompanyTypeRoleToCompanyRoleFacadeInterface $companyRoleFacade
* @param \FondOfImpala\Zed\CompanyTypeRole\Persistence\CompanyTypeRoleRepositoryInterface $repository
*/
public function __construct(
CompanyTypeRoleToCompanyUserFacadeInterface $companyUserFacade,
CompanyTypeRoleToCompanyRoleFacadeInterface $companyRoleFacade,
CompanyTypeRoleRepositoryInterface $repository
) {
$this->companyUserFacade = $companyUserFacade;
$this->companyRoleFacade = $companyRoleFacade;
$this->repository = $repository;
}

/**
* @param \Generated\Shared\Transfer\CompanyRoleTransfer $companyRoleTransfer
*
* @return \Generated\Shared\Transfer\CompanyRoleResponseTransfer
*/
public function deleteCompanyRoleAndCompanyUserByCompanyRole(CompanyRoleTransfer $companyRoleTransfer): CompanyRoleResponseTransfer
{
$companyUserCollection = $this->repository->findCompanyUserIdsByCompanyRoleId($companyRoleTransfer->getIdCompanyRole());

foreach ($companyUserCollection->getCompanyUsers() as $companyUser) {
$this->companyUserFacade->deleteCompanyUser($companyUser);
}

return $this->companyRoleFacade->delete($companyRoleTransfer);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace FondOfImpala\Zed\CompanyTypeRole\Business\Model;

use Generated\Shared\Transfer\CompanyRoleResponseTransfer;
use Generated\Shared\Transfer\CompanyRoleTransfer;

interface CompanyRoleDeleterInterface
{
/**
* @param \Generated\Shared\Transfer\CompanyRoleTransfer $companyRoleTransfer
*
* @return \Generated\Shared\Transfer\CompanyRoleResponseTransfer
*/
public function deleteCompanyRoleAndCompanyUserByCompanyRole(CompanyRoleTransfer $companyRoleTransfer): CompanyRoleResponseTransfer;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Generated\Shared\Transfer\CompanyUserCollectionTransfer;
use Generated\Shared\Transfer\CompanyUserCriteriaFilterTransfer;
use Generated\Shared\Transfer\CompanyUserResponseTransfer;
use Generated\Shared\Transfer\CompanyUserTransfer;
use Spryker\Zed\CompanyUser\Business\CompanyUserFacadeInterface;

Expand Down Expand Up @@ -42,4 +43,20 @@ public function getCompanyUserCollection(
): CompanyUserCollectionTransfer {
return $this->companyUserFacade->getCompanyUserCollection($companyUserCriteriaFilterTransfer);
}

/**
* Specification:
* - Executes CompanyUserPreDeletePluginInterface plugins before delete company user.
* - Deletes a company user.
*
* @api
*
* @param \Generated\Shared\Transfer\CompanyUserTransfer $companyUserTransfer
*
* @return \Generated\Shared\Transfer\CompanyUserResponseTransfer
*/
public function deleteCompanyUser(CompanyUserTransfer $companyUserTransfer): CompanyUserResponseTransfer
{
return $this->companyUserFacade->deleteCompanyUser($companyUserTransfer);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use Generated\Shared\Transfer\CompanyUserCollectionTransfer;
use Generated\Shared\Transfer\CompanyUserCriteriaFilterTransfer;
use Generated\Shared\Transfer\CompanyUserResponseTransfer;
use Generated\Shared\Transfer\CompanyUserTransfer;

interface CompanyTypeRoleToCompanyUserFacadeInterface
Expand All @@ -23,4 +24,17 @@ public function findCompanyUserById(CompanyUserTransfer $companyUserTransfer): ?
public function getCompanyUserCollection(
CompanyUserCriteriaFilterTransfer $companyUserCriteriaFilterTransfer
): CompanyUserCollectionTransfer;

/**
* Specification:
* - Executes CompanyUserPreDeletePluginInterface plugins before delete company user.
* - Deletes a company user.
*
* @api
*
* @param \Generated\Shared\Transfer\CompanyUserTransfer $companyUserTransfer
*
* @return \Generated\Shared\Transfer\CompanyUserResponseTransfer
*/
public function deleteCompanyUser(CompanyUserTransfer $companyUserTransfer): CompanyUserResponseTransfer;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@
namespace FondOfImpala\Zed\CompanyTypeRole\Persistence;

use Generated\Shared\Transfer\CompanyRoleCollectionTransfer;
use Generated\Shared\Transfer\CompanyUserCollectionTransfer;
use Generated\Shared\Transfer\CompanyUserTransfer;
use Orm\Zed\CompanyRole\Persistence\Base\SpyCompanyRoleQuery;
use Orm\Zed\CompanyRole\Persistence\Map\SpyCompanyRoleTableMap;
use Orm\Zed\CompanyUser\Persistence\Map\SpyCompanyUserTableMap;
use Orm\Zed\CompanyUser\Persistence\SpyCompanyUserQuery;
use Orm\Zed\Permission\Persistence\Map\SpyPermissionTableMap;
use Spryker\Zed\Kernel\Persistence\AbstractRepository;
use Spryker\Zed\Propel\PropelConfig;
Expand Down Expand Up @@ -116,4 +119,27 @@ public function findCompanyRolesByCompanyRoleIds(

return $companyRoleCollectionTransfer;
}

/**
* @param int $companyRoleId
*
* @return \Generated\Shared\Transfer\CompanyUserCollectionTransfer
*/
public function findCompanyUserIdsByCompanyRoleId(
int $companyRoleId
): CompanyUserCollectionTransfer {
$spyCompanyUsers = SpyCompanyUserQuery::create()
->useSpyCompanyRoleToCompanyUserQuery()
->filterByFkCompanyRole($companyRoleId)
->endUse()
->find();

$collection = new CompanyUserCollectionTransfer();

foreach ($spyCompanyUsers as $spyCompanyUser) {
$collection->addCompanyUser((new CompanyUserTransfer())->fromArray($spyCompanyUser->toArray(), true));
}

return $collection;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace FondOfImpala\Zed\CompanyTypeRole\Persistence;

use Generated\Shared\Transfer\CompanyRoleCollectionTransfer;
use Generated\Shared\Transfer\CompanyUserCollectionTransfer;

interface CompanyTypeRoleRepositoryInterface
{
Expand Down Expand Up @@ -34,4 +35,15 @@ public function findSyncableCompanyRoleIds(
public function findCompanyRolesByCompanyRoleIds(
array $companyRoleIds
): CompanyRoleCollectionTransfer;

/**
* @param int $companyRoleId
*
* @throws \Spryker\Zed\Propel\Business\Exception\AmbiguousComparisonException
*
* @return \Generated\Shared\Transfer\CompanyUserCollectionTransfer
*/
public function findCompanyUserIdsByCompanyRoleId(
int $companyRoleId
): CompanyUserCollectionTransfer;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Codeception\Test\Unit;
use FondOfImpala\Zed\CompanyTypeRole\Business\Model\CompanyRoleAssigner;
use FondOfImpala\Zed\CompanyTypeRole\Business\Model\CompanyRoleAssignerInterface;
use FondOfImpala\Zed\CompanyTypeRole\Business\Model\CompanyRoleDeleter;
use FondOfImpala\Zed\CompanyTypeRole\Business\Model\PermissionReader;
use FondOfImpala\Zed\CompanyTypeRole\Business\Reader\AssignableCompanyRoleReader;
use FondOfImpala\Zed\CompanyTypeRole\Business\Synchronizer\PermissionSynchronizer;
Expand Down Expand Up @@ -217,4 +218,32 @@ public function testCreateAssignableCompanyRoleReader(): void
$this->companyTypeRoleBusinessFactory->createAssignableCompanyRoleReader(),
);
}

/**
* @return void
*/
public function testCreateCompanyRoleDeleter(): void
{
$this->containerMock->expects(static::atLeastOnce())
->method('has')
->withConsecutive(
[CompanyTypeRoleDependencyProvider::FACADE_COMPANY_USER],
[CompanyTypeRoleDependencyProvider::FACADE_COMPANY_ROLE],
)->willReturnOnConsecutiveCalls(true, true);

$this->containerMock->expects(static::atLeastOnce())
->method('get')
->withConsecutive(
[CompanyTypeRoleDependencyProvider::FACADE_COMPANY_USER],
[CompanyTypeRoleDependencyProvider::FACADE_COMPANY_ROLE],
)->willReturnOnConsecutiveCalls(
$this->companyUserFacadeMock,
$this->companyRoleFacadeMock,
);

static::assertInstanceOf(
CompanyRoleDeleter::class,
$this->companyTypeRoleBusinessFactory->createCompanyRoleDeleter(),
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@

use Codeception\Test\Unit;
use FondOfImpala\Zed\CompanyTypeRole\Business\Model\CompanyRoleAssignerInterface;
use FondOfImpala\Zed\CompanyTypeRole\Business\Model\CompanyRoleDeleter;
use FondOfImpala\Zed\CompanyTypeRole\Business\Reader\AssignableCompanyRoleReaderInterface;
use FondOfImpala\Zed\CompanyTypeRole\Business\Synchronizer\PermissionSynchronizerInterface;
use Generated\Shared\Transfer\AssignableCompanyRoleCriteriaFilterTransfer;
use Generated\Shared\Transfer\CompanyResponseTransfer;
use Generated\Shared\Transfer\CompanyRoleCollectionTransfer;
use Generated\Shared\Transfer\CompanyRoleResponseTransfer;
use Generated\Shared\Transfer\CompanyRoleTransfer;
use PHPUnit\Framework\MockObject\MockObject;

class CompanyTypeRoleFacadeTest extends Unit
{
Expand Down Expand Up @@ -52,6 +56,12 @@ class CompanyTypeRoleFacadeTest extends Unit
*/
protected $assignableCompanyRoleReaderMock;

protected CompanyRoleDeleter|MockObject $companyRoleDeleterMock;

protected CompanyRoleTransfer|MockObject $companyRoleTransferMock;

protected CompanyRoleResponseTransfer|MockObject $companyRoleResponseTransferMock;

/**
* @return void
*/
Expand Down Expand Up @@ -87,6 +97,18 @@ protected function _before(): void
->disableOriginalConstructor()
->getMock();

$this->companyRoleDeleterMock = $this->getMockBuilder(CompanyRoleDeleter::class)
->disableOriginalConstructor()
->getMock();

$this->companyRoleTransferMock = $this->getMockBuilder(CompanyRoleTransfer::class)
->disableOriginalConstructor()
->getMock();

$this->companyRoleResponseTransferMock = $this->getMockBuilder(CompanyRoleResponseTransfer::class)
->disableOriginalConstructor()
->getMock();

$this->companyTypeRoleFacade = new CompanyTypeRoleFacade();

$this->companyTypeRoleFacade->setFactory($this->companyTypeRoleBusinessFactoryMock);
Expand Down Expand Up @@ -148,4 +170,23 @@ public function testGetAssignableCompanyRoles(): void
),
);
}

/**
* @return void
*/
public function testDeleteCompanyRoleAndCompanyUserByCompanyRole(): void
{
$this->companyTypeRoleBusinessFactoryMock->expects(static::atLeastOnce())
->method('createCompanyRoleDeleter')
->willReturn($this->companyRoleDeleterMock);

$this->companyRoleDeleterMock->expects(static::atLeastOnce())
->method('deleteCompanyRoleAndCompanyUserByCompanyRole')
->with($this->companyRoleTransferMock)
->willReturn($this->companyRoleResponseTransferMock);

$this->companyTypeRoleFacade->deleteCompanyRoleAndCompanyUserByCompanyRole(
$this->companyRoleTransferMock,
);
}
}
Loading

0 comments on commit 0ffb153

Please sign in to comment.