From: Oleg Kostyuk Date: Mon, 6 Dec 2010 23:28:08 +0000 (+0200) Subject: Added support for tweaking where to store response in stash X-Git-Tag: 2.002004~4 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Controller-DBIC-API.git;a=commitdiff_plain;h=810de6afa72cd92df2a6749ef85af7cce31302e7;hp=a0a4ed30473fe062a3bf77d433f6ff31dab51be7 Added support for tweaking where to store response in stash --- diff --git a/lib/Catalyst/Controller/DBIC/API.pm b/lib/Catalyst/Controller/DBIC/API.pm index 2753a74..2a72e28 100644 --- a/lib/Catalyst/Controller/DBIC/API.pm +++ b/lib/Catalyst/Controller/DBIC/API.pm @@ -332,7 +332,7 @@ sub object_lookup list's steps are broken up into three distinct methods: L, L, and L. -The goal of this method is to call ->search() on the current_result_set, change resultset class of the result (if needed), and return it in $c->stash->{response}->{$self->data_root}. Please see the individual methods for more details on what actual processing takes place. +The goal of this method is to call ->search() on the current_result_set, change resultset class of the result (if needed), and return it in $c->stash->{$self->stash_key}->{$self->data_root}. Please see the individual methods for more details on what actual processing takes place. If the L config param is defined then the hashes will contain only those columns, otherwise all columns in the object will be returned. L of course supports the function/procedure calling semantics that L. In order to have proper column names in the result, provide arguments in L (which also follows L semantics. Similarly L, L, L and L affect the maximum number of rows returned as well as the ordering and grouping. Note that if select, count, ordered_by or grouped_by request parameters are present then these will override the values set on the class with select becoming bound by the select_exposes attribute. @@ -446,7 +446,7 @@ sub list_format_output $output->{$self->total_entries_arg} = $c->req->search_total_entries + 0; } - $c->stash->{response} = $output; + $c->stash->{$self->stash_key} = $output; } catch { @@ -487,7 +487,7 @@ sub item } else { - $c->stash->{response}->{$self->item_root} = $self->each_object_inflate($c, $c->req->get_object(0)->[0]); + $c->stash->{$self->stash_key}->{$self->item_root} = $self->each_object_inflate($c, $c->req->get_object(0)->[0]); } } @@ -858,25 +858,25 @@ sub end :Private # Check for errors caught elsewhere if ( $c->res->status and $c->res->status != 200 ) { $default_status = $c->res->status; - $c->stash->{response}->{success} = $self->use_json_boolean ? JSON::Any::false : 'false'; + $c->stash->{$self->stash_key}->{success} = $self->use_json_boolean ? JSON::Any::false : 'false'; } elsif ($self->get_errors($c)) { - $c->stash->{response}->{messages} = $self->get_errors($c); - $c->stash->{response}->{success} = $self->use_json_boolean ? JSON::Any::false : 'false'; + $c->stash->{$self->stash_key}->{messages} = $self->get_errors($c); + $c->stash->{$self->stash_key}->{success} = $self->use_json_boolean ? JSON::Any::false : 'false'; $default_status = 400; } else { - $c->stash->{response}->{success} = $self->use_json_boolean ? JSON::Any::true : 'true'; + $c->stash->{$self->stash_key}->{success} = $self->use_json_boolean ? JSON::Any::true : 'true'; $default_status = 200; } unless ($default_status == 200) { - delete $c->stash->{response}->{$self->data_root}; + delete $c->stash->{$self->stash_key}->{$self->data_root}; } elsif($self->return_object && $c->req->has_objects) { my $returned_objects = []; push(@$returned_objects, $self->each_object_inflate($c, $_)) for map { $_->[0] } $c->req->all_objects; - $c->stash->{response}->{$self->data_root} = scalar(@$returned_objects) > 1 ? $returned_objects : $returned_objects->[0]; + $c->stash->{$self->stash_key}->{$self->data_root} = scalar(@$returned_objects) > 1 ? $returned_objects : $returned_objects->[0]; } $c->res->status( $default_status || 200 ); @@ -986,9 +986,13 @@ Whatever you would pass to $c->model to get a resultset for this class. MyAppDB: Desired resultset class after accessing your model. MyAppDB::ResultSet::Track for example. By default, it's DBIx::Class::ResultClass::HashRefInflator. Set to empty string to leave resultset class without change. +=head3 stash_key + +Controls where in stash request_data should be stored, and defaults to 'response'. + =head3 data_root -By default, the response data is serialized into $c->stash->{response}->{$self->data_root} and data_root defaults to 'list' to preserve backwards compatibility. This is now configuable to meet the needs of the consuming client. +By default, the response data is serialized into $c->stash->{$self->stash_key}->{$self->data_root} and data_root defaults to 'list' to preserve backwards compatibility. This is now configuable to meet the needs of the consuming client. =head3 use_json_boolean @@ -1101,8 +1105,8 @@ For example if you wanted create to return the JSON for the newly created object $self->next::method($c); if ($c->req->has_objects) { - # $c->stash->{response} will be serialized in the end action - $c->stash->{response}->{$self->data_root} = [ map { { $_->get_inflated_columns } } ($c->req->all_objects) ] ; + # $c->stash->{$self->stash_key} will be serialized in the end action + $c->stash->{$self->stash_key}->{$self->data_root} = [ map { { $_->get_inflated_columns } } ($c->req->all_objects) ] ; } } diff --git a/lib/Catalyst/Controller/DBIC/API/StaticArguments.pm b/lib/Catalyst/Controller/DBIC/API/StaticArguments.pm index 71e8730..280e92a 100644 --- a/lib/Catalyst/Controller/DBIC/API/StaticArguments.pm +++ b/lib/Catalyst/Controller/DBIC/API/StaticArguments.pm @@ -122,6 +122,14 @@ prefetch_arg controls how to reference 'prefetch' in the the request_data has 'prefetch_arg' => ( is => 'ro', isa => Str, default => 'list_prefetch' ); +=attribute_public stash_key is: ro, isa: Str, default: 'response' + +stash_key controls where in stash request_data should be stored + +=cut + +has 'stash_key' => ( is => 'ro', isa => Str, default => 'response'); + =attribute_public data_root is: ro, isa: Str, default: 'list' data_root controls how to reference where the data is in the the request_data