rapidapi-ollie

(Temporary forker from rapidapi by Adriaan Pelzer <adriaan.pelzer@gmail.com>) A docroot-like API, which lets storing & retrieving your stuff get out of your way

Usage no npm install needed!

<script type="module">
  import rapidapiOllie from 'https://cdn.skypack.dev/rapidapi-ollie';
</script>

README

rapidapi

Store your stuff, rapidly ... rapidapidly.

A docroot-like API, which lets storing & retrieving your stuff get out of your way.

Version 1.0 of rapidapi supported schema-less object storage with dehydrated lists - this functionality has been removed, but can still be found in branch 1.0.12

INSTALL

  • Install node.js. Head to the node.js download page, and download and install the latest stable version.

  • In your code: (remember to replace REDIS_HOST, REDIS_PORT, and SERVER_PORT with your own config)

    var rapidapi = require ( 'rapidapi' );
    var config = {
        routeRoot: './routes'
    };

    rapidapi ( config, function ( error, server ) {
        if ( error ) {
            return console.error ( error );
        }

        console.log ( 'ready' );
    } );

Just like that, you're ready to store your stuff!

DOCROOT model

If the docRoot attribute is provided in the configuration parameter, its value is taken to be a folder relative to rapidapi's module parent. This folder is then parsed recursively, and its contents is exposed as API endpoints, like a directory tree would be exposed on a web server.

If it is not provided, it defaults to routes.

If a file in this structure is called index.js, its associated endpoint will be the path it is in. Otherwise, the filename will act as a resource parameter, and exposed as such in the request attribute

    req.params

If more than one request parameter is needed, the filename becomes the request parameters, in order, separated by dashes.

For example:

*docRoot*/index.js -> /
*docRoot*/param1.js -> /:param1
*docRoot*/param1-param2.js -> /:param1/:param2
*docRoot*/resource/index.js -> /resource/
*docRoot*/resource/param1.js -> /resource/
*docRoot*/resource/param1-param2.js -> /resource/:param1/:param2

Files in this directory are node modules, and should export a function for each method it wants to support on the endpoint. This function (called the request handler), accepts two parameters, the request object, and a callBack function.

The callBack function accepts an error parameter as its first argument. If this error is a string, it is returned with HTTP status 500.

If any other HTTP code is to be returned, error has to be structured as follows:

    {
        type: ERRORTYPE,
        message: ERRORMESSAGE
    }

Viable error messages are:

{
    400: 'BadRequestErrorError',
    401: 'UnauthorizedError',
    402: 'PaymentRequiredError',
    403: 'ForbiddenError',
    404: 'NotFoundError',
    405: 'MethodNotAllowedError',
    406: 'NotAcceptableError',
    407: 'ProxyAuthenticationRequiredError',
    408: 'RequestTimeoutError',
    409: 'ConflictError',
    410: 'GoneError',
    411: 'LengthRequiredError',
    412: 'PreconditionFailedError',
    413: 'RequestEntityTooLargeError',
    414: 'RequestUriTooLargeError',
    415: 'UnsupportedMediaTypeError',
    416: 'RequestedRangeNotSatisfiableError',
    417: 'ExpectationFailedError',
    418: 'ImATeapotError',              // RFC 2324
    422: 'UnprocessableEntityError',    // RFC 4918
    423: 'LockedError',                 // RFC 4918
    424: 'FailedDependencyError',       // RFC 4918
    425: 'UnorderedCollectionError',    // RFC 4918
    426: 'UpgradeRequiredError',        // RFC 2817
    500: 'InternalServerErrorError',
    501: 'NotImplementedError',
    502: 'BadGatewayError',
    503: 'ServiceUnavailableError',
    504: 'GatewayTimeoutError',
    505: 'HttpVersionNotSupportedError',
    506: 'VariantAlsoNegotiatesError',  // RFC 2295
    507: 'InsufficientStorageError',    // RFC 4918
    509: 'BandwidthLimitExceededError',
    510: 'NotExtendedError'             // RFC 2774
};

Error can also be structure as such:

    {
        code: HTTPCODE,
        message: ERRORMESSAGE
    }

HTTPCODE can be replaced by an explicit HTTP code to return with the error message.

handler example:

In a file stored in docRoot/divide/numerator-denominator.js:

module.exports = {
    get: function ( req, callBack ) {
        var n = parseInt ( req.params.numerator, 10 );
        var d = parseInt ( req.params.denominator, 10 );

        if ( d === 6379 ) {
            return callBack ( {
                code: 201,
                message: 'Easter egg!'
            } );
        }

        if ( d === 0  ) {
            return callBack ( {
                type: 'NotAcceptableError',
                message: 'Divide by zero error'
            } );
        }

        return callBack ( null, n/d );
    }
};