[Rt-commit] [svn] r893 - in RTx-Atom: . html/Atom/0.3 html/Atom/0.3/Add html/Atom/0.3/Describe html/Atom/0.3/Get html/Atom/0.3/Remove lib/RTx

autrijus at pallas.eruditorum.org autrijus at pallas.eruditorum.org
Fri May 14 12:36:01 EDT 2004


Author: autrijus
Date: Fri May 14 12:36:00 2004
New Revision: 893

Modified:
   RTx-Atom/   (props changed)
   RTx-Atom/html/Atom/0.3/Add/index
   RTx-Atom/html/Atom/0.3/Describe/Container
   RTx-Atom/html/Atom/0.3/Get/Object
   RTx-Atom/html/Atom/0.3/Get/Property
   RTx-Atom/html/Atom/0.3/Remove/index
   RTx-Atom/html/Atom/0.3/dhandler
   RTx-Atom/lib/RTx/Atom.pod
Log:
 ----------------------------------------------------------------------
 r4878 at not:  autrijus | 2004-05-14T16:35:59.439667Z
 
 * Add 204 response for Add/Remove.
 * Recognize specialized API, eg. AddCustomField and AddCustomFieldValue.
 * Correctly return 404 for out-of-bound items.
 ----------------------------------------------------------------------


Modified: RTx-Atom/html/Atom/0.3/Add/index
==============================================================================
--- RTx-Atom/html/Atom/0.3/Add/index	(original)
+++ RTx-Atom/html/Atom/0.3/Add/index	Fri May 14 12:36:00 2004
@@ -1,7 +1,8 @@
 %# [POST PostURI] (Container)
 %# Create a new object from the AtomEntry in the request's body.
+%# 204: Created, but the new object has no EditURI.
 %# 303: Created.  The 'Location:' header is set to the new object's EditURI
-%#      (for subsequent Get/Update).  Body is success message in text/plain.
+%#      (for subsequent Get/Update).
 %# 400: Request failed.  Body is error message in text/plain.
 %# 404: There is no container matching the specified URI.
 <%INIT>
@@ -9,18 +10,30 @@
     or return $m->comp($ShowError, Status => 404);
 
 my %args = $m->request_args;
+$args{$1} = $2 while $Path =~ m{\G.*?(\w+)s/(\d+)/(?=\w)}g;
+
 # XXX - factor away the creation defaults
 $args{Requestor} ||= $session{CurrentUser}->Id
     if $CollectionClass->isa('RT::Tickets');
 
-my ($status, $msg) = ($obj->Create( %args ))[0, -1];
+my @rv;
+if ($Path =~ /.*\b(\w+)s/ and $Object and my $code = $Object->can("Add$1")) {
+    @rv = $code->($Object, %args);
+    return $m->comp($ShowError, Status => 204) if $rv[0];
+}
+else {
+    @rv = $obj->Create( %args );
+}
+
 if (my $id = $obj->Id) {
-    $r->header_out(Location => "$FeedURI/$id");
+    $r->header_out(Location => "$BaseURI/$Path/$id");
     return $m->comp($ShowError, Status => 303);
 }
+
 $r->content_type('text/plain');
 $r->status(400);
-print $msg;
+
+print $rv[-1];
 </%INIT>
 <%ARGS>
 $Path
@@ -32,6 +45,7 @@
 $X
 
 $Type
+$Object
 $CollectionClass
 $FeedURI
 </%ARGS>

Modified: RTx-Atom/html/Atom/0.3/Describe/Container
==============================================================================
--- RTx-Atom/html/Atom/0.3/Describe/Container	(original)
+++ RTx-Atom/html/Atom/0.3/Describe/Container	Fri May 14 12:36:00 2004
@@ -3,8 +3,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml-stylesheet type="text/css" href="<% $BaseURI %>/NoAuth/feed.css"?>
 <feed version="0.3" xmlns="http://purl.org/atom/ns#" xmlns:html="http://www.w3.org/1999/xhtml">
-  <& $ShowLink, Relation => "service.post", URI => $FeedURI, Id => '!add', Title => $Type &>
-  <& $ShowLink, Relation => "service.feed", URI => $FeedURI, Id => '!search', Title => $Type &>
+  <& $ShowLink, Relation => "service.post", URI => "$BaseURI/$Path", Id => '!add', Title => $Type &>
+  <& $ShowLink, Relation => "service.feed", URI => "$BaseURI/$Path", Id => '!search', Title => $Type &>
   <entry>
     <content type="text/xml" mode="xml">
 % $Map->{action} = 'add';

Modified: RTx-Atom/html/Atom/0.3/Get/Object
==============================================================================
--- RTx-Atom/html/Atom/0.3/Get/Object	(original)
+++ RTx-Atom/html/Atom/0.3/Get/Object	Fri May 14 12:36:00 2004
@@ -26,7 +26,12 @@
 
 $session{CurrentUser}->LanguageHandle('en-us');
 my $handler = "/REST/1.0/Forms/$type/default";
