Skip to content

Commit

Permalink
Add REST support for comments. You can view, add, edit and delete
Browse files Browse the repository at this point in the history
comments.
  • Loading branch information
bharat committed Jun 17, 2010
1 parent bd496cc commit 1aeaa7d
Show file tree
Hide file tree
Showing 4 changed files with 213 additions and 0 deletions.
85 changes: 85 additions & 0 deletions modules/comment/helpers/comment_rest.php
@@ -0,0 +1,85 @@
<?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 comment_rest_Core {
static function get($request) {
$comment = rest::resolve($request->url);
access::required("view", $comment->item());

return array(
"url" => $request->url,
"entity" => $comment->as_restful_array(),
"relationships" => rest::relationships("comment", $comment));
}

static function put($request) {
// Only admins can edit comments, for now
if (!identity::active_user()->admin) {
access::forbidden();
}

$comment = rest::resolve($request->url);
$comment = ORM::factory("comment");
$comment->text = $request->params->text;
$comment->save();
}

static function post($request) {
$item = rest::resolve($request->url);
access::required("edit", $item);

$entity = $request->params->entity;
$comment->text = $request->params->text;
$comment->save();

return array("url" => rest::url("comment", $comment));
}

static function delete($request) {
if (!identity::active_user()->admin) {
access::forbidden();
}

$comment = rest::resolve($request->url);
access::required("edit", $comment->item());

$comment->delete();
}

static function relationships($resource_type, $resource) {
switch ($resource_type) {
case "item":
return array(
"comments" => array(
"url" => rest::url("item_comments", $resource)));
}
}

static function resolve($id) {
$comment = ORM::factory("comment", $id);
if (!access::can("view", $comment->item())) {
throw new Kohana_404_Exception();
}
return $comment;
}

static function url($comment) {
return url::abs_site("rest/comment/{$comment->id}");
}
}
62 changes: 62 additions & 0 deletions modules/comment/helpers/comments_rest.php
@@ -0,0 +1,62 @@
<?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 comments_rest_Core {
/**
* Possible request parameters:
* start=#
* start at the Nth comment (zero based)
*
* num=#
* return up to N comments (max 100)
*/
static function get($request) {
$comments = array();

$p = $request->params;
$num = isset($p->num) ? min((int)$p->num, 100) : 10;
$start = isset($p->start) ? (int)$p->start : 0;

foreach (ORM::factory("comment")->viewable()->find_all($num, $start) as $comment) {
$comments[] = rest::url("comment", $comment);
}
return array("url" => rest::url("comments"),
"members" => $comments);
}


static function post($request) {
$entity = $request->params->entity;

$item = rest::resolve($entity->item);
access::required("edit", $item);

$comment = ORM::factory("comment");
$comment->author_id = identity::active_user()->id;
$comment->item_id = $item->id;
$comment->text = $entity->text;
$comment->save();

return array("url" => rest::url("comment", $comment));
}

static function url() {
return url::abs_site("rest/comments");
}
}
50 changes: 50 additions & 0 deletions modules/comment/helpers/item_comments_rest.php
@@ -0,0 +1,50 @@
<?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 item_comments_rest_Core {
static function get($request) {
$item = rest::resolve($request->url);
access::required("view", $item);

$comments = array();
foreach (ORM::factory("comment")
->viewable()
->where("item_id", "=", $item->id)
->order_by("created", "DESC")
->find_all() as $comment) {
$comments[] = rest::url("comment", $comment);
}

return array(
"url" => $request->url,
"members" => $comments);
}

static function resolve($id) {
$item = ORM::factory("item", $id);
if (!access::can("view", $item)) {
throw new Kohana_404_Exception();
}
return $item;
}

static function url($item) {
return url::abs_site("rest/item_comments/{$item->id}");
}
}
16 changes: 16 additions & 0 deletions modules/comment/models/comment.php
Expand Up @@ -175,4 +175,20 @@ public function valid_item(Validation $v, $field) {
static function valid_state($value) {
return in_array($value, array("published", "unpublished", "spam", "deleted"));
}

/**
* Same as ORM::as_array() but convert id fields into their RESTful form.
*/
public function as_restful_array() {
$data = array();
foreach ($this->as_array() as $key => $value) {
if (strncmp($key, "server_", 7)) {
$data[$key] = $value;
}
}
$data["item"] = rest::url("item", $this->item());
unset($data["item_id"]);

return $data;
}
}

0 comments on commit 1aeaa7d

Please sign in to comment.