project_conquer/app/Packages/Oauth2.pm

223 lines
4.7 KiB
Perl

package Oauth2;
use strict;
use warnings;
use v5.22;
use feature qw(signatures);
no warnings qw(experimental::signatures);
use Moo;
use utf8;
use LWP::Authen::OAuth2;
use DDP;
use Mojo::JSON qw(decode_json);
use Mojo::Pg;
use SQL::Abstract;
use POSIX qw(strftime);
use HTML::Strip;
use Encoding::FixLatin qw(fix_latin);
has 'db' => (
is => 'rw',
lazy => 1,
builder => '_build_db',
);
has 'db_user' => (
is => 'rw',
default => 'db_master',
);
has 'db_pass' => (
is => 'rw',
default => 'LTL%9O9^Wj&jmX4lEg',
);
has 'db_uri' => (
is => 'rw',
default => 'nehantic-dev.cnxhiwukntah.us-east-1.rds.amazonaws.com',
);
has 'db_name' => (
is => 'rw',
default => 'nehantic_data',
);
has 'authorization_endpoint' => (
is => 'rw',
required => 1,
);
has 'token_endpoint' => (
is => 'rw',
required => 1,
);
#has 'api_endpoint' => (
# is => 'rw',
# required => 1,
#);
has 'grant_type' => (
is => 'rw',
required => 1,
);
has 'client_id' => (
is => 'rw',
required => 1,
);
has 'client_secret' => (
is => 'rw',
required => 1,
);
has 'redirect_uri' => (
is => 'rw',
required => 1,
);
has 'scope' => (
is => 'rw',
required => 0,
);
has 'user' => (
is => 'rw',
required => 1,
);
has 'token' => (
is => 'rw',
lazy => 1,
builder => '_build_token',
);
has 'code' => (
is => 'ro'
);
has 'refresh_token' => (
is => 'rw',
lazy => 1,
builder => '_build_refresh_token',
);
has 'OAuth2' => (
is => 'rw',
required => 1,
lazy => 1,
builder => '_build_OAuth2',
);
has 'content_url' => (
is => 'rw',
required => 0,
);
has 'results' => (
is => 'rw',
lazy => 1,
builder => '_build_results',
);
has 'save_token' => (
is => 'rw',
lazy => 1,
builder => '_save_token',
);
sub _build_db ($self) {
my $user = $self->db_user;
my $pass = $self->db_pass;
my $db_uri = $self->db_uri;
my $db_name = $self->db_name;
my $pg = Mojo::Pg->new("postgresql://$user:$pass\@$db_uri/$db_name");
my $db = $pg->db;
return $db;
}
sub _build_token ($self) {
my $user = $self->user;
my $db = $self->db;
my $token = $db->select('oauth2_tokens', ['token_string'], {username=>$user})->array;
return $token->[0];
}
sub _save_token ($self, $user, $token) {
my $db = $self->db;
#my $user = $self->user;
#my $token = $self->token;
if (! $db->select('oauth2_tokens', ['username'], {username=>$user} )->array) {
$db->insert('oauth2_tokens', {token_string=>$token, username=>$user,});
return;
}
else {
my $ts = strftime("%m/%d/%Y %H:%M:%S\n", localtime);
$db->update('oauth2_tokens', {token_string=>$token, modify_timestamp=>$ts}, {username=>$user});
return;
}
}
sub get_initial_access_token ($self) {
my $oauth2 = $self->Oauth2;
}
sub _build_refresh_token ($self) {
my $oauth2 = $self->OAuth2;
my $refresh_token = decode_json($self->token)->{'refresh_token'};
my $res = $oauth2->request_tokens(
grant_type => 'refresh_token',
refresh_token => $refresh_token,
client_id => $self->client_id,
client_secret => $self->client_secret,
);
p $res
}
sub _build_OAuth2 ($self) {
my $oauth2 = LWP::Authen::OAuth2->new(
client_id => $self->client_id,
client_secret => $self->client_secret,
redirect_uri => $self->redirect_uri,
authorization_endpoint => $self->authorization_endpoint,
token_endpoint => $self->token_endpoint,
#request_required_params => [ 'grant_type', 'client_id', 'client_secret'],
#request_optional_params => [ 'scope', 'code', 'refresh_token', 'authorization_token', 'redirect_uri'],
#refresh_required_params => ['client_id', 'client_secret', 'refresh_token'],
#refresh_optional_params
# Optional hook, but recommended.
save_tokens => sub{$self->_save_token(@_)},
save_tokens_args => [ $self->db, $self->user ],
# This is for when you have tokens from last time.
token_string => $self->token,
);
return $oauth2;
}
sub _build_results ($self) {
my $content_url = $self->content_url;
my $access_token = decode_json($self->token)->{'access_token'};
my $companyid = '193514809224424';
my $endpoint = "https://sandbox-quickbooks.api.intuit.com/v3/company/$companyid";
my $oauth2 = $self->OAuth2;
my $url = "$endpoint.$content_url";
my %headers = (Authorization => "Bearer $access_token",
Accept => 'application/json');
my $res = $oauth2->get($url, %headers);
my $json = $res->decoded_content;
return $json;
}
__PACKAGE__->meta->make_immutable;