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

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

Merged rest-dojo-ui 305:309

File size: 6.7 KB
RevLine 
[256]1<?php
2
3error_reporting(E_ALL);
4ini_set('display_errors', True);
5
[310]6define("RDFAPI_INCLUDE_DIR", "rdfapi/");
[256]7require_once 'tonic/lib/tonic.php';
[310]8require_once 'classes/Model.php';
[256]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
[263]16function set_session_cookie($response, $user) {
[310]17    $response->addHeader('Set-Cookie', 'rft_uid=' . $user->getUid() . '; Max-Age: 3600; Path=' . $response->request->baseUri);
[260]18}
19
20function restore_session($response) {
[256]21    if (isset($_COOKIE['rft_uid'])) {
22        $user = Auth::restore($_COOKIE['rft_uid']);
23        if ($user) {
[260]24            set_session_cookie($response, $user);
[256]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
[263]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
[256]41/**
42 *  @uri /login
43 */
44class LoginResource extends Resource {
45
46    function post($request) {
47        $response = new Response($request);
48
[260]49        $user = null;
[263]50        if (!empty($request->data)) {
[285]51            $user = Auth::login($request->data['email'], $request->data['password']);
[260]52            if (!$user) {
[285]53                throw new ResponseException("Incorrect email and password", Response::UNAUTHORIZED);
[256]54            }
[263]55            set_session_cookie($response, $user);
[256]56        } else {
[260]57            $user = restore_session($response);
[256]58        }
[285]59        $response->body = $user;
[256]60        return $response;
61    }
62
63}
64
65/**
[285]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/**
[256]87 * @uri /data/\w+
88 */
89class DataCollectionResource extends Resource {
90
[310]91    private function getTypeAndUid($request) {
[256]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);
[260]100        restore_session($response);
[256]101
102        $type = $this->getType($request);
103        $objects = $type::get(array());
104
[285]105        $response->body = $objects;
[256]106        return $response;
107    }
108
109    function post($request) {
110        $response = new Response($request);
[260]111        restore_session($response);
[256]112
113        $type = $this->getType($request);
114        $onlyAdd = $request->ifNoneMatch('*');
115        $onlyUpdate = $request->ifMatch('*');
116
117        $object = FALSE;
[285]118        if (isset($request->data->uid)) {
119            $objects = $type::get(array('uid' => $request->data->uid));
[256]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        }
[285]135        foreach ($request->data as $key => $val) {
[256]136            $object->$key = $val;
137        }
[285]138        if (!$object->save()) {
139            throw new ResponseException("Save failed", Response::INTERNALSERVERERROR);
140        }
[256]141
[285]142        $response->body = $object;
[256]143        return $response;
144    }
145
[285]146    function put($request) {
147        return $this->post($request);
148    }
149   
[256]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);
[260]167        restore_session($response);
[256]168
169        $info = $this->getTypeAndUid($request);
170        $objects = $info['type']::get(array('uid' => $info['uid']));
171        if (empty($objects)) {
[263]172            throw new ResponseException("Object not found", Response::NOTFOUND);
[256]173        }
174
[285]175        $response->body = $objects[0];
[256]176        return $response;
177    }
178
[285]179    function post($request) {
[256]180        $response = new Response($request);
[260]181        restore_session($response);
[256]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        }
[285]203        foreach ($request->data as $key => $val) {
[256]204            $object->$key = $val;
205        }
[310]206        $object->save();
[256]207
[285]208        $response->body = $object;
[256]209        return $response;
210    }
211
[285]212    function put($request) {
213        return $this->post($request);
214    }
215
[256]216    function delete($request) {
[285]217        restore_session(new Response($request));
[256]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}
[285]230$request->data = Marshaller::unmarshall(json_decode($request->data));
[256]231try {
232    $resource = $request->loadResource();
233    $response = $resource->exec($request);
234} catch (ResponseException $e) {
235    $response = $e->response($request);
[285]236    $response->body = array('errorMsg' => $response->body);
[263]237} catch (Exception $e) {
238    $response = new Response($request);
239    $response->code = Response::INTERNALSERVERERROR;
[285]240    $response->body = array('errorMsg' => "Unhandled exception: " . $e);
[256]241}
[263]242add_default_headers($response);
[285]243$response->body = json_encode(Marshaller::marshall($response->body));
[256]244$response->output();
[285]245
[256]246?>
Note: See TracBrowser for help on using the repository browser.