API-Drip-Request

 view release on metacpan or  search on metacpan

Build.PL  view on Meta::CPAN

use v5.14;
use strict;
use warnings;
use Module::Build;

my $builder = Module::Build->new( module_name        => 'API::Drip::Request',
                                  license            => 'perl_5',
                                  dist_author        => q{Dan Wright <Dan@DWright.Org>},
                                  dist_version_from  => 'lib/API/Drip/Request.pm',
                                  release_status     => 'stable',
                                  configure_requires => { 'Module::Build' => '0', },
                                  build_requires     => { 'Test::More' => '0', },
                                  requires           => {
                                                'Carp'                       => 0,
                                                'Data::Printer'              => 0,
                                                'File::HomeDir'              => 0,
                                                'File::Spec'                 => 0,
                                                'HTTP::Request::Common'      => 0,
                                                'JSON'                       => 0,
                                                'LWP::UserAgent'             => 0,
                                                'Params::ValidationCompiler' => 0,
                                                'Readonly'                   => 0,
                                                'Types::Standard'            => 0,
                                                'URI'                        => 0,
                                                'YAML'                       => 0,
                                  },
                                  add_to_cleanup => ['API-Drip-*'],
                                  meta_merge     => {
                                                  'meta-spec' => { version => '2',
                                                                   url     => 'https://metacpan.org/pod/CPAN::Meta::Spec',
                                                  },
                                                  resources => { bugtracker => { web => 'https://github.com/dwright/API-Drip/issues', },
                                                                 repository => { url  => 'https://github.com/dwright/API-Drip.git',
                                                                                 web  => 'https://github.com/dwright/API-Drip',
                                                                                 type => 'git',
                                                                 }
                                                  },
                                  }, );

$builder->create_build_script();

META.json  view on Meta::CPAN

   "license" : [
      "perl_5"
   ],
   "meta-spec" : {
      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
      "version" : "2"
   },
   "name" : "API-Drip-Request",
   "prereqs" : {
      "build" : {
         "requires" : {
            "Test::More" : "0"
         }
      },
      "configure" : {
         "requires" : {
            "Module::Build" : "0"
         }
      },
      "runtime" : {
         "requires" : {
            "Carp" : "0",
            "Data::Printer" : "0",
            "File::HomeDir" : "0",
            "File::Spec" : "0",
            "HTTP::Request::Common" : "0",
            "JSON" : "0",
            "LWP::UserAgent" : "0",
            "Params::ValidationCompiler" : "0",
            "Readonly" : "0",
            "Types::Standard" : "0",

META.json  view on Meta::CPAN

         }
      }
   },
   "provides" : {
      "API::Drip::Request" : {
         "file" : "lib/API/Drip/Request.pm",
         "version" : "0.05"
      }
   },
   "release_status" : "stable",
   "resources" : {
      "bugtracker" : {
         "web" : "https://github.com/dwright/API-Drip/issues"
      },
      "repository" : {
         "type" : "git",
         "url" : "https://github.com/dwright/API-Drip.git",
         "web" : "https://github.com/dwright/API-Drip"
      }
   },
   "version" : "0.05",

META.yml  view on Meta::CPAN

---
abstract: 'Perl interface to api.getdrip.com'
author:
  - 'Dan Wright <Dan@DWright.Org>'
build_requires:
  Test::More: '0'
configure_requires:
  Module::Build: '0'
dynamic_config: 1
generated_by: 'Module::Build version 0.4224, CPAN::Meta::Converter version 2.150010'
license: perl
meta-spec:
  url: http://module-build.sourceforge.net/META-spec-v1.4.html
  version: '1.4'
name: API-Drip-Request
provides:
  API::Drip::Request:
    file: lib/API/Drip/Request.pm
    version: '0.05'
requires:
  Carp: '0'
  Data::Printer: '0'
  File::HomeDir: '0'
  File::Spec: '0'
  HTTP::Request::Common: '0'
  JSON: '0'
  LWP::UserAgent: '0'
  Params::ValidationCompiler: '0'
  Readonly: '0'
  Types::Standard: '0'
  URI: '0'
  YAML: '0'
resources:
  bugtracker: https://github.com/dwright/API-Drip/issues
  repository: https://github.com/dwright/API-Drip.git
version: '0.05'
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'

bin/drip_client.pl  view on Meta::CPAN

=over

=item B<getsub>

Get a list of all subscribers.

=item B<addsub>

Add a subscriber.   At a minimum, must also specify -email, or -id.

Accepts: -email, -id, -new_email, -user_id, -time_zone, -lifetime_value, -ip_address

=item B<delsub>

Delete a subscriber.   Must specify -email, or -id.

=item B<getwork>

Get a list of all workflows.

=item B<startwork>

Start a user on a workflow

Requires: -workflow

Accepts: -email, -id, -user_id, -time_zone, -prospect

=item B<event>

Record that an event happened.

Requires: -email or -id, -action

Accepts: -prospect


=back

=head2 Additional Parameters

The parameters B<-email>, B<-id>, B<-new_email>, B<-user_id>, B<-time_zone>,
B<-lifetime_vaule>, B<-ip_address>, B<-prospect>, B<-action> are documented at
L<https://www.getdrip.com/docs/rest-api> and may be used with the above
operations.

=over

=item B<workflow>

Integer ID of a workflow.


=back

bin/drip_client.pl  view on Meta::CPAN

my %OPT = ( # Add defaults here.
);

