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

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

[Server] Refactored model classes with some meta-programming. Specific classes only define their fields and inherit from class RdfObject?. Changes to handle the new model objects correctly.
[Client] Added rft/store module for uniform resource access. Removed dependencies on 'uid' field name. Added support for references without loading full object nor exposing uri.
[Client] Added reset() to QuestionWidget?.
[RDFAPI] Fixed PHP warning.

File size: 5.5 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+(/\w+)?
88 */
89class DataResource extends Resource {
90
91    private function getTypeAndUid($request) {
92        $uri = get_clean_uri($request);
93        $path = explode('/', $uri);
94
95        $info = array();
96        $info['type'] = $path[2];
97        if (isset($path[3])) {
98            $info['uid'] = $path[3];
99        }
100       
101        return $info;
102    }
103
104    function get($request) {
105        $response = new Response($request);
106        restore_session($response);
107
108        $info = $this->getTypeAndUid($request);
109        if (isset($info['uid'])) {
110            $objects = $info['type']::get(array('uid' => $info['uid']));
111            if (empty($objects)) {
112                throw new ResponseException("Object not found", Response::NOTFOUND);
113            }
114            $response->body = $objects[0];
115        } else {
116            $objects = $info['type']::get(array());
117            $response->body = $objects;
118        }
119
120        return $response;
121    }
122
123    function post($request) {
124        $response = new Response($request);
125        $user = restore_session($response);
126
127        $info = $this->getTypeAndUid($request);
128        $onlyAdd = $request->ifNoneMatch('*');
129        $onlyUpdate = $request->ifMatch('*');
130
131        $uid = null;
132        if (isset($info['uid'])) {
133            $uid = $info['uid'];
134        } else if (isset($request->data->uid)) {
135            $uid = $request->data->uid;
136        }
137
138        $object = null;
139        if ($uid) {
140            $objects = $info['type']::get(array('uid' => $uid));
141            if (!empty($objects)) {
142                $object = $objects[0];
143            }
144        }
145
146        if (( $onlyUpdate && !$object ) || ( $onlyAdd && $object )) {
147            throw new ResponseException("Update/Create and existing object mismatch", Response::PRECONDITIONFAILED);
148        }
149
150        if (!$object) {
151            $object = new $info['type']($uid);
152            $response->code = Response::CREATED;
153        } else {
154            $response->code = Response::OK;
155        }
156        foreach ($request->data as $key => $val) {
157            $object->$key = $val;
158        }
159        $object->save();
160
161        $response->body = $object;
162        return $response;
163    }
164
165    function put($request) {
166        return $this->post($request);
167    }
168
169    function delete($request) {
170        restore_session(new Response($request));
171        throw new ReponseException("Delete not implemented", Response::METHODNOTALLOWED);
172    }
173
174}
175
176$request = new Request();
177$path = $request->uri;
178$idx = strrpos($path, 'api.php');
179if ($idx !== FALSE) {
180    $baseUri = substr($path, 0, $idx + 7);
181    $request->baseUri = $baseUri;
182}
183$request->data = Marshaller::unmarshall(json_decode($request->data));
184try {
185    $resource = $request->loadResource();
186    $response = $resource->exec($request);
187} catch (ResponseException $e) {
188    $response = $e->response($request);
189    $response->body = array('errorMsg' => $response->body);
190} catch (Exception $e) {
191    $response = new Response($request);
192    $response->code = Response::INTERNALSERVERERROR;
193    $response->body = array('errorMsg' => "Unhandled exception: " . $e);
194}
195add_default_headers($response);
196$response->body = json_encode(Marshaller::marshall($response->body));
197$response->output();
198
199?>
Note: See TracBrowser for help on using the repository browser.