Passed
Push — master ( af979b...597647 )
by Csaba
58s
created

RestObject::getClient()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

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