Completed
Push — master ( e881d8...a5189e )
by Pavel
02:13
created

RestRepository::getResourceKey()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 2
nop 0
dl 0
loc 7
ccs 4
cts 4
cp 1
crap 2
rs 9.4285
c 0
b 0
f 0
1
<?php namespace Pz\Doctrine\Rest;
2
3
use Doctrine\ORM\EntityRepository;
4
use Pz\Doctrine\Rest\Contracts\JsonApiResource;
5
use Pz\Doctrine\Rest\Contracts\RestRequestContract;
6
use Pz\Doctrine\Rest\Exceptions\RestException;
7
8
class RestRepository extends EntityRepository
9
{
10
    /**
11
     * @var string
12
     */
13
    protected $alias;
14
15
    protected $resourceKey;
16
17
    /**
18
     * @return \Doctrine\ORM\EntityManager
19
     */
20 7
    public function getEntityManager()
21
    {
22 7
        return parent::getEntityManager();
23
    }
24
25
    /**
26
     * @return \Doctrine\ORM\QueryBuilder
27
     */
28 7
    public function sourceQueryBuilder()
29
    {
30 7
        return $this->createQueryBuilder($this->alias());
31
    }
32
33
    /**
34
     * @return string|null
35
     */
36 9
    public function getResourceKey()
37
    {
38 9
        if (isset(class_implements($this->getClassName())[JsonApiResource::class])) {
39 8
            return call_user_func("{$this->getClassName()}::getResourceKey");
40
        }
41
42 1
        return null;
43
    }
44
45
    /**
46
     * Base root alias for queries.
47
     *
48
     * @return string
49
     */
50 7
    public function alias()
51
    {
52 7
        if ($this->alias === null) {
53 7
            $this->alias = strtolower(
54 7
                    preg_replace(
55 7
                    '/(?<!^)[A-Z]/', '_$0',
56 7
                    $this->getClassMetadata()->getReflectionClass()->getShortName()
57
                )
58
            );
59
        }
60
61 7
        return $this->alias;
62
    }
63
64
    /**
65
     * @param RestRequestContract $request
66
     *
67
     * @return JsonApiResource
68
     * @throws RestException
69
     */
70 8
    public function findByIdentifier(RestRequestContract $request)
71
    {
72 8
        if (null === ($entity = $this->find($request->getId()))) {
73 1
            throw RestException::createNotFound($request->getId(), $this->getResourceKey(), sprintf(
74 1
                'Entity of type `%s` not found.', $this->getClassName()
75
            ));
76
        }
77
78 7
        if (!$entity instanceof JsonApiResource) {
79 1
            throw RestException::notJsonApiResource($entity);
80
        }
81
82 6
        return $entity;
83
    }
84
85
    /**
86
     * @param RestRequestContract $request
87
     * @param JsonApiResource     $resource
88
     *
89
     * @return string
90
     */
91 2
    public function linkJsonApiResource(RestRequestContract $request, JsonApiResource $resource)
92
    {
93 2
        return sprintf('%s/%s/%s', $request->getBaseUrl(), $resource->getResourceKey(), $resource->getId());
94
    }
95
}
96