Permalink
Browse files

Remove the item id from the rest/gallery/items url as that was incons…

…istent. Add the query parameter ancestors_for=<url> to provide a restful way to retrieve the ancestors of an item.
  • Loading branch information...
1 parent 32fa15c commit e9c8a8ae532e785ab95e6b43864c93b485785d6c @talmdal talmdal committed May 10, 2010
Showing with 142 additions and 16 deletions.
  1. +39 −16 modules/gallery/helpers/items_rest.php
  2. +103 −0 modules/gallery/tests/Items_Rest_Helper_Test.php
View
55 modules/gallery/helpers/items_rest.php
@@ -18,28 +18,35 @@
* Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
*/
class items_rest_Core {
+ /**
+ * To retrieve a collection of items, you can specify the following query parameters to specify the
+ * type of the collection. If both are specified, then the url parameter is used and the
+ * ancestor_for is ignored.
+ *
+ * urls=url1,url2,url3
+ * return items that match the specified urls. Typically used to return the member detail
+ *
+ * ancestor_for=url
+ * return the ancestors of the specified item
+ */
static function get($request) {
- $parent = rest::resolve($request->url);
- access::required("view", $parent);
-
$items = array();
- if (isset($request->params->url)) {
- foreach (json_decode($request->params->url) as $url) {
+ if (isset($request->params->urls)) {
+ foreach (json_decode($request->params->urls) as $url) {
$item = rest::resolve($url);
if (access::can("view", $item)) {
- $item_rest = array("url" => $url,
- "entity" => $item->as_restful_array(),
- "relationships" => rest::relationships("item", $item));
- if ($item->type == "album") {
- $members = array();
- foreach ($item->children() as $child) {
- $members[] = rest::url("item", $child);
- }
- $item_rest["members"] = $members;
- }
- $items[] = $item_rest;
+ $items[] = items_rest::format_restful_item($item);
}
}
+ } else if (isset($request->params->ancestor_for)) {
+ $item = rest::resolve($request->params->ancestor_for);
+ if (!access::can("view", $item)) {
+ throw new Kohana_404_Exception();
+ }
+ $items[] = items_rest::format_restful_item($item);
+ while (($item = $item->parent()) != null) {
+ array_unshift($items, items_rest::format_restful_item($item));
+ };
}
return $items;
@@ -52,4 +59,20 @@ static function resolve($id) {
}
return $item;
}
+
+ private static function format_restful_item($item) {
+ $item_rest = array("url" => rest::url("item", $item),
+ "entity" => $item->as_restful_array(),
+ "relationships" => rest::relationships("item", $item));
+ if ($item->type == "album") {
+ $members = array();
+ foreach ($item->children() as $child) {
+ $members[] = rest::url("item", $child);
+ }
+ $item_rest["members"] = $members;
+ }
+
+ return $item_rest;
+ }
+
}
View
103 modules/gallery/tests/Items_Rest_Helper_Test.php
@@ -0,0 +1,103 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2010 Bharat Mediratta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+class Items_Rest_Helper_Test extends Gallery_Unit_Test_Case {
+ public function get_url_test() {
+ $album1 = test::random_album();
+ $photo1 = test::random_photo($album1);
+ $album2 = test::random_album($album1);
+ $photo2 = test::random_photo($album2);
+ $album1->reload();
+ $album2->reload();
+
+ $request = new stdClass();
+ $request->params = new stdClass();
+ $request->params->urls = json_encode(array(
+ rest::url("item", $photo1),
+ rest::url("item", $album2)));
+ $this->assert_equal_array(
+ array(
+ array("url" => rest::url("item", $photo1),
+ "entity" => $photo1->as_restful_array(),
+ "relationships" => array(
+ "tags" => array(
+ "url" => rest::url("item_tags", $photo1),
+ "members" => array()))),
+ array("url" => rest::url("item", $album2),
+ "entity" => $album2->as_restful_array(),
+ "relationships" => array(
+ "tags" => array(
+ "url" => rest::url("item_tags", $album2),
+ "members" => array())),
+ "members" => array(
+ rest::url("item", $photo2)))),
+ items_rest::get($request));
+ }
+
+ public function get_ancestor_test() {
+ $album1 = test::random_album();
+ $photo1 = test::random_photo($album1);
+ $album2 = test::random_album($album1);
+ $photo2 = test::random_photo($album2);
+ $album1->reload();
+ $album2->reload();
+
+ $root = ORM::factory("item", 1);
+ $restful_root = array(
+ "url" => rest::url("item", $root),
+ "entity" => $root->as_restful_array(),
+ "relationships" => rest::relationships("item", $root));
+ $restful_root["members"] = array();
+ foreach ($root->children() as $child) {
+ $restful_root["members"][] = rest::url("item", $child);
+ }
+
+ $request = new stdClass();
+ $request->params = new stdClass();
+ $request->params->ancestor_for = rest::url("item", $photo2);
+ $this->assert_equal_array(
+ array(
+ $restful_root,
+ array("url" => rest::url("item", $album1),
+ "entity" => $album1->as_restful_array(),
+ "relationships" => array(
+ "tags" => array(
+ "url" => rest::url("item_tags", $album1),
+ "members" => array())),
+ "members" => array(
+ rest::url("item", $photo1),
+ rest::url("item", $album2)),
+ ),
+ array("url" => rest::url("item", $album2),
+ "entity" => $album2->as_restful_array(),
+ "relationships" => array(
+ "tags" => array(
+ "url" => rest::url("item_tags", $album2),
+ "members" => array())),
+ "members" => array(
+ rest::url("item", $photo2))),
+ array("url" => rest::url("item", $photo2),
+ "entity" => $photo2->as_restful_array(),
+ "relationships" => array(
+ "tags" => array(
+ "url" => rest::url("item_tags", $photo2),
+ "members" => array())))),
+ items_rest::get($request));
+ }
+}

0 comments on commit e9c8a8a

Please sign in to comment.