Completed
Push — d64 ( 62f943...6cea38 )
by Welling
02:25
created

ClientLocal::deleteFile()   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
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 4
ccs 0
cts 3
cp 0
crap 2
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Directus – <http://getdirectus.com>
5
 *
6
 * @link      The canonical repository – <https://github.com/directus/directus>
7
 * @copyright Copyright 2006-2016 RANGER Studio, LLC – <http://rangerstudio.com>
8
 * @license   GNU General Public License (v3) – <http://www.gnu.org/copyleft/gpl.html>
9
 */
10
11
namespace Directus\SDK;
12
13
use Directus\Database\Connection;
14
use Directus\Database\TableGateway\BaseTableGateway;
15
use Directus\Database\TableGateway\DirectusMessagesTableGateway;
16
use Directus\Database\TableGateway\RelationalTableGateway;
17
use Directus\Database\TableSchema;
18
use Directus\SDK\Response\EntryCollection;
19
use Directus\SDK\Response\Entry;
20
21
/**
22
 * Client Local
23
 *
24
 * Client to Interact with the database directly using Directus Database Component
25
 *
26
 * @author Welling Guzmán <[email protected]>
27
 */
28
class ClientLocal implements RequestsInterface
29
{
30
    /**
31
     * @var BaseTableGateway[]
32
     */
33
    protected $tableGateways = [];
34
35
    /**
36
     * @var Connection
37
     */
38
    protected $connection = null;
39
40
    /**
41
     * ClientLocal constructor.
42
     *
43
     * @param $connection
44
     */
45
    public function __construct($connection)
46
    {
47
        $this->connection = $connection;
48
    }
49
50
    /**
51
     * @inheritDoc
52
     */
53
    public function getTables(array $params = [])
54
    {
55
        return $this->createResponseFromData(TableSchema::getTablesSchema($params));
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->createResponseFro...TablesSchema($params)); of type Directus\SDK\Response\En...ctus\SDK\Response\Entry adds the type Directus\SDK\Response\Entry to the return on line 55 which is incompatible with the return type declared by the interface Directus\SDK\RequestsInterface::getTables of type Directus\SDK\Response\EntryCollection.
Loading history...
56
    }
57
58
    /**
59
     * @inheritDoc
60
     */
61
    public function getTable($tableName)
62
    {
63
        return $this->createResponseFromData(TableSchema::getSchemaArray($tableName));
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->createResponseFro...hemaArray($tableName)); of type Directus\SDK\Response\En...ctus\SDK\Response\Entry adds the type Directus\SDK\Response\EntryCollection to the return on line 63 which is incompatible with the return type declared by the interface Directus\SDK\RequestsInterface::getTable of type Directus\SDK\Response\Entry.
Loading history...
64
    }
65
66
    /**
67
     * @inheritDoc
68
     */
69
    public function getColumns($tableName, array $params = [])
70
    {
71
        return $this->createResponseFromData(TableSchema::getTableColumnsSchema($tableName, $params));
0 ignored issues
show
Bug introduced by
The method getTableColumnsSchema() does not exist on Directus\Database\TableSchema. Did you maybe mean getTable()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
Bug Compatibility introduced by
The expression $this->createResponseFro...($tableName, $params)); of type Directus\SDK\Response\En...ctus\SDK\Response\Entry adds the type Directus\SDK\Response\Entry to the return on line 71 which is incompatible with the return type declared by the interface Directus\SDK\RequestsInterface::getColumns of type Directus\SDK\Response\EntryCollection.
Loading history...
72
    }
73
74
    /**
75
     * @inheritDoc
76
     */
77
    public function getColumn($tableName, $columnName)
78
    {
79
        return $this->createResponseFromData(TableSchema::getColumnSchemaArray($tableName, $columnName));
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->createResponseFro...bleName, $columnName)); of type Directus\SDK\Response\En...ctus\SDK\Response\Entry adds the type Directus\SDK\Response\EntryCollection to the return on line 79 which is incompatible with the return type declared by the interface Directus\SDK\RequestsInterface::getColumn of type Directus\SDK\Response\Entry.
Loading history...
80
    }
81
82
    /**
83
     * @inheritDoc
84
     */
85
    public function getEntries($tableName, array $params = [])
86
    {
87
        $tableGateway = $this->getTableGateway($tableName);
88
89
        return $this->createResponseFromData($tableGateway->getEntries($params));
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->createResponseFro...->getEntries($params)); of type Directus\SDK\Response\En...ctus\SDK\Response\Entry adds the type Directus\SDK\Response\Entry to the return on line 89 which is incompatible with the return type declared by the interface Directus\SDK\RequestsInterface::getEntries of type Directus\SDK\Response\EntryCollection.
Loading history...
90
    }
