Device-WallyHome

 view release on metacpan or  search on metacpan

lib/Device/WallyHome/Role/REST.pm  view on Meta::CPAN


    return LWP::UserAgent->new(
        agent   => $self->userAgentName(),
        timeout => $self->timeout(),
    );
}

sub _build_userAgentName {
    my $VERSION = Device::WallyHome->VERSION;

    return "Device::WallyHome v$VERSION";
}


#== PUBLIC METHODS =============================================================

sub baseUrl {
    my ($self) = @_;

    my $s = $self->apiUseHttps() ? 's' : '';

    return "http$s://" . $self->apiHostname() . '/' . $self->apiVersion() . '/';
}

sub headers {
    my ($self) = @_;

    my $headers = HTTP::Headers->new();

    $headers->header('Authorization' => 'Bearer ' . $self->token());

    return $headers;
}

sub request {
    my ($self, $params) = @_;

    $params //= {};

    die 'invalid params: ' . Dumper($params) unless ref($params) && ref($params) eq 'HASH';

    my $uri = $params->{uri} // die 'uri required';

    my $content = $params->{content} // undef;
    my $headers = $params->{headers} // $self->headers();
    my $method  = $params->{method}  // 'GET';

    my $request = HTTP::Request->new($method, $self->wallyUrl($uri), $headers, $content);

    my $responseContent = undef;

    if (defined $self->_testModeIdentifier()) {
        # Avoid actual API calls for automated testing
        $responseContent = $self->_simulateTestResponse($uri);
    } else {
        my $response = $self->_userAgent()->request($request);

        $responseContent = $response->content();
    }

    my $decodedResponse = {};

    eval {
        $decodedResponse = decode_json($responseContent);
    };

    if ($@) {
        $self->_lastApiError($@);

        return undef;
    }

    return $decodedResponse;
}

sub _simulateTestResponse {
    my ($self, $uri) = @_;

    die 'testModeIdentifier required' unless defined $self->_testModeIdentifier();

    my $testUtil = Device::WallyHome::Test::Data->new();

    my $testResponseFunc = 'sampleResponse_';

    if ($uri =~ /^places$/) {
        $testResponseFunc .= 'places';
    } elsif ($uri =~ /^places\/[^\/]+\/sensors/) {
        $testResponseFunc .= 'sensors';
    } else {
        die "invalid/unexpected uri for testing: $uri";
    }

    $testResponseFunc .= '_' . $self->_testModeIdentifier();

    die "invalid testResponseFunc: $testResponseFunc" unless $testUtil->can($testResponseFunc);

    return $testUtil->$testResponseFunc();
}

sub wallyUrl {
    my ($self, $path) = @_;

    return $self->baseUrl() . $path;
}

1;



( run in 1.258 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )