Passed
Push — master ( 41ee62...d0e25f )
by Morten Poul
02:31
created

ModelResponse::deleted()   A

Complexity

Conditions 4
Paths 3

Size

Total Lines 12
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 6
nc 3
nop 0
dl 0
loc 12
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Signifly\Responder\Responses;
4
5
use Illuminate\Http\JsonResponse;
6
use Illuminate\Database\Eloquent\Model;
7
use Illuminate\Database\Eloquent\SoftDeletes;
8
9
class ModelResponse extends Response
10
{
11
    /** @var \Illuminate\Database\Eloquent\Model */
12
    protected $model;
13
14
    /** @var string */
15
    protected $resourceClass;
16
17
    /** @var int */
18
    protected $statusCode;
19
20
    public function __construct(Model $model, ?string $resourceClass = null)
21
    {
22
        $this->model = $model;
23
        $this->resourceClass = $resourceClass;
24
    }
25
26
    public function toResponse($request)
27
    {
28
        // Respond appropriately to a deleted model
29
        if ($this->deleted()) {
30
            return new JsonResponse(null, $this->statusCode ?? 204);
31
        }
32
33
        // Return the model directly if no resource is provided
34
        if (empty($this->resourceClass)) {
35
            return $this->model;
36
        }
37
38
        return (new $this->resourceClass($this->model))
39
            ->toResponse($request)
40
            ->setStatusCode($this->calculateStatus());
41
    }
42
43
    protected function calculateStatus(): int
44
    {
45
        if ($this->statusCode) {
46
            return $this->statusCode;
47
        }
48
49
        return $this->model->wasRecentlyCreated ? 201 : 200;
50
    }
51
52
    protected function deleted(): bool
53
    {
54
        if (! $this->model->exists) {
55
            return true;
56
        }
57
58
        $modelTraits = collect(class_uses_recursive($this->model));
59
        if ($modelTraits->contains(SoftDeletes::class) && $this->model->trashed()) {
60
            return true;
61
        }
62
63
        return false;
64
    }
65
}
66