91
92
    /**
93
     * @inheritDoc
94
     */
95
    public function getEntry($tableName, $id, array $params = [])
96
    {
97
        // @TODO: Dynamic ID
98
        return $this->getEntries($tableName, array_merge($params, [
0 ignored issues
show
Bug Best Practice introduced by
The return type of return $this->getEntries..., array('id' => $id))); (Directus\SDK\Response\EntryCollection) is incompatible with the return type declared by the interface Directus\SDK\RequestsInterface::getEntry of type Directus\SDK\Response\Entry.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
99
            'id' => $id
100
        ]));
101
    }
102
103
    /**
104
     * @inheritDoc
105
     */
106
    public function getUsers(array $params = [])
107
    {
108
        // @TODO: store the directus tables somewhere (SchemaManager?)
109
        return $this->getEntries('directus_users', $params);
110
    }
111
112
    /**
113
     * @inheritDoc
114
     */
115
    public function getUser($id, array $params = [])
116
    {
117
        return $this->getEntry('directus_users', $id, $params);
0 ignored issues
show
Bug Best Practice introduced by
The return type of return $this->getEntry('..._users', $id, $params); (Directus\SDK\Response\EntryCollection) is incompatible with the return type declared by the interface Directus\SDK\RequestsInterface::getUser of type Directus\SDK\Response\Entry.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
118
    }
119
120
    /**
121
     * @inheritDoc
122
     */
123
    public function getGroups(array $params = [])
124
    {
125
        return $this->getEntries('directus_groups', $params);
126
    }
127
128
    /**
129
     * @inheritDoc
130
     */
131
    public function getGroup($id, array $params = [])
132
    {
133
        return $this->getEntry('directus_groups', $id, $params);
0 ignored issues
show
Bug Best Practice introduced by
The return type of return $this->getEntry('...groups', $id, $params); (Directus\SDK\Response\EntryCollection) is incompatible with the return type declared by the interface Directus\SDK\RequestsInterface::getGroup of type Directus\SDK\Response\Entry.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
134
    }
135
136
    /**
137
     * @inheritDoc
138
     */
139
    public function getGroupPrivileges($groupID)
140
    {
141
        $this->getEntries('directus_privileges', [
142
            'filter' => [
143
                'group_id' => ['eq' => $groupID]
144
            ]
145
        ]);
146
    }
147
148
    /**
149
     * @inheritDoc
150
     */
151
    public function getFiles(array $params = [])
152
    {
153
        return $this->getEntries('directus_files', $params);
154
    }
155
156
    /**
157
     * @inheritDoc
158
     */
159
    public function getFile($id, array $params = [])
160
    {
161
        return $this->getEntry('directus_files', $id, $params);
0 ignored issues
show
Bug Best Practice introduced by
The return type of return $this->getEntry('..._files', $id, $params); (Directus\SDK\Response\EntryCollection) is incompatible with the return type declared by the interface Directus\SDK\RequestsInterface::getFile of type Directus\SDK\Response\Entry.

If you return a value from a function or method, it should be a sub-type of the type that is given by the parent type f.e. an interface, or abstract method. This is more formally defined by the Lizkov substitution principle, and guarantees that classes that depend on the parent type can use any instance of a child type interchangably. This principle also belongs to the SOLID principles for object oriented design.

Let’s take a look at an example:

class Author {
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

abstract class Post {
    public function getAuthor() {
        return 'Johannes';
    }
}

class BlogPost extends Post {
    public function getAuthor() {
        return new Author('Johannes');
    }
}

class ForumPost extends Post { /* ... */ }

function my_function(Post $post) {
    echo strtoupper($post->getAuthor());
}

Our function my_function expects a Post object, and outputs the author of the post. The base class Post returns a simple string and outputting a simple string will work just fine. However, the child class BlogPost which is a sub-type of Post instead decided to return an object, and is therefore violating the SOLID principles. If a BlogPost were passed to my_function, PHP would not complain, but ultimately fail when executing the strtoupper call in its body.

Loading history...
162
    }
163
164
    /**
165
     * @inheritDoc
166
     */
167
    public function getSettings()
168
    {
169
        return $this->getEntries('directus_settings');
170
    }
171
172
    /**
173
     * @inheritDoc
174
     */
175
    public function getSettingsByCollection($collectionName)
176
    {
177
        return $this->getEntries('directus_settings', [
178
            'filter' => [
179
                'collection' => ['eq' => $collectionName]
180
            ]
181
        ]);
182
    }
183
184
    /**
185
     * @inheritDoc
186
     */
187
    public function getMessages($userId)
188
    {
189
        $messagesTableGateway = new DirectusMessagesTableGateway($this->connection, null);
0 ignored issues
show
Documentation introduced by
null is of type null, but the function expects a object<Directus\Acl\Acl>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
190
        $result = $messagesTableGateway->fetchMessagesInboxWithHeaders($userId);
191
192
        return $this->createResponseFromData($result);
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->createResponseFromData($result); of type Directus\SDK\Response\En...ctus\SDK\Response\Entry adds the type Directus\SDK\Response\Entry to the return on line 192 which is incompatible with the return type declared by the interface Directus\SDK\RequestsInterface::getMessages of type Directus\SDK\Response\EntryCollection.
Loading history...
193
    }
194
195
    /**
196
     * @inheritDoc
197
     */
198
    public function createEntry($tableName, array $data)
199
    {
200
        $tableGateway = $this->getTableGateway($tableName);
201
        $newRecord = $tableGateway->manageRecordUpdate($tableName, $data);
202
203
        return $this->createResponseFromData($newRecord->toArray());
0 ignored issues
show
Bug Compatibility introduced by
The expression $this->createResponseFro...$newRecord->toArray()); of type Directus\SDK\Response\En...ctus\SDK\Response\Entry adds the type Directus\SDK\Response\EntryCollection to the return on line 203 which is incompatible with the return type declared by the interface Directus\SDK\RequestsInterface::createEntry of type Directus\SDK\Response\Entry.
Loading history...
204
    }
