Failed Conditions
Push — master ( e9ca52...479d22 )
by Adrien
10:20
created

BookableAvailable::assert()   B

Complexity

Conditions 11
Paths 11

Size

Total Lines 49
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 11.6363

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 11
eloc 23
nc 11
nop 4
dl 0
loc 49
ccs 19
cts 23
cp 0.8261
crap 11.6363
rs 7.3166
c 1
b 0
f 0

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Application\Acl\Assertion;
6
7
use Application\Model\Booking;
8
use Application\Model\User;
9
use Zend\Permissions\Acl\Acl;
10
use Zend\Permissions\Acl\Assertion\AssertionInterface;
11
use Zend\Permissions\Acl\Resource\ResourceInterface;
12
use Zend\Permissions\Acl\Role\RoleInterface;
13
14
class BookableAvailable implements AssertionInterface
15
{
16
    /**
17
     * Assert that the bookable of the given booking can be rented by the current user
18
     *
19
     * @param \Application\Acl\Acl $acl
20
     * @param RoleInterface $role
21
     * @param ResourceInterface $resource
22
     * @param string $privilege
23
     *
24
     * @return bool
25
     */
26 4
    public function assert(Acl $acl, RoleInterface $role = null, ResourceInterface $resource = null, $privilege = null)
27
    {
28
        /** @var Booking $booking */
29 4
        $booking = $resource->getInstance();
0 ignored issues
show
Bug introduced by
The method getInstance() does not exist on Zend\Permissions\Acl\Resource\ResourceInterface. It seems like you code against a sub-type of Zend\Permissions\Acl\Resource\ResourceInterface such as Application\Acl\ModelResource. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

29
        /** @scrutinizer ignore-call */ 
30
        $booking = $resource->getInstance();
Loading history...
Bug introduced by
The method getInstance() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

29
        /** @scrutinizer ignore-call */ 
30
        $booking = $resource->getInstance();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
30
31 4
        if (!$booking) {
32
            return $acl->reject('the booking does not exist');
33
        }
34
35 4
        if (!User::getCurrent()) {
36
            return $acl->reject('the user is not logged in');
0 ignored issues
show
introduced by
The method reject() does not exist on Zend\Permissions\Acl\Acl. Are you sure you never get this type here, but always one of the subclasses? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

36
            return $acl->/** @scrutinizer ignore-call */ reject('the user is not logged in');
Loading history...
37
        }
38
39 4
        $bookable = $booking->getBookable();
40
41 4
        if (!$bookable) {
42
            // Booking using user's own equipment is always allowed
43 2
            return true;
44
        }
45
46 2
        if (!$bookable->isActive()) {
47
            return $acl->reject('the bookable is not active');
48
        }
49
50
        // Check that the user has ALL required licenses for the bookable
51 2
        if (!$bookable->getLicenses()->isEmpty() && User::getCurrent()->getRole() !== User::ROLE_BOOKING_ONLY) {
52 1
            $userLicenses = User::getCurrent()->getLicenses();
53
54 1
            foreach ($bookable->getLicenses() as $requiredLicense) {
55 1
                if (!$userLicenses->contains($requiredLicense)) {
56 1
                    return $acl->reject('the user does not have the required license: ' . $requiredLicense->getName());
57
                }
58
            }
59
        }
60
61 1
        if ($bookable->getSimultaneousBookingMaximum() > 0) {
62
            // Check that the bookable has no more running bookings than its maximum
63 1
            $runningBookings = _em()->getRepository(Booking::class)->findBy([
64 1
                'bookable' => $bookable,
65
                'endDate' => null,
66
            ]);
67
68 1
            $count = count($runningBookings);
69 1
            if ($count >= $bookable->getSimultaneousBookingMaximum()) {
70
                return $acl->reject('the bookable limit of simultaneous bookings has been reached: ' . $count . '/' . $bookable->getSimultaneousBookingMaximum());
71
            }
72
        }
73
74 1
        return true;
75
    }
76
}
77