Apple-AppStoreConnect

 view release on metacpan or  search on metacpan

lib/Apple/AppStoreConnect.pm  view on Meta::CPAN

=over 4

=item * C<id> : The app ID.

=item * C<platform> : Optional shortcut for C<filter[appPlatform]>, for example
C<IOS>, C<MAC_OS>, C<TV_OS>, or C<VISION_OS>.

=item * C<limit> : Optional maximum number of results to return. Default C<50>.

=item * C<sort> : Optional sort order. Default C<-createdDate>.

=item * C<crash_log> : If true, fetch C<betaFeedbackCrashSubmissions/$id/crashLog>
for each crash submission and attach it as C<crashLog>.

=item * C<crash_log_fields> : Optional fields to return for each C<betaCrashLogs>
resource, for example C<logText>.

=item * C<params> : Any other query params to pass to the
C<apps/$app_id/betaFeedbackCrashSubmissions> request, for example
C<fields[betaFeedbackCrashSubmissions]> or C<include>. Passing
C<fields[betaCrashLogs]> here is also supported; it is applied to the crash log
request.

=back

=cut

sub new {
    my $class = shift;

    my $self = {};
    bless($self, $class);

    my %args = @_;

    ($self->{$_} = $args{$_} || croak("$_ (string) required."))
        foreach qw/issuer key_id/;

    unless ($args{key}) {
        croak("key or key_file required.") unless $args{key_file};
        open my $fh, '<', $args{key_file} or die "Can't open file $!";
        $args{key} = do { local $/; <$fh> };
    }
    $self->{key}        = \$args{key};
    $self->{timeout}    = $args{timeout} || 30;
    $self->{expiration} = $args{expiration} || 900;
    $self->{$_}         = $args{$_} for qw/ua curl scope jwt_payload/;
    $self->{base_url}   = "https://api.appstoreconnect.apple.com/v1/";

    return $self;
}

sub get {
    my $self = shift;
    my %args = @_;

    my $resp = $self->get_response(%args);

    unless ($self->{curl}) {
        die $resp->status_line unless $resp->is_success;
        $resp = $resp->decoded_content;
    }

    return $args{raw} ? $resp : JSON::decode_json($resp);
}

sub get_response {
    my $self = shift;
    my %args = @_;

    croak("url required") unless $args{url};
    $args{url} = $self->{base_url}.$args{url} unless $args{url} =~ /^http/;

    my $jwt = $self->jwt;
    my $url = _build_url(%args);

    unless ($self->{curl} || $self->{ua}) {
        require LWP::UserAgent;
        $self->{ua} = LWP::UserAgent->new(
            agent   => "libwww-perl Apple::AppStoreConnect/$VERSION",
            timeout => $self->{timeout}
        );
    }

    return _fetch($self->{ua}, $url, $jwt);
}

sub get_apps {
    my $self = shift;
    my %args = @_;
    my %params = $args{params} ? %{$args{params}} : ();
    $params{'filter[platform]'} = $args{platform} if $args{platform};
    $args{params} = \%params if %params;

    $args{url} = $self->{base_url} . 'apps';
    $args{url} .= "/$args{id}" if $args{id};
    $args{url} .= "/$args{path}" if $args{path};
    my $res = $self->get(%args);

    return _process_data($res);
}

sub get_app_store_versions {
    my $self = shift;
    my %args = @_;

    croak("id required") unless $args{id};

    my %params = $args{params} ? %{$args{params}} : ();
    $params{'filter[platform]'} = $args{platform} if $args{platform};
    $params{limit} ||= 200;
    my $localizations = $args{localizations};
    $localizations ||= 1 if $args{localization_fields};

    my $versions = _flatten_resources($self->_get_all_pages(
        url    => "apps/$args{id}/appStoreVersions",
        params => \%params,
    ));

    if ($localizations) {
        foreach my $version (@$versions) {



( run in 1.352 second using v1.01-cache-2.11-cpan-600a1bdf6e4 )