NAME

CPAN::Testers::API - REST API for CPAN Testers data

VERSION

version 0.025

SYNOPSIS

$ cpantesters-api daemon
Listening on http://*:5000

DESCRIPTION

This is a REST API on to the data contained in the CPAN Testers database. This data includes test reports, CPAN distributions, and various aggregate test reporting.

METHODS

schema

my $schema = $c->schema;

Get the schema, a CPAN::Testers::Schema object. By default, the schema is connected from the local user's config. See "connect_from_config" in CPAN::Testers::Schema for details.

startup

# Called automatically by Mojolicious

This method starts up the application, loads any plugins, sets up routes, and registers helpers.

render_error

return $c->render_error( 400 => 'Bad Request' );
return $c->render_error( 400, {
    path => '/since',
    message => 'Invalid date/time',
} );

Render an error in JSON like other OpenAPI errors. The first argument is the HTTP status code. The remaining arguments are a list of errors to report. Plain strings are turned into one-element hashrefs with a message key. Hashrefs are used as-is.

The resulting JSON looks like so:

{
    "errors":  [
        {
            "path": "/",
            "message": "Bad Request"
        }
    ]
}

{
    "errors":  [
        {
            "path": "/since",
            "message": "Invalid date/time"
        }
    ]
}

stream_rs

$c->stream_rs( $rs, $processor );

Stream a DBIx::Class::ResultSet object to the browser. This prevents problems with proxy servers and CDNs timing out waiting for data. This uses "write_chunk" in Mojolicious::Controller to transfer a chunked response. If there are no results in the ResultSet object, this method returns a 404 error.

$processor is an optional subref that allows for processing each row before it is written. Use this to translate column names or values into the format the API expects.

For this to work usefully behind Fastly, we also need to enable streaming miss so that Fastly streams the data to the end-user as it gets it: https://docs.fastly.com/guides/performance-tuning/improving-caching-performance-with-large-files#streaming-miss.

CONFIG

This application can be configured by setting the MOJO_CONFIG environment variable to the path to a configuration file. The configuration file is a Perl script containing a single hash reference, like:

# api.conf
{
    broker => 'ws://127.0.0.1:5000',
    schema => 'dbi:SQLite:api.db',
}

The possible configuration keys are below:

broker

The URL to a Mercury message broker, starting with ws://. This broker is used to forward messages to every connected user.

schema

The DBI connect string to give to CPAN::Testers::Schema. If not specified, will use "connect_from_config" in CPAN::Testers::Schema.

LOCAL TESTING

To run an instance of this for local testing, create an api.conf file to configure a SQLite schema:

# api.conf
{
    schema => 'dbi:SQLite:api.sqlite3'
}

For the CPAN::Testers::Schema to work with SQLite, you will need to install an additional CPAN module, DateTime::Format::SQLite.

Once this is configured, you can deploy a new, blank database using cpantesters-api eval 'app->schema->deploy'.

Now you can run the API using cpantesters-api daemon.

SEE ALSO

Mojolicious, Mojolicious::Plugin::OpenAPI, CPAN::Testers::Schema, http://github.com/cpan-testers/cpantesters-project, http://www.cpantesters.org

AUTHOR

Doug Bell <preaction@cpan.org>

CONTRIBUTORS

  • Breno G. de Oliveira <garu@cpan.org>

  • mohawk2 <mohawk2@users.noreply.github.com>

  • Nick Tonkin <1nickt@users.noreply.github.com>

COPYRIGHT AND LICENSE

This software is copyright (c) 2018 by Doug Bell.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.