package WWW::Desk;

use 5.006;
use strict;
use warnings FATAL => 'all';

use Moose;
use Carp;
use WWW::Desk::Browser;

=head1 NAME

WWW::Desk - perl API


our $VERSION = '0.10';


WWW::Desk will allow you make all API calls using HTTP or oAuth authentication

    use WWW::Desk;
    use WWW::Desk::Auth::HTTP;

    my $auth = WWW::Desk::Auth::HTTP->new(
        'username' => 'desk username',
        'password' => 'desk password'
    my $desk = WWW::Desk->new(
        'desk_url'       => '',
        'authentication' => $auth,
    my $response = $desk->call('/cases','GET', {'locale' => 'en_US'} );

NOTE: Checkout demo/ for oauth demo application


=head1 METHOD

    sub call {
        my ( $self, $url_fragment, $http_method, $params ) = @_;

    Call method accepts
        $url_fragment - API fragment url
        $http_method  - HTTP method, Only supported GET, POST, PATCH, DELETE
        $params       - Additional Parameters which you want to send as query parameters


=head2 desk_url

REQUIRED - your desk url


has 'desk_url' => (
    is       => 'ro',
    isa      => 'Str',
    required => 1

has 'browser_client' => (
    is         => 'ro',
    isa        => 'WWW::Desk::Browser',
    lazy_build => 1,

sub _build_browser_client {
    my ($self) = @_;
    return WWW::Desk::Browser->new(base_url => $self->desk_url);

=head2 authentication

REQUIRED - WWW::Desk::Auth::HTTP or WWW::Desk::Auth::oAuth object


has 'authentication' => (
    is       => 'ro',
    isa      => 'Object',
    required => 1


=head2 call

call method will allow you to make API calls.
url fragment, http method are required to make call

you can also pass params next to http method to add additional paramerters to the url


sub call {
    my ($self, $url_fragment, $http_method, $params) = @_;

    if (not defined $params) {
        $params = {'t' => time()};

    return $self->_prepare_response("400", "Argument must be supplied as HASH")
        unless ref $params eq 'HASH';

    return $self->_prepare_response("400", "Invalid HTTP method. Only supported GET, POST, PATCH, DELETE")
        unless $http_method =~ /^GET$|^POST$|^PATCH$|^DELETE$/i;

    $http_method = lc $http_method;
    my $browser_client = $self->browser_client;
    my $request_url    = $browser_client->prepare_url($url_fragment);

    my $response;

    my $authentication = $self->authentication;
    if (ref($authentication) eq 'WWW::Desk::Auth::HTTP') {

        my $json_params = $params ? $browser_client->js_encode($params) : $params;
        my $http_headers = $self->authentication->login_headers->to_hash();
        $response = $browser_client->browser->$http_method($request_url => $http_headers => $json_params);
    } elsif (ref($authentication) eq 'WWW::Desk::Auth::oAuth') {
        return $self->_prepare_response("501", "Command line doesn't support oAuth Authentication");
    } else {
        return $self->_prepare_response("501", "Authentication Not Implemented");

    my $error = $response->error;

    return $self->_prepare_response(404, $error)
        if ref $error ne 'HASH';

    return $self->_prepare_response($error->{'code'} || 408, $error->{'message'})
        if $error;

    return $self->_prepare_response(200, 'OK', $response->res->body);

sub _prepare_response {
    my ($self, $code, $msg, $data) = @_;
    $data = $self->browser_client->js_decode($data) if $data;
    return {
        'code'    => $code,
        'message' => $msg,
        'data'    => $data

=head1 AUTHOR, C<< <rakesh at> >>

=head1 BUGS

Please report any bugs or feature requests to C<bug-www-desk at>, or through
the web interface at L<>.  I will be notified, and then you'll
automatically be notified of progress on your bug as I make changes.

=head1 SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc WWW::Desk

You can also look for information at:

=over 4

=item * RT: CPAN's request tracker (report bugs here)


=item * AnnoCPAN: Annotated CPAN documentation


=item * CPAN Ratings


=item * Search CPAN





no Moose;

1;    # End of WWW::Desk