From 90dda38c0f095d1febde5c3b3ef53287c72bd3f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Wed, 4 Mar 2026 17:17:52 +0100 Subject: [PATCH] fix: don't enforce required checks on users with administrative roles --- .../Teamer/Profile/IndexController.php | 3 ++- .../AbstractRequiredTeamerCheck.php | 23 +++++++++++++++++++ .../DriverLicenseRequiredCheck.php | 8 +------ .../PersonalDataVerificationRequiredCheck.php | 7 +----- .../DriverLicenseRequiredCheckTest.php | 18 ++++++++++++--- ...sonalDataVerificationRequiredCheckTest.php | 20 ++++++++++++++++ 6 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 src/RequiredTeamerCheck/AbstractRequiredTeamerCheck.php diff --git a/src/Controller/Teamer/Profile/IndexController.php b/src/Controller/Teamer/Profile/IndexController.php index 5cdccdf..c730c75 100644 --- a/src/Controller/Teamer/Profile/IndexController.php +++ b/src/Controller/Teamer/Profile/IndexController.php @@ -55,7 +55,8 @@ class IndexController extends AbstractController // Validate teamer data to show missing data right away $errors = $this->validator->validate($teamer, null, ['profile_preflight']); - $verificationMode = false === $this->personalDataVerificationRequiredCheck->isSatisfied($user); + $verificationMode = true === $this->personalDataVerificationRequiredCheck->appliesTo($user) + && false === $this->personalDataVerificationRequiredCheck->isSatisfied($user); $form = $this->createForm(TeamerProfileType::class, $teamer, [ 'upload_session' => $uploadSession, diff --git a/src/RequiredTeamerCheck/AbstractRequiredTeamerCheck.php b/src/RequiredTeamerCheck/AbstractRequiredTeamerCheck.php new file mode 100644 index 0000000..09114ee --- /dev/null +++ b/src/RequiredTeamerCheck/AbstractRequiredTeamerCheck.php @@ -0,0 +1,23 @@ +getRoles(), self::EXCLUDED_ROLES))) { + return false; + } + + return true === $user->hasRole('ROLE_TEAMER'); + } +} diff --git a/src/RequiredTeamerCheck/DriverLicenseRequiredCheck.php b/src/RequiredTeamerCheck/DriverLicenseRequiredCheck.php index 6378529..2ff6552 100644 --- a/src/RequiredTeamerCheck/DriverLicenseRequiredCheck.php +++ b/src/RequiredTeamerCheck/DriverLicenseRequiredCheck.php @@ -5,20 +5,14 @@ namespace App\RequiredTeamerCheck; use App\Entity\Teamer; use App\Entity\Upload; use App\Entity\User; -use App\RequiredTeamerCheck\RequiredTeamerCheckInterface; -class DriverLicenseRequiredCheck implements RequiredTeamerCheckInterface +class DriverLicenseRequiredCheck extends AbstractRequiredTeamerCheck { public function getCode(): string { return 'driver_license'; } - public function appliesTo(User $user): bool - { - return true === $user->hasRole('ROLE_TEAMER'); - } - public function isSatisfied(User $user): bool { $teamer = $user->getTeamer(); diff --git a/src/RequiredTeamerCheck/PersonalDataVerificationRequiredCheck.php b/src/RequiredTeamerCheck/PersonalDataVerificationRequiredCheck.php index be84981..884b60d 100644 --- a/src/RequiredTeamerCheck/PersonalDataVerificationRequiredCheck.php +++ b/src/RequiredTeamerCheck/PersonalDataVerificationRequiredCheck.php @@ -6,7 +6,7 @@ use App\Entity\Teamer; use App\Entity\User; use Carbon\CarbonImmutable; -class PersonalDataVerificationRequiredCheck implements RequiredTeamerCheckInterface +class PersonalDataVerificationRequiredCheck extends AbstractRequiredTeamerCheck { public function __construct( private readonly array $dataVerificationDeadlines = ['04-01', '10-01'], @@ -18,11 +18,6 @@ class PersonalDataVerificationRequiredCheck implements RequiredTeamerCheckInterf return 'personal_data_verification'; } - public function appliesTo(User $user): bool - { - return true === $user->hasRole('ROLE_TEAMER'); - } - public function isSatisfied(User $user): bool { $teamer = $user->getTeamer(); diff --git a/tests/Security/RequiredCheck/DriverLicenseRequiredCheckTest.php b/tests/Security/RequiredCheck/DriverLicenseRequiredCheckTest.php index d4d5dc8..af30138 100644 --- a/tests/Security/RequiredCheck/DriverLicenseRequiredCheckTest.php +++ b/tests/Security/RequiredCheck/DriverLicenseRequiredCheckTest.php @@ -20,12 +20,24 @@ class DriverLicenseRequiredCheckTest extends TestCase } - public function testAppliesToMixedRoleUsersWithTeamerRole(): void + /** + * @dataProvider mixedRoleProvider + */ + public function testDoesNotApplyToExcludedMixedRoleUsersWithTeamerRole(string $excludedRole): void { $user = $this->createTeamerUser(); - $user->setRoles(['ROLE_ADMIN', 'ROLE_TEAMER']); + $user->setRoles([$excludedRole, 'ROLE_TEAMER']); - $this->assertTrue($this->check->appliesTo($user)); + $this->assertFalse($this->check->appliesTo($user)); + } + + public function mixedRoleProvider(): array + { + return [ + ['ROLE_ADMIN'], + ['ROLE_MANAGER'], + ['ROLE_HOUSE_MANAGER'], + ]; } public function testIsNotSatisfiedWhenDeclarationIsMissing(): void diff --git a/tests/Security/RequiredCheck/PersonalDataVerificationRequiredCheckTest.php b/tests/Security/RequiredCheck/PersonalDataVerificationRequiredCheckTest.php index 18fa139..d35d646 100644 --- a/tests/Security/RequiredCheck/PersonalDataVerificationRequiredCheckTest.php +++ b/tests/Security/RequiredCheck/PersonalDataVerificationRequiredCheckTest.php @@ -30,6 +30,26 @@ class PersonalDataVerificationRequiredCheckTest extends TestCase $this->assertTrue($check->appliesTo($user)); } + /** + * @dataProvider mixedRoleProvider + */ + public function testDoesNotApplyToExcludedMixedRoleUsersWithTeamerRole(string $excludedRole): void + { + $check = new PersonalDataVerificationRequiredCheck(); + $user = (new User())->setRoles([$excludedRole, 'ROLE_TEAMER']); + + $this->assertFalse($check->appliesTo($user)); + } + + public function mixedRoleProvider(): array + { + return [ + ['ROLE_ADMIN'], + ['ROLE_MANAGER'], + ['ROLE_HOUSE_MANAGER'], + ]; + } + public function testIsNotSatisfiedWhenTeamerIsMissing(): void { $check = new PersonalDataVerificationRequiredCheck();