Completed
Pull Request — develop (#17)
by Patrick
03:07
created

DataTableAPI::updateEntry()   B

Complexity

Conditions 5
Paths 5

Size

Total Lines 25
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 15
nc 5
nop 3
dl 0
loc 25
rs 8.439
c 0
b 0
f 0
1
<?php
2
namespace Http\Rest;
3
4
use \Psr\Http\Message\ServerRequestInterface as Request;
5
use \Psr\Http\Message\ResponseInterface as Response;
6
7
require 'vendor/autoload.php';
8
9
class DataTableAPI extends RestAPI
10
{
11
    protected $dataSetName;
12
    protected $dataTableName;
13
    protected $primaryKeyName;
14
15
    public function __construct($dataSetName, $dataTableName, $primaryKeyName = false)
16
    {
17
        $this->dataSetName    = $dataSetName;
18
        $this->dataTableName  = $dataTableName;
19
        $this->primaryKeyName = $primaryKeyName;
20
    }
21
22
    public function setup($app)
23
    {
24
        $app->get('[/]', array($this, 'readEntries'));
25
        $app->post('[/]', array($this, 'createEntry'));
26
        if($this->primaryKeyName !== false)
27
        {
28
            $app->get('/{name}[/]', array($this, 'readEntry'));
29
            $app->patch('/{name}[/]', array($this, 'updateEntry'));
30
            $app->delete('/{name}[/]', array($this, 'deleteEntry'));
31
        }
32
    }
33
34
    protected function getDataTable()
35
    {
36
        return \DataSetFactory::getDataTableByNames($this->dataSetName, $this->dataTableName);
37
    }
38
39
    protected function canRead($request)
40
    {
41
        $this->validateLoggedIn($request);
42
        //validateLoggedIn is fatal if not logged in...
43
        return true;
44
    }
45
46
    protected function canCreate($request)
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
47
    {
48
        //Must be overriden in a child class to allow create
49
        return false;
50
    }
51
52
    protected function canUpdate($request, $entity)
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $entity is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
53
    {
54
        //Must be overriden in a child class to allow update
55
        return false;
56
    }
57
58
    protected function canDelete($request, $entity)
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $entity is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
59
    {
60
        //Must be overriden in a child class to allow update
61
        return false;
62
    }
63
64
    protected function getFilterForPrimaryKey($value)
65
    {
66
        return new \Data\Filter($this->primaryKeyName." eq '$value'");
67
    }
68
69
    protected function manipulateParameters($request, &$odata)
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $odata is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
70
    {
71
        return false;
72
    }
73
74
    protected function validateCreate(&$obj, $request)
0 ignored issues
show
Unused Code introduced by
The parameter $obj is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $request is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
75
    {
76
        return true;
77
    }
78
79
    protected function validateUpdate(&$newObj, $request, $oldObj)
0 ignored issues
show
Unused Code introduced by
The parameter $newObj is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $request is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $oldObj is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
80
    {
81
        return true;
82
    }
83
84
    public function readEntries($request, $response, $args)
0 ignored issues
show
Unused Code introduced by
The parameter $args is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
85
    {
86
        if($this->canRead($request) === false)
87
        {
88
            return $response->withStatus(401);
89
        }
90
        $dataTable = $this->getDataTable();
91
        $odata = $request->getAttribute('odata', new \ODataParams(array()));
92
        $params = $this->manipulateParameters($request, $odata);
93
        $areas = $dataTable->read($odata->filter, $odata->select, $odata->top,
94
                                  $odata->skip, $odata->orderby, $params);
95
        if(method_exists($this, 'processEntry'))
96
        {
97
            $count = count($areas);
98
            for($i = 0; $i < $count; $i++)
99
            {
100
                $areas[$i] = $this->processEntry($areas[$i], $request);
0 ignored issues
show
Bug introduced by
The method processEntry() does not seem to exist on object<Http\Rest\DataTableAPI>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
101
            }
102
        }
103
        return $response->withJson($areas);
104
    }
105
106
    public function createEntry($request, $response, $args)
0 ignored issues
show
Unused Code introduced by
The parameter $args is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
107
    {
108
        if($this->canCreate($request) === false)
109
        {
110
            return $response->withStatus(401);
111
        }
112
        $dataTable = $this->getDataTable();
113
        $obj = $request->getParsedBody();
114
        if($this->validateCreate($obj, $request) === false)
115
        {
116
            return $response->withStatus(400);
117
        }
118
        $ret = $dataTable->create($obj);
119
        return $response->withJson($ret);
120
    }
121
122
    public function readEntry($request, $response, $args)
123
    {
124
        if($this->canRead($request) === false)
125
        {
126
            return $response->withStatus(401);
127
        }
128
        $dataTable = $this->getDataTable();
129
        $odata = $request->getAttribute('odata', new \ODataParams(array()));
130
        $filter = $this->getFilterForPrimaryKey($args['name']);
131
        $areas = $dataTable->read($filter, $odata->select, $odata->top,
132
                                  $odata->skip, $odata->orderby);
133
        if(empty($areas))
134
        {
135
            return $response->withStatus(404);
136
        }
137
        if(method_exists($this, 'processEntry'))
138
        {
139
            $areas[0] = $this->processEntry($areas[0], $request);
0 ignored issues
show
Bug introduced by
The method processEntry() does not seem to exist on object<Http\Rest\DataTableAPI>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
140
        }
141
        return $response->withJson($areas[0]);
142
    }
143
144
    public function updateEntry($request, $response, $args)
145
    {
146
        if($this->canRead($request) === false)
147
        {
148
            return $response->withStatus(401);
149
        }
150
        $filter = $this->getFilterForPrimaryKey($args['name']);
151
        $dataTable = $this->getDataTable();
152
        $entry = $dataTable->read($filter);
153
        if(empty($entry))
154
        {
155
            return $response->withStatus(404);
156
        }
157
        if($this->canUpdate($request, $entry) === false)
158
        {
159
            return $response->withStatus(401);
160
        }
161
        $obj = $request->getParsedBody();
162
        if($this->validateUpdate($obj, $request, $entry) === false)
163
        {
164
            return $response->withStatus(400);
165
        }
166
        $ret = $dataTable->update($filter, $obj);
167
        return $response->withJson($ret);
168
    }
169
170
    public function deleteEntry($request, $response, $args)
171
    {
172
        if($this->canRead($request) === false)
173
        {
174
            return $response->withStatus(401);
175
        }
176
        $filter = $this->getFilterForPrimaryKey($args['name']);
177
        $dataTable = $this->getDataTable();
178
        $entry = $dataTable->read($filter);
179
        if(empty($entry))
180
        {
181
            return $response->withStatus(404);
182
        }
183
        if($this->canDelete($request, $entry) === false)
184
        {
185
            return $response->withStatus(401);
186
        }
187
        $ret = $dataTable->delete($filter);
188
        return $response->withJson($ret);
189
    }
190
}
191