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

Last change on this file since 302 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
RevLine 
[256]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
[263]14function set_session_cookie($response, $user) {
[260]15    $response->addHeader('Set-Cookie', 'rft_uid=' . $user->uid . '; Max-Age: 3600; Path=' . $response->request->baseUri);
16}
17
18function restore_session($response) {
[256]19    if (isset($_COOKIE['rft_uid'])) {
20        $user = Auth::restore($_COOKIE['rft_uid']);
21        if ($user) {
[260]22            set_session_cookie($response, $user);
[256]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
[263]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
[256]39/**
40 *  @uri /login
41 */
42class LoginResource extends Resource {
43
44    function post($request) {
45        $response = new Response($request);
46
[260]47        $user = null;
[263]48        if (!empty($request->data)) {
[274]49            $user = Auth::login($request->data['email'], $request->data['password']);
[260]50            if (!$user) {
[274]51                throw new ResponseException("Incorrect email and password", Response::UNAUTHORIZED);
[256]52            }
[263]53            set_session_cookie($response, $user);
[256]54        } else {
[260]55            $user = restore_session($response);
[256]56        }
[274]57        $response->body = $user;
[256]58        return $response;
59    }
60
61}
62
63/**
[274]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 {
[292]76            throw new ResponseException("No email and password provided.", Response::BADREQUEST);
[274]77        }
78        $response->body = $user;
79        return $response;
80    }
81
82}
83
84/**
[292]85 * @uri /data/\w+(/\w+)?
[256]86 */
[292]87class DataResource extends Resource {
[256]88
[292]89    function getTypeAndUid($request) {
[256]90        $uri = get_clean_uri($request);
91        $path = explode('/', $uri);
92
[292]93        $info = array();
94        $info['type'] = $path[2];
95        if (isset($path[3])) {
96            $info['uid'] = $path[3];
[256]97        }
[292]98       
99        return $info;
[256]100    }
101
102    function get($request) {
103        $response = new Response($request);
[260]104        restore_session($response);
[256]105
106        $info = $this->getTypeAndUid($request);
[292]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;
[256]116        }
117
118        return $response;
119    }
120
[275]121    function post($request) {
[256]122        $response = new Response($request);
[292]123        $user = restore_session($response);
[256]124
125        $info = $this->getTypeAndUid($request);
126        $onlyAdd = $request->ifNoneMatch('*');
127        $onlyUpdate = $request->ifMatch('*');
128
[292]129        $uid = null;
130        if (isset($info['uid'])) {
131            $uid = $info['uid'];
132        } else if (isset($request->data->uid)) {
133            $uid = $request->data->uid;
[256]134        }
135
[292]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
[256]144        if (( $onlyUpdate && !$object ) || ( $onlyAdd && $object )) {
145            throw new ResponseException("Update/Create and existing object mismatch", Response::PRECONDITIONFAILED);
146        }
147
148        if (!$object) {
[292]149            $object = new $info['type']($uid);
[256]150            $response->code = Response::CREATED;
151        } else {
152            $response->code = Response::OK;
153        }
[274]154        foreach ($request->data as $key => $val) {
[256]155            $object->$key = $val;
156        }
[292]157        if (isset($object->creator)) {
158            $object->creator = $user;
159        }
[274]160        if (!$object->save()) {
161            throw new ResponseException("Save failed", Response::INTERNALSERVERERROR);
162        }
[256]163
[274]164        $response->body = $object;
[256]165        return $response;
166    }
167
[275]168    function put($request) {
169        return $this->post($request);
170    }
171
[256]172    function delete($request) {
[274]173        restore_session(new Response($request));
[256]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}
[274]186$request->data = Marshaller::unmarshall(json_decode($request->data));
[256]187try {
188    $resource = $request->loadResource();
189    $response = $resource->exec($request);
190} catch (ResponseException $e) {
191    $response = $e->response($request);
[274]192    $response->body = array('errorMsg' => $response->body);
[263]193} catch (Exception $e) {
194    $response = new Response($request);
195    $response->code = Response::INTERNALSERVERERROR;
[274]196    $response->body = array('errorMsg' => "Unhandled exception: " . $e);
[256]197}
[263]198add_default_headers($response);
[274]199$response->body = json_encode(Marshaller::marshall($response->body));
[256]200$response->output();
[274]201
[256]202?>
Note: See TracBrowser for help on using the repository browser.