205
206
    /**
207
     * @inheritDoc
208
     */
209
    public function updateEntry($tableName, $id, array $data)
210
    {
211
        $tableGateway = $this->getTableGateway($tableName);
212
        $record = $tableGateway->manageRecordUpdate($tableName, array_merge($data, ['id' => $id]));
213
214
        return $this->createResponseFromData($record->toArray());
215
    }
216
217
    /**
218
     * @inheritDoc
219
     */
220
    public function deleteEntry($tableName, $ids)
221
    {
222
        // @TODO: Accept EntryCollection and Entry
223
        $tableGateway = $this->getTableGateway($tableName);
224
225
        if (!is_array($ids)) {
226
            $ids = [$ids];
227
        }
228
229
        return $tableGateway->delete(function($delete) use ($ids) {
230
            return $delete->where->in('id', $ids);
231
        });
232
    }
233
234
    /**
235
     * @inheritDoc
236
     */
237
    public function createUser(array $data)
238
    {
239
        return $this->createEntry('directus_users', $data);
240
    }
241
242
    /**
243
     * @inheritDoc
244
     */
245
    public function updateUser($id, array $data)
246
    {
247
        return $this->updateEntry('directus_users', $id, $data);
248
    }
249
250
    /**
251
     * @inheritDoc
252
     */
253
    public function deleteUser($ids)
254
    {
255
        return $this->deleteEntry('directus_users', $ids);
256
    }
257
258
    /**
259
     * @inheritDoc
260
     */
261
    public function createFile(array $data)
262
    {
263
        return $this->createEntry('directus_files', $data);
264
    }
265
266
    /**
267
     * @inheritDoc
268
     */
269
    public function updateFile($id, array $data)
270
    {
271
        return $this->updateEntry('directus_files', $id, $data);
272
    }
273
274
    /**
275
     * @inheritDoc
276
     */
277
    public function deleteFile($ids)
278
    {
279
        return $this->deleteEntry('directus_files', $ids);
280
    }
281
282
283
    /**
284
     * Get a table gateway for the given table name
285
     *
286
     * @param $tableName
287
     *
288
     * @return RelationalTableGateway
289
     */
290
    protected function getTableGateway($tableName)
291
    {
292
        if (!array_key_exists($tableName, $this->tableGateways)) {
293
            $acl = TableSchema::getAclInstance();
294
            $this->tableGateways[$tableName] = new RelationalTableGateway($tableName, $this->connection, $acl);
295
        }
296
297
        return $this->tableGateways[$tableName];
298
    }
299
300
    // @TODO: move to a builder class
301
    protected function createResponseFromData($data)
302
    {
303
        if (isset($data['rows'])) {
304
            $response = new EntryCollection($data);
305
        } else {
306
            $response = new Entry($data);
307
        }
308
309
        return $response;
310
    }
311
}
312