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

Last change on this file since 311 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
RevLine 
[256]1<?php
2
3error_reporting(E_ALL);
4ini_set('display_errors', True);
5
[303]6define("RDFAPI_INCLUDE_DIR", "rdfapi/");
[256]7require_once 'tonic/lib/tonic.php';
[303]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) {
[303]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)) {
[274]51            $user = Auth::login($request->data['email'], $request->data['password']);
[260]52            if (!$user) {
[274]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        }
[274]59        $response->body = $user;
[256]60        return $response;
61    }
62
63}
64
65/**
[274]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 {
[292]78            throw new ResponseException("No email and password provided.", Response::BADREQUEST);
[274]79        }
80        $response->body = $user;
81        return $response;
82    }
83
84}
85
86/**
[292]87 * @uri /data/\w+(/\w+)?
[256]88 */
[292]89class DataResource extends Resource {
[256]90
[303]91    private function getTypeAndUid($request) {
[256]92        $uri = get_clean_uri($request);
93        $path = explode('/', $uri);
94
[292]95        $info = array();
96        $info['type'] = $path[2];
97        if (isset($path[3])) {
98            $info['uid'] = $path[3];
[256]99        }
[292]100       
101        return $info;
[256]102    }
103
104    function get($request) {
105        $response = new Response($request);
[260]106        restore_session($response);
[256]107
108        $info = $this->getTypeAndUid($request);
[292]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;
[256]118        }
119
120        return $response;
121    }
122
[275]123    function post($request) {
[256]124        $response = new Response($request);
[292]125        $user = restore_session($response);
[256]126
127        $info = $this->getTypeAndUid($request);
128        $onlyAdd = $request->ifNoneMatch('*');
129        $onlyUpdate = $request->ifMatch('*');
130
[292]131        $uid = null;
132        if (isset($info['uid'])) {
133            $uid = $info['uid'];
134        } else if (isset($request->data->uid)) {
135            $uid = $request->data->uid;
[256]136        }
137
[292]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
[256]146        if (( $onlyUpdate && !$object ) || ( $onlyAdd && $object )) {
147            throw new ResponseException("Update/Create and existing object mismatch", Response::PRECONDITIONFAILED);
148        }
149
150        if (!$object) {
[292]151            $object = new $info['type']($uid);
[256]152            $response->code = Response::CREATED;
153        } else {
154            $response->code = Response::OK;
155        }
[274]156        foreach ($request->data as $key => $val) {
[256]157            $object->$key = $val;
158        }
[303]159        $object->save();
[256]160
[274]161        $response->body = $object;
[256]162        return $response;
163    }
164
[275]165    function put($request) {
166        return $this->post($request);
167    }
168
[256]169    function delete($request) {
[274]170        restore_session(new Response($request));
[256]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}
[274]183$request->data = Marshaller::unmarshall(json_decode($request->data));
[256]184try {
185    $resource = $request->loadResource();
186    $response = $resource->exec($request);
187} catch (ResponseException $e) {
188    $response = $e->response($request);
[274]189    $response->body = array('errorMsg' => $response->body);
[263]190} catch (Exception $e) {
191    $response = new Response($request);
192    $response->code = Response::INTERNALSERVERERROR;
[274]193    $response->body = array('errorMsg' => "Unhandled exception: " . $e);
[256]194}
[263]195add_default_headers($response);
[274]196$response->body = json_encode(Marshaller::marshall($response->body));
[256]197$response->output();
[274]198
[256]199?>
Note: See TracBrowser for help on using the repository browser.