source: Dev/branches/jos-branch/server/api.php @ 314

Last change on this file since 314 was 310, checked in by jkraaijeveld, 13 years ago

Merged rest-dojo-ui 305:309

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