AccountConnector::connect()   B
last analyzed

Complexity

Conditions 5
Paths 3

Size

Total Lines 15
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 0
Metric Value
cc 5
eloc 10
nc 3
nop 2
dl 0
loc 15
ccs 0
cts 10
cp 0
crap 30
rs 8.8571
c 0
b 0
f 0
1
<?php
2
3
namespace App\Security\User\Connect;
4
5
use HWI\Bundle\OAuthBundle\Connect\AccountConnectorInterface;
6
use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
7
8
use Symfony\Component\Security\Core\User\UserInterface;
9
10
use Doctrine\ORM\EntityManagerInterface;
11
12
use App\Manager\UserManager;
13
use App\Entity\User\User;
14
15
class AccountConnector implements AccountConnectorInterface
16
{
17
    /** @var EntityManagerInterface **/
18
    protected $em;
19
    /** @var UserManager **/
20
    protected $userManager;
21
    
22
    public function __construct(EntityManagerInterface $em, UserManager $userManager)
23
    {
24
        $this->em = $em;
25
        $this->userManager = $userManager;
26
    }
27
    
28
    public function connect(UserInterface $user, UserResponseInterface $response)
29
    {
30
        $service = ucfirst($response->getResourceOwner()->getName());
31
        $serviceUserId = $response->getData()['id'];
32
        
33
        if (($id = $user->{"get{$service}Id"}()) !== null && $id !== $serviceUserId) {
34
            throw new ConnectException('users.connection.account_mismatch');
35
        } elseif ($id === null && $this->em->getRepository(User::class)->{"findOneBy{$service}Id"}($serviceUserId) !== null) {
36
            throw new ConnectException('users.connection.account_already_bound');
37
        }
38
        $user
39
            ->{"set{$service}Id"}($response->getData()['id'])
40
            ->{"set{$service}AccessToken"}($response->getAccessToken())
41
        ;
42
        $this->userManager->updateUser($user);
43
    }
44
}