Passed
Push — master ( 10b36b...a1cd93 )
by Sylvain
09:17
created

ConfirmRegistration::build()   B

Complexity

Conditions 6
Paths 1

Size

Total Lines 64
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 30
CRAP Score 6.0087

Importance

Changes 5
Bugs 0 Features 0
Metric Value
cc 6
eloc 34
c 5
b 0
f 0
nc 1
nop 0
dl 0
loc 64
rs 8.7537
ccs 30
cts 32
cp 0.9375
crap 6.0087

How to fix   Long Method   

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\Api\Field\Mutation;
6
7
use Application\Api\Exception;
8
use Application\Api\Field\FieldInterface;
9
use Application\Api\Helper;
10
use Application\DBAL\Types\BookingStatusType;
11
use Application\DBAL\Types\BookingTypeType;
12
use Application\Model\Bookable;
13
use Application\Model\Booking;
14
use Application\Model\User;
15
use Application\Repository\UserRepository;
16
use Cake\Chronos\Chronos;
17
use GraphQL\Type\Definition\Type;
18
use Zend\Expressive\Session\SessionInterface;
19
20
abstract class ConfirmRegistration implements FieldInterface
21
{
22 2
    public static function build(): array
23
    {
24
        return [
25 1
            'name' => 'confirmRegistration',
26 1
            'type' => Type::nonNull(Type::boolean()),
27 1
            'description' => 'First step to register as a new user.',
28
            'args' => [
29 1
                'token' => Type::nonNull(_types()->get('Token')),
1 ignored issue
show
Bug introduced by
_types()->get('Token') of type GraphQL\Type\Definition\Type is incompatible with the type GraphQL\Type\Definition\NullableType expected by parameter $wrappedType of GraphQL\Type\Definition\Type::nonNull(). ( Ignorable by Annotation )

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

29
                'token' => Type::nonNull(/** @scrutinizer ignore-type */ _types()->get('Token')),
Loading history...
30 1
                'input' => Type::nonNull(_types()->get('ConfirmRegistrationInput')),
31
            ],
32
            'resolve' => function ($root, array $args, SessionInterface $session): bool {
1 ignored issue
show
Unused Code introduced by
The parameter $session is not used and could be removed. ( Ignorable by Annotation )

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

32
            'resolve' => function ($root, array $args, /** @scrutinizer ignore-unused */ SessionInterface $session): bool {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
33
34
                /** @var UserRepository $repository */
35 2
                $repository = _em()->getRepository(User::class);
36
37
                /** @var User $user */
38
                $user = $repository->getAclFilter()->runWithoutAcl(function () use ($repository, $args) {
39 2
                    return $repository->findOneByToken($args['token']);
1 ignored issue
show
Bug introduced by
The method findOneByToken() does not exist on Application\Repository\UserRepository. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

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

39
                    return $repository->/** @scrutinizer ignore-call */ findOneByToken($args['token']);
Loading history...
40 2
                });
41
42 2
                if (!$user) {
43 1
                    throw new Exception('Cannot confirm registration with an invalid token');
44
                }
45
46 1
                if (!$user->isTokenValid()) {
47
                    throw new Exception('Le lien que vous avez suivi est périmé. Veuillez effectuer une nouvelle demande.');
48
                }
49
50 1
                $input = $args['input'];
51
52
                $repository->getAclFilter()->runWithoutAcl(function () use ($repository, $input): void {
53 1
                    if ($repository->findOneByLogin($input['login'])) {
1 ignored issue
show
Bug introduced by
The method findOneByLogin() does not exist on Application\Repository\UserRepository. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

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

53
                    if ($repository->/** @scrutinizer ignore-call */ findOneByLogin($input['login'])) {
Loading history...
54
                        throw new Exception('Ce nom d\'utilisateur est déjà attribué et ne peut être utilisé');
55
                    }
56 1
                });
57
58
                // Do it
59 1
                Helper::hydrate($user, $input);
60
61
                // Active the member
62 1
                $user->initialize();
63
64
                // Create mandatory booking for him
65 1
                User::setCurrent($user);
66
67 1
                $mandatoryBookables = _em()->getRepository(Bookable::class)->findByBookingType(BookingTypeType::MANDATORY);
1 ignored issue
show
Bug introduced by
The method findByBookingType() does not exist on Application\Repository\BookableRepository. Since you implemented __call, consider adding a @method annotation. ( Ignorable by Annotation )

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

67
                $mandatoryBookables = _em()->getRepository(Bookable::class)->/** @scrutinizer ignore-call */ findByBookingType(BookingTypeType::MANDATORY);
Loading history...
68 1
                foreach ($mandatoryBookables as $bookable) {
69 1
                    $booking = new Booking();
70 1
                    _em()->persist($booking);
71
72 1
                    $booking->setOwner($user);
73 1
                    $booking->setStatus(BookingStatusType::BOOKED);
74 1
                    $booking->setStartDate(new Chronos());
75 1
                    $booking->setBookable($bookable);
76
77
                    // Non-periodic bookable must be terminated immediately
78 1
                    if ($bookable->getPeriodicPrice()->isZero()) {
79 1
                        $booking->terminate('Terminé automatiquement parce que paiement ponctuel uniquement');
80
                    }
81
                }
82
83 1
                _em()->flush();
84
85 1
                return true;
86 1
            },
87
        ];
88
    }
89
}
90