blob: 3768039b55905dfef87609d47fa01c9be165a5cd [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
package Usergrid::Request;
use Moose::Role;
use namespace::autoclean;
use Carp qw(confess);
use Log::Log4perl qw(:easy);
use REST::Client;
use URI::Template;
use JSON;
my $json = JSON->new->allow_nonref;
=head1 NAME
Usergrid::Request - Role that provides HTTP invocation and utility methods
=head1 DESCRIPTION
This is a Role that is applied to L<Usergrid::Client> and L<Usergrid::Collection>
which provides methods that relate to HTTP invocation as well as some utility
functions.
=head1 ATTRIBUTES
=over 4
=item organization (String)
Organization name
=item application (String)
Application name
=item api_url (String)
URL of the Usergrid instance
=item trace (Boolean)
Enable/disable request and response tracing for debugging and troubleshooting
(Optional)
=cut
has 'organization' => ( is => 'rw', isa => 'Str', required => 1);
has 'application' => ( is => 'rw', isa => 'Str', required => 1);
has 'api_url' => ( is => 'rw', isa => 'Str', required => 1);
has 'trace' => ( is => 'rw', isa => 'Bool', trigger => \&_enable_tracing);
has 'user_token' => ( is => 'rw');
# internal method
sub _is_token_required {
my ($self, $resource) = @_;
return 0 if $resource =~ m/\/management\/token/;
1;
}
# internal method
sub _api_request {
my ($self, $method, $resource, $request) = @_;
$self->trace_message("$method $resource");
$self->trace_message("REQUEST: " . $self->prettify($request)) if ($request);
my $client = REST::Client->new();
$client->setHost($self->api_url);
if ($self->_is_token_required($resource) == 1 && defined $self->user_token) {
$client->addHeader('Authorization',
'Bearer ' . $self->user_token->{'access_token'});
}
my $json_req = $self->json_encode($request) if ($request);
$client->DELETE($resource) if ($method eq 'DELETE');
$client->GET($resource) if ($method eq 'GET');
$client->POST($resource, $json_req) if ($method eq 'POST');
$client->PUT($resource, $json_req) if ($method eq 'PUT');
my $response = $client->responseContent();
$self->trace_message("RESPONSE: " . $self->prettify($response)) if ($response);
return undef if ($client->responseCode() eq "404");
confess "Bad request" if ($client->responseCode() eq "400");
confess "Unauthorized" if ($client->responseCode() eq "401");
confess "Forbidden" if ($client->responseCode() eq "403");
confess "Server error" if ($client->responseCode() eq "500");
return $self->json_decode($response);
}
# internal method
sub _enable_tracing {
my ($self, $state, $old_state) = @_;
if ($state) {
Log::Log4perl::easy_init($DEBUG);
our $logger = Log::Log4perl->get_logger();
}
}
# internal method
sub _collection {
my ($self, $object, $uri) = @_;
return Usergrid::Collection->new (
object => $object,
uri => $uri,
organization => $self->organization,
application => $self->application,
api_url => $self->api_url,
trace => $self->trace,
user_token => $self->user_token
);
}
=back
=head1 METHODS
=head2 HTTP Invocation Methods
=over 4
=item DELETE ( $resource )
Invokes HTTP DELETE on the specified resource.
=cut
sub DELETE {
my ($self, $resource) = @_;
$self->_api_request('DELETE', $resource);
}
=item GET ( $resource )
Invokes HTTP GET on the specified resource.
=cut
sub GET {
my ($self, $resource) = @_;
$self->_api_request('GET', $resource);
}
=item POST ( $resource, \%request )
Invokes HTTP POST on the specified resource and passes in the payload
for the request.
=cut
sub POST {
my ($self, $resource, $request) = @_;
$self->_api_request('POST', $resource, $request);
}
=item PUT ( $resource, \%request )
Invokes HTTP PUT on the specified resource and passes in the payload
for the request.
=cut
sub PUT {
my ($self, $resource, $request) = @_;
$self->_api_request('PUT', $resource, $request);
}
=back
=head2 Utility Methods
=over 4
=item trace_message ( $message )
Utility method to log a message to console if tracing is enabled.
=cut
sub trace_message {
my ($self, $message) = @_;
$Usergrid::Request::logger->debug($message) if (defined $Usergrid::Request::logger);
}
=item prettify ( $message, \%object )
Returns a prettified string representation hash reference.
=cut
sub prettify {
my ($self, $json_obj) = @_;
return $json->pretty->encode($json_obj);
}
=item json_encode ( \%hashref )
Returns a JSON object from a hash reference.
=cut
sub json_encode {
my ($self, $json_obj) = @_;
$json->encode($json_obj);
}
=item json_decode ( $json_object )
Returns a hash reference from a JSON object.
=cut
sub json_decode {
my ($self, $json_obj) = @_;
$json->decode($json_obj);
}
1;
__END__
=back
=head1 SEE ALSO
L<Usergrid::Client>, L<Usergrid::Collection>, L<Usergrid::Entity>
=head1 LICENSE
This software is distributed under the Apache 2 license.
=head1 AUTHOR
Anuradha Weeraman <anuradha@cpan.org>
=cut