NAME
    Mojolicious::Plugin::Cloudinary - Talk with cloudinary.com

VERSION
    0.03

DESCRIPTION
    This module lets you interface to <http://cloudinary.com>. Its primary
    target is to be a Mojolicious plugin, but it can also be used as a
    generic module - just skip calling "register".

SYNOPSIS
  With mojolicious
        package MyWebApp;
        use Mojo::Base 'Mojolicious';

        sub startup {
            my $self = shift;
            $self->plugin('Mojolicious::Plugin::Cloudinary', {
                cloud_name => $str,
                api_key => $str,
                api_secret => $str,
            });
        }

        package MyWebApp::SomeController;

        sub upload {
            my $self = shift;

            $self->render_later;
            $self->cloudinary_upload({
                file => $self->param('upload_param'),
                on_success => sub {
                    my $res = shift;
                    $self->render_json($res);
                },
                on_error => sub {
                    my $res = shift || { error => 'Unknown' };
                    $self->render_json($res);
                },
            });
        }

  Standalone
        my $delay = Mojo::IOLoop->delay;
        my $cloudinary = Mojolicious::Plugin::Cloudinary->new(
                             cloud_name => '...',
                             api_key => '...',
                             api_secret => '...',
                         );

        $delay->begin;
        $cloudinary->upload({
            file => { file => $path_to_file },
            on_success => sub {
                # ...
                $delay->end;
            },
            on_error => sub {
                # ...
                $delay->end;
            },
        });

        # let's you do multiple upload() in parallel
        # just call $delay->begin once pr upload()
        # and $delay->end in each on_xxx callback
        $delay->wait;

  url_for() examples
        $cloudinary->url_for('billclinton.jpg', { type => 'facebook' });
        $cloudinary->url_for('billclinton.jpg', { type => 'twitter_name', h => 70, w => 100 });
        $cloudinary->url_for('18913373.jpg', { type => 'twitter_name' });
        $cloudinary->url_for('my-uploaded-image.jpg', { h => 50, w => 50 });
        $cloudinary->url_for('myrawid', { resource_type => 'raw' });

ATTRIBUTES
  cloud_name
    Your cloud name from <https://cloudinary.com/console>

  api_key
    Your API key from <https://cloudinary.com/console>

  api_secret
    Your API secret from <https://cloudinary.com/console>

  private_cdn
    Your private CDN url from <https://cloudinary.com/console>.

METHODS
  upload
        $self->upload({
            file => $binary_str|$url, # required
            timestamp => $epoch, # time()
            public_id => $str, # optional
            format => $str, # optional
            resource_type => $str, # image or raw. defaults to "image"
            tags => ['foo', 'bar'], # optional
            on_success => sub {
                my($res) = @_;
                # ...
            },
            on_error => sub {
                my($res, $tx) = @_;
                # ...
            },
        });

    Will upload a file to <http://cloudinary.com> using the parameters given
    "cloud_name", "api_key" and "api_secret". $res in "on_success" will be
    the json response from cloudinary:

        {
            url => $str,
            secure_url => $str,
            public_id => $str,
            version => $str,
            width => $int, # only for images
            height => $int, # only for images
        }

    $res for "on_error" on the other hand can be either "undef" if there was
    an issue connecting/communicating with cloudinary or a an error:

        {
            error => { message: $str },
        }

    The "file" can be:

    *   A hash

            { file => 'path/to/image' }

    *   A Mojo::Upload object.

    *   A Mojo::Asset object.

    *   A URL

    "res" in callbacks will be the JSON response from
    <http://cloudinary.com> as a hash ref. It may also be "undef" if
    something went wrong with the actual HTTP POST.

    See also <https://cloudinary.com/documentation/upload_images> and
    <http://cloudinary.com/documentation/upload_images#raw_uploads>.

  destroy
        $self->destroy({
            public_id => $public_id,
            resource_type => $str, # image or raw. defaults to "image"
            on_success => sub {
                # ...
            },
            on_error => sub {
                my($res, $tx) = @_;
                # ...
            },
        });

    Will delete an image from cloudinary, identified by $public_id.
    "on_success" will be called when the image got deleted, while "on_error"
    is called if not: $res can be either "undef" if there was an issue
    connecting/communicating with cloudinary or a an error:

        {
            error => { message: $str },
        }

    See also
    <https://cloudinary.com/documentation/upload_images#deleting_images>.

  url_for
        $url_obj = $self->url_for("$public_id.$format", \%args);

    This method will return a public URL to the image at
    <http://cloudinary.com>. It will use "private_cdn" or the public CDN and
    "cloud_name" to construct the URL. The return value is a Mojo::URL
    object.

    Example %args:

        {
            w => 100, # width of image
            h => 150, # height of image
            resource_type => $str, # image or raw. defaults to "image"
            type => $str, # upload, facebook. defaults to "upload"
            secure => $bool, # use private_cdn or public cdn
        }

    See also
    <http://cloudinary.com/documentation/upload_images#accessing_uploaded_im
    ages> and <http://cloudinary.com/documentation/image_transformations>.

  register
    Adds the helpers to your controller:

    *   cloudinary_upload

    *   cloudinary_destroy

        See "upload".

    *   cloudinary_url_for

        See "url_for".

COPYRIGHT & LICENSE
    See Oppstarter

AUTHOR
    Jan Henning Thorsen - jan.henning@oppstarter.no

