Passed
Push — develop ( 6779d1...bdd5c6 )
by Csaba
32s
created

RestObject::resource()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
ccs 2
cts 2
cp 1
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
namespace Fathomminds\Rest\Objects;
3
4
use Fathomminds\Rest\Helpers\ReflectionHelper;
5
use Fathomminds\Rest\Contracts\IRestObject;
6
use Fathomminds\Rest\Schema\SchemaValidator;
7
use Fathomminds\Rest\Database\Clusterpoint\Database;
8
9
abstract class RestObject implements IRestObject
10
{
11
    protected $resourceName;
12
    protected $primaryKey;
13
    protected $resource;
14
    protected $schemaClass;
15
    protected $schema;
16
    protected $databaseClass;
17
    protected $database;
18
    protected $updateMode = false;
19
    protected $indexNames = [];
20
    protected $allowExtraneous = false;
21
22 32
    public function __construct($resource = null, $schema = null, $database = null)
23
    {
24 32
        $reflectionHelper = new ReflectionHelper;
25 32
        $this->resource = $resource === null ? $reflectionHelper->createInstance($this->schemaClass) : $resource;
26 32
        $this->database = $database === null ? $reflectionHelper->createInstance($this->databaseClass) : $database;
27 32
        $this->schema = $schema === null ? new SchemaValidator : $schema;
28 32
        $this->schema->allowExtraneous($this->allowExtraneous);
29 32
    }
30
31 12
    public function createFromObject($object)
32
    {
33 12
        $reflectionHelper = new ReflectionHelper;
34 12
        $this->resource = $reflectionHelper->createInstance($this->schemaClass, [$object]);
35 11
        return $this;
36
    }
37
38 13
    public function resource()
39
    {
40 13
        return $this->resource;
41
    }
42
43 2
    public function getResourceName()
44
    {
45 2
        return $this->resourceName;
46
    }
47
48 5
    public function get($resourceId = null)
49
    {
50 5
        $reflectionHelper = new ReflectionHelper;
51 5
        if ($resourceId === null) {
52 2
            $rawResources = $this->database->get($this->resourceName, $this->primaryKey);
53 2
            $resources = [];
54 2
            foreach ($rawResources as $rawResource) {
55 1
                $resources[] = $reflectionHelper->createInstance($this->schemaClass, [$rawResource]);
56
            }
57 2
            return $resources;
58
        }
59 3
        $res = $this->database->get($this->resourceName, $this->primaryKey, $resourceId);
60 3
        $this->resource = $reflectionHelper->createInstance($this->schemaClass, [$res]);
61 3
        return $this->resource;
62
    }
63
64 2
    public function post($newResource)
65
    {
66 2
        $reflectionHelper = new ReflectionHelper;
67 2
        $this->setUpdateMode(false);
68 2
        $this->setFieldDefaults();
69 2
        $this->validateSchema($newResource);
70 1
        $this->validate();
71 1
        $res = $this->database->post($this->resourceName, $this->primaryKey, $newResource);
72 1
        $this->resource = $reflectionHelper->createInstance($this->schemaClass, [$res]);
73 1
    }
74
75 1
    public function put($resourceId, $newResource)
76
    {
77 1
        $reflectionHelper = new ReflectionHelper;
78 1
        $this->setUpdateMode(true);
79 1
        $this->setFieldDefaults();
80 1
        $this->validateSchema($newResource);
81 1
        $this->validate();
82 1
        $res = $this->database->put(
83 1
            $this->resourceName,
84 1
            $this->primaryKey,
85
            $resourceId,
86
            $newResource
87
        );
88 1
        $this->resource = $reflectionHelper->createInstance($this->schemaClass, [$res]);
89 1
    }
90
91 2
    public function delete($resourceId)
92
    {
93 2
        $this->database->delete($this->resourceName, $this->primaryKey, $resourceId);
94 1
        $this->reset();
95 1
    }
96
97 1
    public function reset()
98
    {
99 1
        $reflectionHelper = new ReflectionHelper;
100 1
        $this->resource = $reflectionHelper->createInstance($this->schemaClass);
101 1
    }
102
103 4
    protected function setUpdateMode($value)
104
    {
105 4
        $this->updateMode = $value;
106 4
    }
107
108 4
    protected function setFieldDefaults()
109
    {
110 4
        $properties = get_object_vars($this->resource);
111 4
        foreach ($this->schema->getFields($this->resource) as $fieldName => $field) {
112 2
            if (isset($properties[$fieldName])) {
113 1
                continue;
114
            }
115 2
            if (!isset($field['default'])) {
116 2
                continue;
117
            }
118 2
            $this->setFieldDefaultValue($fieldName, $field['default']);
119
        }
120 4
    }
121
122 2
    protected function setFieldDefaultValue($fieldName, $value)
123
    {
124 2
        if (gettype($value) === 'object' && is_callable($value)) {
125 1
            $this->resource->{$fieldName} = $value();
126 1
            return;
127
        }
128 2
        $this->resource->{$fieldName} = $value;
129 2
    }
130
131 9
    public function validateSchema($resource)
132
    {
133 9
        $this->schema->validate($resource);
134 4
    }
135
136 6
    public function validate()
137
    {
138 6
        $uniqueFields = $this->getUniqueFields();
139 6
        if (!empty($uniqueFields)) {
140 3
            $this->validateUniqueFields();
141
        }
142 5
    }
143
144 1
    public function toArray()
145
    {
146 1
        return json_decode(json_encode($this->resource), true);
147
    }
148
149 8
    public function getPrimaryKeyValue()
150
    {
151 8
        if (property_exists($this->resource, $this->primaryKey)) {
152 6
            return $this->resource->{$this->primaryKey};
153
        }
154 2
        return null;
155
    }
156
157 12
    public function getUniqueFields()
158
    {
159 12
        return $this->schema->getUniqueFields($this->resource);
160
    }
161
162
    abstract public function validateUniqueFields();
163
164 4
    protected function getDatabaseName()
165
    {
166 4
        return $this->database->getDatabaseName();
167
    }
168
169 9
    protected function getClient()
170
    {
171 9
        return $this->database->getClient();
172
    }
173
}
174