Circle-Common

 view release on metacpan or  search on metacpan

lib/Circle/Common.pm  view on Meta::CPAN

package Circle::Common;

use 5.006;
use strict;
use warnings;
use Exporter 'import';
use URL::Encode qw(url_encode_utf8);
use LWP::UserAgent;
use HTTP::Request;
use Slurp;
use Try::Tiny;
use YAML;
use JSON;
use Carp;
use File::Share ':all';

our @EXPORT_OK = qw(
  load_config
  build_url_template
  http_json_post
  http_json_get
);

our $VERSION = '0.06';

my $config = undef;

sub load_config {
    if ($config) {
        return $config;
    }

    my $config_path;
    if (-e "./config.yml") {
        $config_path = "./config.yml";
    } else {
        $config_path = dist_file('Circle-Common', 'config.yml');
    }

    try {
        my $content = slurp($config_path);
        $config = Load($content);
    }
    catch {
        carp "cannot load config, error: $_";
    };
    return $config;
}

sub get_session_key {
    my $config       = load_config();
    my $user         = $config->{user};
    my $home         = $ENV{HOME};
    my $session_path = $user->{sessionPath};
    my $file_path    = "${home}/${session_path}";
    my $session_key  = '';
    # print "file_path: $file_path\n";
    try {
        my @lines        = slurp($file_path);
        my @session_keys = grep { chomp($_); $_ =~ /^sessionKey/; } @lines;
        if ( @session_keys > 0 ) {
            $session_key = $session_keys[0];
            $session_key =~ s/sessionKey=//;
        }
    }
    catch {
        carp "cannot read $session_path, error: $_";
    };

    return $session_key;
}

sub http_json_post {
    my ( $url, $data, $need_session_key ) = @_;
    $need_session_key //= 1;
    my $config      = load_config();
    my $http        = $config->{http};
    my $session_key = get_session_key();
    my $ua          = LWP::UserAgent->new();
    $ua->timeout( $http->{timeoutWrite} );
    my $header;
    if ($need_session_key && $session_key) {
        $header = [
            'AuthorizationV2' => $session_key,
            'Content-Type'    => 'application/json; charset=UTF-8'
        ];
    }
    else {
        $header = [ 'Content-Type' => 'application/json; charset=UTF-8' ];
    }
    my $request  = HTTP::Request->new( 'POST', $url, $header, encode_json($data) );
    my $response = $ua->request($request);
    if ( $response->is_success ) {
        return decode_json( $response->decoded_content );
    }
    else {
        carp 'http_json_post' . $response->status_line ? $response->status_line : 'unknown';
        return {
            status  => $response->status_line,
            message => $response->decoded_content,
        };
    }
}

sub http_json_get {
    my ($url, $need_session_key)       = @_;
    $need_session_key //= 1;
    my $config      = load_config();
    my $http        = $config->{http};
    my $session_key = get_session_key();
    my $ua          = LWP::UserAgent->new();
    $ua->timeout( $http->{timeoutRead} );
    my $header;
    # print "need_session_key: $need_session_key, session_key: $session_key";
    if ($need_session_key && $session_key) {
        $header = [
            'AuthorizationV2' => $session_key,
            'Content-Type'    => 'application/json; charset=UTF-8'
        ];
    }
    else {
        $header = [ 'Content-Type' => 'application/json; charset=UTF-8' ];
    }
    my $request  = HTTP::Request->new( 'GET', $url, $header );
    my $response = $ua->request($request);
    if ( $response->is_success ) {
        return decode_json( $response->decoded_content );
    }
    else {
        carp 'http_json_get' . $response->status_line ? $response->status_line : 'unknown';
        return {
            status  => $response->status_line,
            message => $response->decoded_content,
        };
    }
}

sub get_host {
    my $config   = load_config();
    my $http     = $config->{http};
    my $protocol = $http->{protocol};
    my $host     = $http->{host};
    return "$protocol://$host";
}

sub build_url_template {
    my ( $buz, $path, $params_for ) = @_;
    my $config     = load_config();
    my $block_path = $config->{$buz}->{path};
    my $base_uri   = $block_path->{$path};
    my $host       = get_host();
    my $url        = "${host}${base_uri}";

    # print "base url: $url, params:\n" . Dump($params_for) . "\n";
    my @params;
    if ($params_for) {
        @params = map {
            my $value = $params_for->{$_};
            $value = url_encode_utf8($value);
            "$_=$value";
        } ( keys %{$params_for} );

        # print "params:\n" . Dump( \@params ) . "\n";
    }
    if ( @params > 0 ) {
        $url = $url . '?' . join( '&', @params );
    }

    # print "final url: $url\n";
    return $url;
}

1;

__END__

=head1 NAME

Circle::Common - the common module for Circle::Chain SDK

=head1 VERSION

Version 0.06



( run in 1.512 second using v1.01-cache-2.11-cpan-5837b0d9d2c )