Group
Extension

EveOnline-SSO/lib/EveOnline/SSO/Client.pm

=encoding utf-8

=head1 NAME

EveOnline::SSO::Client - base class for any Eve Online ESI API calls

=head1 SYNOPSIS

    use EveOnline::SSO::Client;

    my $client = EveOnline::SSO::Client->new(token => '************', x_user_agent => 'Pilot Name <email@gmail.com>');

    $api->get(['characters', 90922771, 'location'] );
    # url converting to https://esi.tech.ccp.is/latest/characters/90922771/location/?datasource=tranquility

=head1 DESCRIPTION

EveOnline::SSO::Client is base class for any EveOnline ESI API
Contains get, post, put, delete methods for calls to any APIs.

=cut

package EveOnline::SSO::Client;
use 5.008001;
use utf8;
use Modern::Perl;

use LWP::UserAgent;
use Storable qw/ dclone /;
use JSON::XS;
use Moo;

has 'ua' => (
    is => 'ro',
    default => sub {
        my $ua = LWP::UserAgent->new();
        $ua->agent( 'EveOnline::SSO::Client Perl API Client' );
        $ua->timeout( 120 );
        return $ua;
    }
);

has 'token' => (
    is => 'rw',
    required => 1,
);

has 'endpoint' => (
    is => 'rw',
    required => 1,
    default  => 'https://esi.tech.ccp.is/latest/',
);

has 'datasource' => (
    is => 'rw',
    required => 1,
    default => 'tranquility',
);

has 'x_user_agent' => (
    is => 'rw',
    required => 1,
);

has 'demo' => (
    is => 'rw'
);

=head1 CONSTRUCTOR

=over

=item B<new()>

Require arguments: token, x_user_agent

    my $client = EveOnline::SSO::Client->new(
                    token        => 'lPhJ_DLk345334532yfssfdJgFsnKI9rR4EZpcQnJ2',
                    x_user_agent => 'Pilot Name <email@gmail.com>',
                    endpoint     => 'https://esi.tech.ccp.is/latest/', # optional
                    datasource   => 'tranquility',                     # optional 
                );

For module based on EveOnline::SSO::Client
you can override atributes:
    
    extends 'EveOnline::SSO::Client';
    has '+endpoint' => (
        is      => 'rw',
        default => 'https://esi.tech.ccp.is/dev/',
    ); 
    has '+datasource' => (
        is => 'rw',
        default => 'singularity',
    );

=back

=head1 METHODS

=over

=item B<get()>

Send GET request.

    $client->get(['array', 'of', 'path', 'blocks'], 
        {
            # query string hash ref. Optional
        });

    $client->get(['characters', $character_id, 'location']);
    
    # or 
    
    $api->get(['characters', 90922771, 'contacts'], { page => 1 } );

    # or full link

    $client->get('https://esi.tech.ccp.is/latest/incursions/');

You can add any params for query hashref, it should be added to query_string

=cut

sub get {
    my ($self, $url, $query) = @_;

    return $self->request( 'get', $url, $query );
}

=item B<post()>

Send POST request.
    
    $client->post(['array', 'of', 'path', 'blocks'], 
        {
            # query string hash ref. Can be empty
        },
        [ {}, [] ]  # Body structure. Converting to json. Optional
        );

    $client->post(['universe', 'names'], {}, [90922771,188956223]);

=cut

sub post {
    my ($self, $url, $query, $body) = @_;

    return $self->request( 'post', $url, $query, $body );
}

=item B<put()>

Send PUT request.

    $client->put(['characters', 90922771, 'contacts'], { standing => 5, watched => 'false' }, [188956223] );

=cut

sub put {
    my ($self, $url, $query, $body) = @_;

    return $self->request( 'put', $url, $query, $body );
}

=item B<delete()>

Send DELETE request.

    $client->delete(['characters', 90922771, 'contacts'], {}, [188956223] );

=cut

sub delete {
    my ($self, $url, $query, $body) = @_;

    return $self->request( 'delete', $url, $query, $body );
}

sub request {
    my ( $self, $method, $url, $query, $body ) = @_;

    my $req = HTTP::Request->new( uc $method => $self->make_url( $url, $query ) );

    $self->prepare_request( $req, $body );

    my $answer = $self->ua->request( $req );

    return $answer->code unless $answer->content;

    return $self->parse_response( $answer->content );   
}

sub make_url {
    my ( $self, $resource, $params ) = @_;

    return $resource if $resource =~ /^http/i;

    my $url = '';

    $url = $self->endpoint;
    $url .= join '/', @$resource;
    $url .= '/';

    my $uri = URI->new( $url );
    $uri->query_form( %{$params || {}}, datasource => $self->datasource );
    $url = $uri->as_string;

    return $url;
}

sub prepare_request {
    my ( $self, $request, $body_param ) = @_;

    my $body = '';
    if ( $body_param ) {
        my $params = dclone( $body_param );

        state $json = JSON::XS->new->utf8;

        $body = $json->encode( $params );

        $request->content( $body );
    }
    $request->header( 'content-type'   => 'application/json; charset=UTF-8' );
    $request->header( 'content-length' => length( $body ) );
    $request->header( 'X-User-Agent'   => $self->x_user_agent );
    $request->header( 'Authorization'  => 'Bearer ' . $self->token );

    return 1;
}

sub parse_response {
    my ( $self, $response ) = @_;

    my $json = JSON::XS::decode_json( $response );

    return $json;
}


1;
__END__

=back

=head1 LICENSE

Copyright (C) Andrey Kuzmin.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=head1 AUTHOR

Andrey Kuzmin E<lt>chipsoid@cpan.orgE<gt>

=cut



Powered by Groonga
Maintained by Kenichi Ishigaki <ishigaki@cpan.org>. If you find anything, submit it on GitHub.