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

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

[Client] Added surveys list and survey details skeleton pages.
[Client] Changed method of passing parameters to pages. This still feels clumsy, because we're working against Dojo a bit with this.
[Server] Integrated REST resources for collections and objects, since they shared more than they differed.

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