-my $struct = $m->comp($handler, id => $Object->Id, fields => {})->[2];
+my $struct = eval { $m->comp($handler, id => $Object->Id, fields => {})->[2] };
+$struct ||= {
+    map +($_ => $Object->$_),
+    grep $Object->_ClassAccessible->{$_}{read},
+    keys %{$Object->_ClassAccessible}
+};
 delete $session{CurrentUser}{LangHandle};
 
 my $xml = $X->XMLout($struct);

Modified: RTx-Atom/html/Atom/0.3/Get/Property
==============================================================================
--- RTx-Atom/html/Atom/0.3/Get/Property	(original)
+++ RTx-Atom/html/Atom/0.3/Get/Property	Fri May 14 12:36:00 2004
@@ -21,6 +21,9 @@
     return $m->comp($ShowError, Status => 303);
 }
 
+$m->comp($ShowError, Status => 404)
+    unless $Object and $Object->can($Property);
+
 $r->content_type('text/plain');
 print $Object->$Property;
 </%INIT>

Modified: RTx-Atom/html/Atom/0.3/Remove/index
==============================================================================
--- RTx-Atom/html/Atom/0.3/Remove/index	(original)
+++ RTx-Atom/html/Atom/0.3/Remove/index	Fri May 14 12:36:00 2004
@@ -1,5 +1,6 @@
 %# [DELETE EditURI]
 %# Delete an object.
-%# 200: Successfully deleted.  Body is success message in text/plain.
-%# 400: Request failed.  Body is error message in text/plain.
+%# 204: Successfully deleted.
+%# 400: Request failed.  Body is error message.
 %# 404: There is no object matching the specified URI.
+% return $m->comp($ShowError, Status => 400);

Modified: RTx-Atom/html/Atom/0.3/dhandler
==============================================================================
--- RTx-Atom/html/Atom/0.3/dhandler	(original)
+++ RTx-Atom/html/Atom/0.3/dhandler	Fri May 14 12:36:00 2004
@@ -274,7 +274,7 @@
 my $list = $class->new($session{CurrentUser});
 $list->UnLimit;
 
-my $obj;
+my ($obj, $prev_obj);
 
 foreach my $part (@parts) {
     if ($part =~ /^(\*(-)?)?(\d+)(?:\.(\w+))?$/) {
@@ -289,6 +289,7 @@
 		$list->GotoItem($id);
 		$obj = $list->Next;
 	    }
+	    return $m->comp('Elements/Error', Status => 404) if !$obj;
 	}
 	else {
 	    $obj = $list->NewItem;
@@ -301,6 +302,8 @@
 	$obj->Load($1);
     }
     elsif ($part =~ /^([A-Z]\w*)(?:\.(\w+))?$/) {
+	$obj->can($1) or return $m->comp('Elements/Error', Status => 404);
+
 	$list = $obj->$1;
 
 	if ( ($property = $2) or !$list->can('UnLimit') ) {
@@ -308,6 +311,7 @@
 	    undef $list;
 	}
 	else {
+	    $prev_obj = $obj;
 	    $property = $obj = undef;
 	}
     }
@@ -325,6 +329,7 @@
 
 # Can't allow cache to happen at all
 eval {
+    $prev_obj = $obj if $obj;
     $obj ||= $list->NewItem;
     $obj->_expire( $obj->_gen_primary_cache_key());
     $list->UnLimit unless $list->_isLimited;
@@ -353,7 +358,7 @@
     "$verb/index", %ARGS,
     Type => $type,
     Resource => $resource,
-    Object => $obj,
+    Object => $prev_obj || $obj,
     Collection => $list,
     Property => $property,
     CollectionClass => ref($list),

Modified: RTx-Atom/lib/RTx/Atom.pod
==============================================================================
--- RTx-Atom/lib/RTx/Atom.pod	(original)
+++ RTx-Atom/lib/RTx/Atom.pod	Fri May 14 12:36:00 2004
@@ -315,7 +315,7 @@
 
 Remove the specified object.
 
-    200: Successfully deleted.  Body is success message.
+    204: Successfully deleted.
     400: Request failed.  Body is the error message.
     404: There is no object matching the specified URI.
 
@@ -344,8 +344,9 @@
 
 Create a new object from the AtomEntry in the request's body.
 
+    204: Created, but the new object has no EditURI.
     303: Created.  The 'Location' header is set to the new object's
-         EditURI (for subsequent Get/Update).  Body is success message.
+         EditURI (for subsequent Get/Update).
     400: Request failed.  Body is the error message.
     404: There is no container matching the specified URI.
 


More information about the Rt-commit mailing list