Files
gallery3/modules/gallery/helpers/item_rest.php
Bharat Mediratta bcf1caad14 Reshape the rest code to be more consistent with regards to
relationships.  Now when you view a resource, it has 4 top level
elements:

url: the url of this resource
resource: array of key value pairs describing the resource
members: array of urls to members of this collection
relationships: array of array of members.

Relationships are a special type of collection that links two
different resources together.  To remove a relationship, just
DELETE its url.  To create a relationship, POST to its
collection.

Individual modules can add their own relationships to any
resource via a callback mechanism.

Example:
  Array(
    [url] => http://g3.com/rest/item/1
    [resource] => Array (
      [id] => 1
      [album_cover_item_id] => 4
      [captured] =>
      [created] => 1264056417
      [description] =>
      [height] =>
      ...
    )
    [members] => Array(
      [0] => http://g3.com/rest/item/2
      [1] => http://g3.com/rest/item/3
      [2] => http://g3.com/rest/item/4
      [3] => http://g3.com/rest/item/5
      ...
    )
    [relationships] => Array(
      [tags] => Array (
      [0] => http://g3.com/rest/tag_item/2,1
      [1] => http://g3.com/rest/tag_item/23,1
      )
    )
  )
2010-01-22 00:27:00 -08:00

159 lines
4.9 KiB
PHP

<?php defined("SYSPATH") or die("No direct script access.");
/**
* Gallery - a web based photo album viewer and editor
* Copyright (C) 2000-2009 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 item_rest_Core {
/**
* For items that are collections, you can specify the following additional query parameters to
* query the collection. You can specify them in any combination.
*
* scope=direct
* only return items that are immediately under this one
* scope=all
* return items anywhere under this one
*
* name=<substring>
* only return items where the name contains this substring
*
* random=true
* return a single random item
*
* type=<comma separate list of photo, movie or album>
* limit the type to types in this list. eg, "type=photo,movie"
*/
static function get($request) {
$item = rest::resolve($request->url);
access::required("view", $item);
$p = $request->params;
if (isset($p->random)) {
$orm = item::random_query()->offset(0)->limit(1);
} else {
$orm = ORM::factory("item")->viewable();
}
if (empty($p->scope)) {
$p->scope = "direct";
}
if (!in_array($p->scope, array("direct", "all"))) {
throw new Rest_Exception("Bad Request", 400);
}
if ($p->scope == "direct") {
$orm->where("parent_id", "=", $item->id);
} else {
$orm->where("left_ptr", ">", $item->left_ptr);
$orm->where("right_ptr", "<", $item->right_ptr);
}
if (isset($p->name)) {
$orm->where("name", "LIKE", "%{$p->name}%");
}
if (isset($p->type)) {
$orm->where("type", "IN", explode(",", $p->type));
}
$members = array();
foreach ($orm->find_all() as $child) {
$members[] = rest::url("item", $child);
}
return array(
"url" => $request->url,
"resource" => $item->as_array(),
"members" => $members,
"relationships" => rest::relationships("item", $item));
}
static function put($request) {
$item = rest::resolve($request->url);
access::required("edit", $item);
$params = $request->params;
// Only change fields from a whitelist.
foreach (array("album_cover_item_id", "captured", "description",
"height", "mime_type", "name", "parent_id", "rand_key", "resize_dirty",
"resize_height", "resize_width", "slug", "sort_column", "sort_order",
"thumb_dirty", "thumb_height", "thumb_width", "title", "view_count",
"weight", "width") as $key) {
if (property_exists($request->params, $key)) {
$item->$key = $request->params->$key;
}
}
if ($item->changed) {
$item->save();
}
}
static function post($request) {
$parent = rest::resolve($request->url);
access::required("edit", $parent);
$params = $request->params;
$item = ORM::factory("item");
switch ($params->type) {
case "album":
$item->type = "album";
$item->parent_id = $parent->id;
$item->name = $params->name;
$item->title = isset($params->title) ? $params->title : $name;
$item->description = isset($params->description) ? $params->description : null;
$item->slug = isset($params->slug) ? $params->slug : null;
$item->save();
break;
case "photo":
case "movie":
$item->type = $params->type;
$item->parent_id = $parent->id;
$item->set_data_file($request->file);
$item->name = $params->name;
$item->title = isset($params->title) ? $params->title : $params->name;
$item->description = isset($params->description) ? $params->description : null;
$item->slug = isset($params->slug) ? $params->slug : null;
$item->save();
break;
default:
throw new Rest_Exception("Invalid type: $params->type", 400);
}
}
static function delete($request) {
$item = rest::resolve($request->url);
access::required("edit", $item);
$item->delete();
}
static function resolve($id) {
$item = ORM::factory("item")->where("id", "=", $id)->find();
if (!access::can("view", $item)) {
throw new Kohana_404_Exception();
}
return $item;
}
static function url($item) {
return url::abs_site("rest/item/{$item->id}");
}
}