Completed
Push — develop ( ed6c74...ceecfe )
by Patrick
04:06
created

Http/Rest/DataTableAPI.php (2 issues)

Labels
Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
namespace Flipside\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
    /**
16
     * Create the DataTableAPI for the given DataTable info
17
     *
18
     * @param string $datSetName The name of the DataSet used in the Settings
19
     * @param string $dataTableName The name of the table in the DataSet
20
     * @param string|false $primaryKeyName The table primary key. Must be specified for update/delete capable tables
21
     */
22
    public function __construct($dataSetName, $dataTableName, $primaryKeyName = false)
23
    {
24
        $this->dataSetName    = $dataSetName;
25
        $this->dataTableName  = $dataTableName;
26
        $this->primaryKeyName = $primaryKeyName;
27
    }
28
29
    public function setup($app)
30
    {
31
        $app->get('[/]', array($this, 'readEntries'));
32
        $app->post('[/]', array($this, 'createEntry'));
33
        if($this->primaryKeyName !== false)
34
        {
35
            $app->get('/{name}[/]', array($this, 'readEntry'));
36
            $app->patch('/{name}[/]', array($this, 'updateEntry'));
37
            $app->delete('/{name}[/]', array($this, 'deleteEntry'));
38
        }
39
    }
40
41
    protected function getDataTable()
42
    {
43
        return \DataSetFactory::getDataTableByNames($this->dataSetName, $this->dataTableName);
44
    }
45
46
    protected function canRead($request)
47
    {
48
        $this->validateLoggedIn($request);
49
        //validateLoggedIn is fatal if not logged in...
50
        return true;
51
    }
52
53
    protected function canCreate($request)
54
    {
55
        //Must be overriden in a child class to allow create
56
        return false;
57
    }
58
59
    protected function canUpdate($request, $entity)
60
    {
61
        //Must be overriden in a child class to allow update
62
        return false;
63
    }
64
65
    protected function canDelete($request, $entity)
66
    {
67
        //Must be overriden in a child class to allow update
68
        return false;
69
    }
70
71
    protected function getFilterForPrimaryKey($value)
72
    {
73
        return new \Data\Filter($this->primaryKeyName." eq '$value'");
74
    }
75
76
    protected function manipulateParameters($request, &$odata)
77
    {
78
        return false;
79
    }
80
81
    protected function validateCreate(&$obj, $request)
82
    {
83
        return true;
84
    }
85
86
    protected function validateUpdate(&$newObj, $request, $oldObj)
87
    {
88
        return true;
89
    }
90
91
    protected function postUpdateAction($newObj, $request, $oldObj)
92
    {
93
        return true;
94
    }
95
96
    protected function postDeleteAction($entry)
97
    {
98
        return true;
99
    }
100
101
    public function readEntries($request, $response, $args)
102
    {
103
        if($this->canRead($request) === false)
104
        {
105
            return $response->withStatus(401);
106
        }
107
        $dataTable = $this->getDataTable();
108
        $odata = $request->getAttribute('odata', new \ODataParams(array()));
109
        $params = $this->manipulateParameters($request, $odata);
110
        $areas = $dataTable->read($odata->filter, $odata->select, $odata->top,
111
                                  $odata->skip, $odata->orderby, $params);
112
        if($areas === false)
113
        {
114
            $areas = array();
115
        }
116
        if(method_exists($this, 'processEntry'))
117
        {
118
            $count = count($areas);
119
            for($i = 0; $i < $count; $i++)
120
            {
121
                $areas[$i] = $this->processEntry($areas[$i], $request);
0 ignored issues
show
The method processEntry() does not seem to exist on object<Flipside\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...
122
            }
123
        }
124
        $areas = array_values(array_filter($areas));
125
        if($odata->count)
126
        {
127
            $areas = array('@odata.count'=>count($areas), 'value'=>$areas);
128
        }
129
        return $response->withJson($areas);
130
    }
131
132
    public function createEntry($request, $response, $args)
133
    {
134
        if($this->canCreate($request) === false)
135
        {
136
            return $response->withStatus(401);
137
        }
138
        $dataTable = $this->getDataTable();
139
        $obj = $request->getParsedBody();
140
        if($obj == NULL)
141
        {
142
            $obj = json_decode($request->getBody()->getContents(), true);
143
        }
144
        if($this->validateCreate($obj, $request) === false)
145
        {
146
            return $response->withStatus(400);
147
        }
148
        $ret = $dataTable->create($obj);
149
        return $response->withJson($ret);
150
    }
151
152
    public function readEntry($request, $response, $args)
153
    {
154
        if($this->canRead($request) === false)
155
        {
156
            return $response->withStatus(401);
157
        }
158
        $dataTable = $this->getDataTable();
159
        $odata = $request->getAttribute('odata', new \ODataParams(array()));
160
        $filter = $this->getFilterForPrimaryKey($args['name']);
161
        $areas = $dataTable->read($filter, $odata->select, $odata->top,
162
                                  $odata->skip, $odata->orderby);
163
        if(empty($areas))
164
        {
165
            return $response->withStatus(404);
166
        }
167
        if(method_exists($this, 'processEntry'))
168
        {
169
            $areas[0] = $this->processEntry($areas[0], $request);
0 ignored issues
show
The method processEntry() does not seem to exist on object<Flipside\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...
170
        }
171
        return $response->withJson($areas[0]);
172
    }
173
174
    public function updateEntry($request, $response, $args)
175
    {
176
        if($this->canRead($request) === false)
177
        {
178
            return $response->withStatus(401);
179
        }
180
        $filter = $this->getFilterForPrimaryKey($args['name']);
181
        $dataTable = $this->getDataTable();
182
        $entry = $dataTable->read($filter);
183
        if(empty($entry))
184
        {
185
            return $response->withStatus(404);
186
        }
187
        if(count($entry) === 1 && isset($entry[0]))
188
        {
189
            $entry = $entry[0];
190
        }
191
        if($this->canUpdate($request, $entry) === false)
192
        {
193
            return $response->withStatus(401);
194
        }
195
        $obj = $request->getParsedBody();
196 View Code Duplication
        if($obj === null)
197
        {
198
            $request->getBody()->rewind();
199
            $obj = $request->getBody()->getContents();
200
            $tmp = json_decode($obj, true);
201
            if($tmp !== null)
202
            {
203
                $obj = $tmp;
204
            }
205
        }
206
        if($this->validateUpdate($obj, $request, $entry) === false)
207
        {
208
            return $response->withStatus(400);
209
        }
210
        $ret = $dataTable->update($filter, $obj);
211
        if($ret)
212
        {
213
            $ret = $this->postUpdateAction($obj, $request, $entry);
214
        }
215
        return $response->withJson($ret);
216
    }
217
218
    public function deleteEntry($request, $response, $args)
219
    {
220
        if($this->canRead($request) === false)
221
        {
222
            return $response->withStatus(401);
223
        }
224
        $filter = $this->getFilterForPrimaryKey($args['name']);
225
        $dataTable = $this->getDataTable();
226
        $entry = $dataTable->read($filter);
227
        if(empty($entry))
228
        {
229
            return $response->withStatus(404);
230
        }
231
        $count = count($entry);
232
        for($i = 0; $i < $count; $i++)
233
        {
234
            if($this->canDelete($request, $entry[$i]) === false)
235
            {
236
                return $response->withStatus(401);
237
            }
238
        }
239
        $ret = $dataTable->delete($filter);
240
        if($ret)
241
        {
242
            $ret = $this->postDeleteAction($entry);
243
        }
244
        return $response->withJson($ret);
245
    }
246
}
247