Completed
Push — master ( 2700ef...362ace )
by Pavel
03:09
created

RestRepository::sourceQueryBuilder()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

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