Apigee-Edge
view release on metacpan or search on metacpan
lib/Apigee/Edge/Helper.pm view on Meta::CPAN
package Apigee::Edge::Helper;
use strict;
use warnings;
our $VERSION = '0.08'; ## VERSION
use Carp;
use base 'Apigee::Edge';
use URI::Split qw(uri_split);
use vars qw/$errstr/;
sub errstr { return $errstr || Apigee::Edge->errstr }
sub get_top_developer_app {
my ($self, $email) = @_;
my $apps = $self->get_developer_apps($email, {expand => 'true'});
return unless ($apps and $apps->{app} and scalar(@{$apps->{app}}));
my $my_app = $apps->{app}->[0];
# flatten attrs into $my_app
my %attrs = map { $_->{name} => $_->{value} } @{$my_app->{attributes}};
$my_app = {%$my_app, %attrs};
$my_app->{display_name} = $attrs{DisplayName} || $my_app->{name}; # shortcut
return $my_app;
}
sub refresh_developer_app { ## no critic (ArgUnpacking)
my $self = shift;
my %params = @_ % 2 ? %{$_[0]} : @_;
my $name = $params{name};
if (!$name) {
$errstr = 'Application Name must be provided.';
return;
} elsif ($name !~ /^[\w\s-]{5,30}$/) { # restrict to only 5-30 alphanumerics or spaces.
$errstr = 'Application Name data is invalid.';
return;
}
my $callback_url = $params{callbackUrl};
if (!$callback_url) {
$errstr = 'Callback URL must be provided.';
return;
} elsif ($callback_url =~ /['"<>]/) { # rule out quotes or anglebrackets.
$errstr = 'Callback URL data is invalid.';
return;
} else {
my ($scheme, $host, $path) = uri_split($callback_url);
# in theory a uri can be almost anything; but for sanity insist on at least this much..
unless ($scheme && $host && $path) {
$errstr = 'Callback URL format is invalid. ';
return;
}
}
my $email = $params{email};
my $my_app = $params{app};
unless (exists $params{app}) {
$my_app = $self->get_top_developer_app($email);
}
if ($my_app) {
# update app
$self->update_developer_app(
$email,
$my_app->{name},
{
attributes => [{
name => 'DisplayName',
value => $name,
}
],
callbackUrl => $callback_url,
});
$my_app->{display_name} = $name;
$my_app->{callbackUrl} = $callback_url;
$errstr = 'Update successful';
} else {
my $developer = $self->get_developer($email);
unless ($developer and $developer->{developerId}) { # create on demand
$developer = $self->create_developer(
"email" => $email,
"firstName" => $params{firstName},
"lastName" => $params{lastName},
"userName" => $params{userName},
);
}
$my_app = $self->create_developer_app(
$email,
{
name => $name,
callbackUrl => $callback_url,
$params{apiProducts} ? (apiProducts => $params{apiProducts}) : (),
});
if ($my_app->{message}) {
$errstr = $my_app->{message};
return;
}
$my_app->{display_name} = $name;
$errstr = "$name has been registered. New OAuth credentials are available";
}
return $my_app;
}
sub get_all_clients {
my ($self) = @_;
my $apps = $self->get_apps(
expand => 'true',
includeCred => 'true'
) or croak "Apigee::Edge failure: " . $self->errstr;
my $CLIENTS = {};
for my $app (@{$apps->{app}}) {
next unless $app->{status} eq 'approved';
my $consumerKey = eval {
my $credentials = $app->{credentials};
$credentials->[0]->{consumerKey};
} || next;
if (my $attrs = $app->{attributes}) {
my %attrs = map { $_->{name} => $_->{value} } @$attrs;
$app->{name} = $attrs{DisplayName} if $attrs{DisplayName};
}
$CLIENTS->{$consumerKey} = $app->{name};
}
return $CLIENTS;
}
1;
__END__
=encoding utf-8
=head1 NAME
Apigee::Edge::Helper - Helpers for Apigee::Edge
=head1 SYNOPSIS
use Apigee::Edge::Helper;
my $apigee = Apigee::Edge::Helper->new(
org => 'apigee_org',
usr => 'your_email',
pwd => 'your_password'
);
=head1 DESCRIPTION
it builts top on L<Apigee::Edge> with same useful helpers.
=head1 METHODS
=head2 get_top_developer_app
my $app = $apigee->get_top_developer_app($email);
get the first app belongs to developer ($email) and flatten attrs into app
=head2 refresh_developer_app
my $app = $apigee->refresh_developer_app(
app => $old_app, # optional, app hashref, can be from get_top_developer_app
email => $client_email,
name => $name,
callbackUrl => $callback_url,
apiProducts => ['ProductName'], # optional
firstName => $first_name,
lastName => $last_name,
userName => $loginid,
( run in 0.608 second using v1.01-cache-2.11-cpan-5623c5533a1 )