1 package Arvados::ResourceMethod;
10 return $self->_init(@_);
16 $self->{'resourceAccessor'} = shift;
17 $self->{'method'} = shift;
24 my $method = $self->{'method'};
26 my $path = $method->{'path'};
29 my %given_params = @_;
30 my %extra_params = %given_params;
31 while (my ($param_name, $param) = each %{$method->{'parameters'}}) {
32 delete $extra_params{$param_name};
33 if ($param->{'required'} && !exists $given_params{$param_name}) {
34 croak("Required parameter not supplied: $param_name");
36 elsif ($param->{'location'} eq 'path') {
37 $path =~ s/{\Q$param_name\E}/$given_params{$param_name}/eg;
39 elsif (!exists $given_params{$param_name}) {
42 elsif ($param->{'type'} eq 'object') {
45 if (exists $param->{'properties'}) {
46 while (my ($property_name, $property) =
47 each %{$param->{'properties'}}) {
48 # if the discovery doc specifies object structure,
49 # convert to true/false depending on supplied type
50 if (!exists $given_params{$param_name}->{$property_name}) {
53 elsif (!defined $given_params{$param_name}->{$property_name}) {
54 $param_value{$property_name} = JSON::null;
56 elsif ($property->{'type'} eq 'boolean') {
57 $param_value{$property_name} = $given_params{$param_name}->{$property_name} ? JSON::true : JSON::false;
60 $param_value{$property_name} = $given_params{$param_name}->{$property_name};
65 while (my ($property_name, $property) =
66 each %{$given_params{$param_name}}) {
67 if (ref $property eq '' || $property eq undef) {
68 $param_value{$property_name} = $property;
72 $body_params{$param_name} = \%param_value;
73 } elsif ($param->{'type'} eq 'boolean') {
74 $body_params{$param_name} = $given_params{$param_name} ? JSON::true : JSON::false;
76 $body_params{$param_name} = $given_params{$param_name};
80 croak("Unsupported parameter(s) passed to API call /$path: \"" . join('", "', keys %extra_params) . '"');
82 my $r = $self->{'resourceAccessor'}->{'api'}->new_request;
83 my $base_uri = $self->{'resourceAccessor'}->{'api'}->{'discoveryDocument'}->{'baseUrl'};
85 $r->set_uri($base_uri . "/" . $path);
86 $r->set_method($method->{'httpMethod'});
87 $r->set_auth_token($self->{'resourceAccessor'}->{'api'}->{'authToken'});
88 $r->set_query_params(\%body_params) if %body_params;
89 $r->process_request();
91 my ($status_number, $status_phrase) = $r->get_status();
92 if ($status_number != 200) {
93 croak("API call /$path failed: $status_number $status_phrase\n". $r->get_body());
95 $data = $r->get_body();
96 $headers = $r->get_headers();
97 my $result = JSON::decode_json($data);
98 if ($method->{'response'}->{'$ref'} =~ /List$/) {
99 Arvados::ResourceProxyList->new($result, $self->{'resourceAccessor'});
101 Arvados::ResourceProxy->new($result, $self->{'resourceAccessor'});