Test Failed
Pull Request — master (#11)
by
unknown
16:45 queued 43s
created

CreateAction   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 29
dl 0
loc 75
ccs 12
cts 12
cp 1
rs 10
c 1
b 0
f 0
wmc 9

6 Methods

Rating   Name   Duplication   Size   Complexity  
A hydrateRootEntity() 0 3 1
A beforeCreate() 0 4 1
A callBeforeCreate() 0 7 2
A handle() 0 22 2
A callAfterCreated() 0 7 2
A afterCreated() 0 4 1
1
<?php namespace Pz\Doctrine\Rest\Action;
2
3
use Pz\Doctrine\Rest\Contracts\JsonApiResource;
4
use Pz\Doctrine\Rest\Resource\Item;
5
use Pz\Doctrine\Rest\RestAction;
6
use Pz\Doctrine\Rest\Contracts\RestRequestContract;
7
use Pz\Doctrine\Rest\RestResponse;
8
use Pz\Doctrine\Rest\RestResponseFactory;
9
use Pz\Doctrine\Rest\Traits\CanHydrate;
10
use Pz\Doctrine\Rest\Traits\CanValidate;
11
12
class CreateAction extends RestAction
13
{
14
    use CanHydrate;
0 ignored issues
show
introduced by
The trait Pz\Doctrine\Rest\Traits\CanHydrate requires some properties which are not provided by Pz\Doctrine\Rest\Action\CreateAction: $reflFields, $associationMappings
Loading history...
15
    use CanValidate;
16
17
    /** @var array|callable[] */
18
    protected $beforeCreate = [];
19
20
    /** @var array|callable[] */
21
    protected $afterCreated = [];
22
23
    /**
24 4
     * @param RestRequestContract $request
25
     * @return RestResponse
26 4
     * @throws \Doctrine\ORM\ORMException
27 4
     * @throws \Doctrine\ORM\OptimisticLockException
28
     * @throws \Pz\Doctrine\Rest\Exceptions\RestException
29 4
     */
30 4
    public function handle($request)
31 3
    {
32 2
        $headers = [];
33 2
        $class = $this->repository()->getClassName();
34
35 2
        $this->authorize($request, $class);
36 2
        $entity = $this->hydrateRootEntity($class, $request);
37
        $this->validateEntity($entity);
38
39 2
        $this->callBeforeCreate($entity, $request);
40 2
41
        $this->repository()->getEntityManager()->persist($entity);
42
        $this->repository()->getEntityManager()->flush();
43
44
        $this->callAfterCreated($entity, $request);
45
46
        if ($entity instanceof JsonApiResource) {
47
            $headers['Location'] = $this->repository()->linkJsonApiResource($request, $entity);
48
        }
49
50
        $resource = new Item($entity, $this->transformer());
51
        return RestResponseFactory::resource($request, $resource, RestResponse::HTTP_CREATED, $headers);
52
    }
53
54
    public function hydrateRootEntity($entity, RestRequestContract $request)
55
    {
56
        return $this->hydrateEntity($entity, $request->getData());
57
    }
58
59
    public function beforeCreate(callable $cb): self
60
    {
61
        $this->beforeCreate[] = $cb;
62
        return $this;
63
    }
64
65
    public function afterCreated(callable $cb): self
66
    {
67
        $this->afterCreated[] = $cb;
68
        return $this;
69
    }
70
71
    public function callBeforeCreate($entity, RestRequestContract $request): self
72
    {
73
        foreach ($this->beforeCreate as $cb) {
74
            $cb($entity, $request);
75
        }
76
77
        return $this;
78
    }
79
80
    public function callAfterCreated($entity, RestRequestContract $request): self
81
    {
82
        foreach ($this->afterCreated as $cb) {
83
            $cb($entity, $request);
84
        }
85
86
        return $this;
87
    }
88
}
89