GetOptions( \%OPT,
    'help|h|?',
    'man',
    'verbose|verb|v+',
    'conf=s',
    'addsub', 'getsub', 'delsub', 'getwork', 'startwork', 'event',
    'workflow=i', 'action=s',
    'email=s', 'id=s', 'new_email=s', 'user_id=s', 'time_zone=s', 'lifetime_vaule=i', 'ip_address=s', 'prospect'
) or pod2usage(2);
pod2usage(1) if $OPT{help};
pod2usage(-exitval => 0, -verbose => 2) if $OPT{man};
p %OPT if $OPT{verbose};

use API::Drip::Request;
my $client = API::Drip::Request->new( $OPT{conf} ? ( DRIP_CLIENT_CONF => $OPT{conf} ) : () );

eval {
    if ( $OPT{getsub} ) {  get_subscribers() and exit }

bin/drip_client.pl  view on Meta::CPAN


exit;

sub record_event {
    my %OPT = @_;

    $OPT{email} or $OPT{id} or pod2usage( "Either -email or -id is required for -event" );
    $OPT{action} or pod2usage( "-action is required for -event" );

    my $content = _build_hash( %OPT, keys => [qw(email id action prospect)] );
    my $result = $client->do_request( POST => 'events', { events => [ $content ] } );
    p $result;
}


sub get_workflows {
    my %OPT = @_;

    my $result = $client->do_request( GET => 'workflows' );
    p $result;
}


sub start_workflow {
    my %OPT = @_;
    $OPT{workflow} or pod2usage( "Required parameter -workflow missing for -startwork" );

    my $subscriber = _build_hash( %OPT, keys => [qw( email id user_id time_zone prospect )] );

    my $endpoint = 'workflows/' . $OPT{workflow} . '/subscribers';

    my $result = $client->do_request( POST => $endpoint, { subscribers => [ $subscriber ] } );
    p $result;
}


sub delete_subscribers {
    my %OPT = @_;
    my $id = $OPT{email} || $OPT{id};

    die "email or id required in delete subscriber" unless $id;

    my $result = $client->do_request( DELETE => "subscribers/$id" );
    p $result;

}

sub add_subscribers {
    my %OPT = @_;
    my $subscriber = _build_hash( %OPT, keys => [qw( email id new_email user_id time_zone lifetime_value ip_address )] );
    die "email or id required in add subscriber" unless $subscriber->{email} or $subscriber->{id};

    my $result = $client->do_request( POST => 'subscribers', { subscribers => [ $subscriber ]});
    p $result;
}

sub _build_hash {
    my %OPT = @_;
    my $build = {};
    foreach my $key ( @{$OPT{keys}} ) {
        next unless defined $OPT{$key};
        $build->{$key} = $OPT{$key};
    }
    return $build;
}

sub get_subscribers {
    my $result = $client->do_request( GET => 'subscribers' );
    p $result;
}

lib/API/Drip/Request.pm  view on Meta::CPAN

=head1 SYNOPSIS

    use API::Drip::Request;

    my $drip = API::Drip::Request->new();

    $drip->do_request( POST => 'subscribers', { subscribers => [ { email => 'foo@example.com', ... }] } );

=head1 DESCRIPTION

Low-level perl interface to the Drip API as specified at https://www.getdrip.com/docs/rest-api

All of the methods in this module will throw exceptions on error. 

=head1 SUBROUTINES/METHODS

=head2 new()

Creates the API::Drip::Request object.  See L</"CONFIGURATION"> for accepted parameters.

Also accepts: 

lib/API/Drip/Request.pm  view on Meta::CPAN

=item Endpoint (requird)

Specifies the path of the REST enpoint you want to query.   Include everything after the account ID.   For example, "subscribers", "subscribers/$subscriber_id/campaign_subscriptions", etc...

=item Content (optional)

Perl hashref of data that will be sent along with the request.   

=back

On success, returns a Perl data structure corresponding to the data returned
from the server.    Some operations (DELETE), do not return any data and may
return undef on success.  On error, this method will die() with the
HTTP::Response object.

=cut

my $request_validator = validation_for( params => [ {type => Str()}, {type => Str()}, {type => HashRef(), optional => 1} ] );
sub do_request {
    my $self = shift;
    my ($method, $endpoint, $content) = $request_validator->(@_);

lib/API/Drip/Request.pm  view on Meta::CPAN


    $self->{debugger}->( 'Requesting: ' . $uri->as_string );
    my $request = HTTP::Request->new( $method => $uri->as_string, );
    if ( ref($content) ) {
        $request->content_type('application/vnd.api+json');
        $request->content( encode_json( $content ) );
    }
    $request->authorization_basic( $self->{DRIP_TOKEN}, '' );

    $self->{agent} //= LWP::UserAgent->new( agent => $self->{DRIP_AGENT} );
    my $result = $self->{agent}->request( $request );

    unless ( $result->is_success ) {
        $self->{debugger}->("Request failed", $result->content);
        die $result;
    }

    if ( $result->code == 204 ) {
        $self->{debugger}->("Success, no content");
        return undef;
    }
    my $decoded = eval {decode_json( $result->content )};
    if ( $@ ) {
        $self->{debugger}->('Failed to decode JSON:', $@, $result->content);
        die $result;
    }
    return $decoded;
}


=head1 CONFIGURATION

Configuration data may be passed in through a number of different ways, which are searched in the following order of preference:

=over



( run in 1.212 second using v1.01-cache-2.11-cpan-49f99fa48dc )