source: Dev/branches/rest-dojo-ui/server/api.php @ 256

Last change on this file since 256 was 256, checked in by hendrikvanantwerpen, 13 years ago

Reworked project structure based on REST interaction and Dojo library. As
soon as this is stable, the old jQueryUI branch can be removed (it's
kept for reference).

File size: 5.5 KB
Line 
1<?php
2
3error_reporting(E_ALL);
4ini_set('display_errors', True);
5
6require_once 'tonic/lib/tonic.php';
7require_once 'classes/master.php';
8
9use Tonic\Request as Request;
10use Tonic\Response as Response;
11use Tonic\ResponseException as ResponseException;
12use Tonic\Resource as Resource;
13
14function restore_session() {
15    if (isset($_COOKIE['rft_uid'])) {
16        $user = Auth::restore($_COOKIE['rft_uid']);
17        if ($user) {
18            return $user;
19        }
20    }
21    throw new ResponseException("No valid session found", Response::UNAUTHORIZED);
22}
23
24function get_clean_uri($request) {
25    return substr($request->uri, strlen($request->baseUri));
26}
27
28/**
29 *  @uri /login
30 */
31class LoginResource extends Resource {
32
33    function post($request) {
34        $response = new Response($request);
35
36        if (!empty($request->data)) {
37            $data = json_decode($request->data);
38            $user = Auth::login($data->username, sha1($data->password));
39            if ($user) {
40                $response->addHeader('Set-Cookie', 'rft_uid=' . $user->uid . '; Path=' . $request->baseUri);
41                $response->body = json_encode($user);
42            } else {
43                throw new ResponseException("Incorrect username and password", Response::UNAUTHORIZED);
44            }
45        } else {
46            throw new ResponseException("No login data provided", Response::BADREQUEST);
47        }
48        return $response;
49    }
50
51}
52
53/**
54 * @uri /data/\w+
55 */
56class DataCollectionResource extends Resource {
57
58    function getType($request) {
59        $uri = get_clean_uri($request);
60        $path = explode('/', $uri);
61        $type = $path[2];
62        return $type;
63    }
64
65    function get($request) {
66        restore_session();
67        $response = new Response($request);
68
69        $type = $this->getType($request);
70
71        $objects = $type::get(array());
72        //$objects = array_map(function($val) { return array('uid' => $val->uid); }, $objects);
73
74        $response->body = json_encode($objects);
75        return $response;
76    }
77
78    function post($request) {
79        restore_session();
80        $response = new Response($request);
81
82        $type = $this->getType($request);
83        $data = json_decode($request->data);
84        $onlyAdd = $request->ifNoneMatch('*');
85        $onlyUpdate = $request->ifMatch('*');
86
87        $object = FALSE;
88        if (isset($data->uid)) {
89            $objects = $type::get(array('uid' => $data->uid));
90            if (!empty($objects)) {
91                $object = $objects[0];
92            }
93        }
94
95        if (( $onlyUpdate && !$object ) || ( $onlyAdd && $object )) {
96            throw new ResponseException("Update/Create and existing object mismatch", Response::PRECONDITIONFAILED);
97        }
98
99        if (!$object) {
100            $object = new $type(null);
101            $response->code = Response::CREATED;
102        } else {
103            $response->code = Response::OK;
104        }
105        foreach ($data as $key => $val) {
106            $object->$key = $val;
107        }
108        $object->save();
109
110        $response->body = json_encode($object);
111        return $response;
112    }
113
114}
115
116/**
117 * @uri /data/\w+/\w+
118 */
119class DataObjectResource extends Resource {
120
121    function getTypeAndUid($request) {
122        $uri = get_clean_uri($request);
123        $path = explode('/', $uri);
124        $type = $path[2];
125        $uid = $path[3];
126        return array('type' => $type, 'uid' => $uid);
127    }
128
129    function get($request) {
130        restore_session();
131        $response = new Response($request);
132
133        $info = $this->getTypeAndUid($request);
134
135        $objects = $info['type']::get(array('uid' => $info['uid']));
136        if (empty($objects)) {
137            throw new ReponseException("Object not found", Response::NOTFOUND);
138        }
139
140        $response->body = json_encode($objects[0]);
141        return $response;
142    }
143
144    function put($request) {
145        restore_session();
146        $response = new Response($request);
147
148        $info = $this->getTypeAndUid($request);
149        $data = json_decode($request->data);
150        $onlyAdd = $request->ifNoneMatch('*');
151        $onlyUpdate = $request->ifMatch('*');
152
153        $object = FALSE;
154        $objects = $info['type']::get(array('uid' => $info['uid']));
155        if (!empty($objects)) {
156            $object = $objects[0];
157        }
158
159        if (( $onlyUpdate && !$object ) || ( $onlyAdd && $object )) {
160            throw new ResponseException("Update/Create and existing object mismatch", Response::PRECONDITIONFAILED);
161        }
162
163        if (!$object) {
164            $object = new $info['type']($info->uid);
165            $response->code = Response::CREATED;
166        } else {
167            $response->code = Response::OK;
168        }
169        foreach ($data as $key => $val) {
170            $object->$key = $val;
171        }
172        $object->save();
173
174        $response->body = json_encode($object);
175        return $response;
176    }
177
178    function delete($request) {
179        restore_session();
180        throw new ReponseException("Delete not implemented", Response::METHODNOTALLOWED);
181    }
182
183}
184
185$request = new Request();
186$path = $request->uri;
187$idx = strrpos($path, 'api.php');
188if ($idx !== FALSE) {
189    $baseUri = substr($path, 0, $idx + 7);
190    $request->baseUri = $baseUri;
191}
192try {
193    $resource = $request->loadResource();
194    $response = $resource->exec($request);
195} catch (ResponseException $e) {
196    $response = $e->response($request);
197}
198$response->addHeader('Content-Type', 'application/json');
199$response->addHeader('Cache-Control', 'no-cache, must-revalidate');
200$response->addHeader('Expires', 'Sat, 26 Jul 1997 05:00:00 GMT');
201$response->output();
202?>
Note: See TracBrowser for help on using the repository browser.