addHeader('Set-Cookie', 'rft_uid=' . $user->uid . '; Max-Age: 3600; Path=' . $response->request->baseUri); } function restore_session($response) { if (isset($_COOKIE['rft_uid'])) { $user = Auth::restore($_COOKIE['rft_uid']); if ($user) { set_session_cookie($response, $user); return $user; } } throw new ResponseException("No valid session found", Response::UNAUTHORIZED); } function get_clean_uri($request) { return substr($request->uri, strlen($request->baseUri)); } function add_default_headers($response) { $response->addHeader('Content-Type', 'application/json'); $response->addHeader('Cache-Control', 'no-cache, must-revalidate'); $response->addHeader('Expires', 'Sat, 26 Jul 1997 05:00:00 GMT'); } /** * @uri /login */ class LoginResource extends Resource { function post($request) { $response = new Response($request); $user = null; $data = null; if (!empty($request->data)) { $data = json_decode($request->data, true); } if (!empty($data)) { $user = Auth::login($data['username'], sha1($data['password'])); if (!$user) { throw new ResponseException("Incorrect username and password", Response::UNAUTHORIZED); } set_session_cookie($response, $user); } else { $user = restore_session($response); } $response->body = json_encode($user); return $response; } } /** * @uri /data/\w+ */ class DataCollectionResource extends Resource { function getType($request) { $uri = get_clean_uri($request); $path = explode('/', $uri); $type = $path[2]; return $type; } function get($request) { $response = new Response($request); restore_session($response); $type = $this->getType($request); $objects = $type::get(array()); //$objects = array_map(function($val) { return array('uid' => $val->uid); }, $objects); $response->body = json_encode($objects); return $response; } function post($request) { $response = new Response($request); restore_session($response); $type = $this->getType($request); $data = json_decode($request->data); $onlyAdd = $request->ifNoneMatch('*'); $onlyUpdate = $request->ifMatch('*'); $object = FALSE; if (isset($data->uid)) { $objects = $type::get(array('uid' => $data->uid)); if (!empty($objects)) { $object = $objects[0]; } } if (( $onlyUpdate && !$object ) || ( $onlyAdd && $object )) { throw new ResponseException("Update/Create and existing object mismatch", Response::PRECONDITIONFAILED); } if (!$object) { $object = new $type(null); $response->code = Response::CREATED; } else { $response->code = Response::OK; } foreach ($data as $key => $val) { $object->$key = $val; } $object->save(); $response->body = json_encode($object); return $response; } } /** * @uri /data/\w+/\w+ */ class DataObjectResource extends Resource { function getTypeAndUid($request) { $uri = get_clean_uri($request); $path = explode('/', $uri); $type = $path[2]; $uid = $path[3]; return array('type' => $type, 'uid' => $uid); } function get($request) { $response = new Response($request); restore_session($response); $info = $this->getTypeAndUid($request); $objects = $info['type']::get(array('uid' => $info['uid'])); if (empty($objects)) { throw new ResponseException("Object not found", Response::NOTFOUND); } $response->body = json_encode($objects[0]); return $response; } function put($request) { $response = new Response($request); restore_session($response); $info = $this->getTypeAndUid($request); $data = json_decode($request->data); $onlyAdd = $request->ifNoneMatch('*'); $onlyUpdate = $request->ifMatch('*'); $object = FALSE; $objects = $info['type']::get(array('uid' => $info['uid'])); if (!empty($objects)) { $object = $objects[0]; } if (( $onlyUpdate && !$object ) || ( $onlyAdd && $object )) { throw new ResponseException("Update/Create and existing object mismatch", Response::PRECONDITIONFAILED); } if (!$object) { $object = new $info['type']($info->uid); $response->code = Response::CREATED; } else { $response->code = Response::OK; } foreach ($data as $key => $val) { $object->$key = $val; } $object->save(); $response->body = json_encode($object); return $response; } function delete($request) { restore_session(); throw new ReponseException("Delete not implemented", Response::METHODNOTALLOWED); } } $request = new Request(); $path = $request->uri; $idx = strrpos($path, 'api.php'); if ($idx !== FALSE) { $baseUri = substr($path, 0, $idx + 7); $request->baseUri = $baseUri; } try { $resource = $request->loadResource(); $response = $resource->exec($request); } catch (ResponseException $e) { $response = $e->response($request); $response->body = json_encode(array('errorMsg' => $response->body)); } catch (Exception $e) { $response = new Response($request); $response->code = Response::INTERNALSERVERERROR; $response->body = json_encode(array('errorMsg' => "Unhandled exception: " . $e)); } add_default_headers($response); $response->output(); ?>