diff --git a/reserve.permissions.yml b/reserve.permissions.yml index 3b1fb95..6446c9a 100644 --- a/reserve.permissions.yml +++ b/reserve.permissions.yml @@ -16,11 +16,17 @@ add reservations: add reservations extended: title: 'Create new Reservations (extended)' -edit reservations: - title: 'Edit Reservations' +edit any reservation: + title: 'Edit Any Reservation' -delete reservations: - title: 'Delete Reservations' +edit own reservation: + title: 'Edit Own Reservation' + +delete any reservation: + title: 'Delete Any Reservation' + +delete own reservation: + title: 'Delete Own Reservation' view published reservations: title: 'View published Reservations' diff --git a/src/ReserveReservationAccessControlHandler.php b/src/ReserveReservationAccessControlHandler.php index a72db2d..7aab60e 100644 --- a/src/ReserveReservationAccessControlHandler.php +++ b/src/ReserveReservationAccessControlHandler.php @@ -22,19 +22,28 @@ class ReserveReservationAccessControlHandler extends EntityAccessControlHandler switch ($operation) { case 'view': if (!$entity->isPublished()) { - return AccessResult::allowedIfHasPermission($account, 'view unpublished reservations'); + $access = AccessResult::allowedIfHasPermission($account, 'view unpublished reservations'); } - return AccessResult::allowedIfHasPermission($account, 'view published reservations'); + $access = AccessResult::allowedIfHasPermission($account, 'view published reservations'); + break; case 'update': - return AccessResult::allowedIfHasPermission($account, 'edit reservations'); + $access = AccessResult::allowedIfHasPermission($account, 'edit any reservation'); + if (!$access->isAllowed() && $account->hasPermission('edit own reservation')) { + $access = $access->orIf(AccessResult::allowedIf($account->id() == $entity->getOwnerId())->cachePerUser()->addCacheableDependency($entity)); + } + break; case 'delete': - return AccessResult::allowedIfHasPermission($account, 'delete reservations'); + $access = AccessResult::allowedIfHasPermission($account, 'delete any reservation'); + break; + + // Unknown operation, no opinion. + default: + $access = AccessResult::neutral(); } - // Unknown operation, no opinion. - return AccessResult::neutral(); + return $access; } /**