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

Last change on this file since 260 was 260, checked in by hendrikvanantwerpen, 13 years ago
  • Clear LoginDialog? on show (in case of re-show).
  • Allow to link nodes/widgets to rft.ui.Page members with data-rft-attach-point attribute.
  • Allow arguments to a page to be passed with data-rft-props argument. Content loader rft.content sets this argument on the top node of a loaded page.
  • Have longer cookie-lifetime and update cookie when session is restored. Allow session restore in API and client code.
  • Moved startup Javascript to rft/run.js.
File size: 5.7 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
33/**
34 *  @uri /login
35 */
36class LoginResource extends Resource {
37
38    function post($request) {
39        $response = new Response($request);
40
41        $user = null;
42        $data = null;
43        if ( !empty($request->data) ) {
44            $data = json_decode($request->data,true);
45        }
46        if (!empty($data)) {
47            $user = Auth::login($data['username'], sha1($data['password']));
48            if (!$user) {
49                throw new ResponseException("Incorrect username and password", Response::UNAUTHORIZED);
50            }
51        } else {
52            $user = restore_session($response);
53        }
54        $response->body = json_encode($user);
55        return $response;
56    }
57
58}
59
60/**
61 * @uri /data/\w+
62 */
63class DataCollectionResource extends Resource {
64
65    function getType($request) {
66        $uri = get_clean_uri($request);
67        $path = explode('/', $uri);
68        $type = $path[2];
69        return $type;
70    }
71
72    function get($request) {
73        $response = new Response($request);
74        restore_session($response);
75
76        $type = $this->getType($request);
77        $objects = $type::get(array());
78        //$objects = array_map(function($val) { return array('uid' => $val->uid); }, $objects);
79
80        $response->body = json_encode($objects);
81        return $response;
82    }
83
84    function post($request) {
85        $response = new Response($request);
86        restore_session($response);
87
88        $type = $this->getType($request);
89        $data = json_decode($request->data);
90        $onlyAdd = $request->ifNoneMatch('*');
91        $onlyUpdate = $request->ifMatch('*');
92
93        $object = FALSE;
94        if (isset($data->uid)) {
95            $objects = $type::get(array('uid' => $data->uid));
96            if (!empty($objects)) {
97                $object = $objects[0];
98            }
99        }
100
101        if (( $onlyUpdate && !$object ) || ( $onlyAdd && $object )) {
102            throw new ResponseException("Update/Create and existing object mismatch", Response::PRECONDITIONFAILED);
103        }
104
105        if (!$object) {
106            $object = new $type(null);
107            $response->code = Response::CREATED;
108        } else {
109            $response->code = Response::OK;
110        }
111        foreach ($data as $key => $val) {
112            $object->$key = $val;
113        }
114        $object->save();
115
116        $response->body = json_encode($object);
117        return $response;
118    }
119
120}
121
122/**
123 * @uri /data/\w+/\w+
124 */
125class DataObjectResource extends Resource {
126
127    function getTypeAndUid($request) {
128        $uri = get_clean_uri($request);
129        $path = explode('/', $uri);
130        $type = $path[2];
131        $uid = $path[3];
132        return array('type' => $type, 'uid' => $uid);
133    }
134
135    function get($request) {
136        $response = new Response($request);
137        restore_session($response);
138
139        $info = $this->getTypeAndUid($request);
140        $objects = $info['type']::get(array('uid' => $info['uid']));
141        if (empty($objects)) {
142            throw new ReponseException("Object not found", Response::NOTFOUND);
143        }
144
145        $response->body = json_encode($objects[0]);
146        return $response;
147    }
148
149    function put($request) {
150        $response = new Response($request);
151        restore_session($response);
152
153        $info = $this->getTypeAndUid($request);
154        $data = json_decode($request->data);
155        $onlyAdd = $request->ifNoneMatch('*');
156        $onlyUpdate = $request->ifMatch('*');
157
158        $object = FALSE;
159        $objects = $info['type']::get(array('uid' => $info['uid']));
160        if (!empty($objects)) {
161            $object = $objects[0];
162        }
163
164        if (( $onlyUpdate && !$object ) || ( $onlyAdd && $object )) {
165            throw new ResponseException("Update/Create and existing object mismatch", Response::PRECONDITIONFAILED);
166        }
167
168        if (!$object) {
169            $object = new $info['type']($info->uid);
170            $response->code = Response::CREATED;
171        } else {
172            $response->code = Response::OK;
173        }
174        foreach ($data as $key => $val) {
175            $object->$key = $val;
176        }
177        $object->save();
178
179        $response->body = json_encode($object);
180        return $response;
181    }
182
183    function delete($request) {
184        restore_session();
185        throw new ReponseException("Delete not implemented", Response::METHODNOTALLOWED);
186    }
187
188}
189
190$request = new Request();
191$path = $request->uri;
192$idx = strrpos($path, 'api.php');
193if ($idx !== FALSE) {
194    $baseUri = substr($path, 0, $idx + 7);
195    $request->baseUri = $baseUri;
196}
197try {
198    $resource = $request->loadResource();
199    $response = $resource->exec($request);
200} catch (ResponseException $e) {
201    $response = $e->response($request);
202}
203$response->addHeader('Content-Type', 'application/json');
204$response->addHeader('Cache-Control', 'no-cache, must-revalidate');
205$response->addHeader('Expires', 'Sat, 26 Jul 1997 05:00:00 GMT');
206$response->output();
207?>
Note: See TracBrowser for help on using the repository browser.