EVDB-API
view release on metacpan or search on metacpan
lib/EVDB/API.pm view on Meta::CPAN
{
my $self = shift;
my %args = @_;
$self->{user} = $args{user};
# Call login to receive a nonce.
# (The nonce is stored in an error structure.)
$self->call('users/login');
my $nonce = $self->{response_data}{nonce} or return;
# Generate the digested password response.
my $password_md5 = $args{password_md5} || md5_hex($args{password});
my $response = md5_hex( $nonce . ":" . $password_md5 );
# Send back the nonce and response.
my $params =
{
nonce => $nonce,
response => $response,
};
my $r = $self->call('users/login', $params) or return;
# Store the provided user_key.
$self->{user_key} = $r->{user_key} || $r->{auth_token};
return 1;
}
=head2 call
$data = $evdb->call($method, \%arguments, [$force_array]);
Calls the specified method with the given arguments and any previous authentication information (including C<app_key>). Returns a hash reference containing the results.
=cut
sub call
{
my $self = shift;
my $method = shift;
my $args = shift || [];
my $force_array = shift;
# Remove any leading slash from the method name.
$method =~ s%^/%%;
# If we have no force_array, see if we have one for this method.
if ($self->{parser}->flavor eq 'rest' and !$force_array) {
# The following code is automatically generated. Edit
# /main/trunk/evdb/public_api/force_array/force_array.conf
# and run
# /main/trunk/evdb/public_api/force_array/enforcer
# instead.
#
# BEGIN REPLACE
if($method eq 'calendars/latest/stickers') {
$force_array = ['site'];
}
elsif($method eq 'calendars/tags/cloud') {
$force_array = ['tag'];
}
elsif($method eq 'demands/get') {
$force_array = ['link', 'comment', 'image', 'tag', 'event', 'member'];
}
elsif($method eq 'demands/latest/hottest') {
$force_array = ['demand', 'event'];
}
elsif($method eq 'demands/search') {
$force_array = ['demand', 'event'];
}
elsif($method eq 'events/get') {
$force_array = ['link', 'comment', 'trackback', 'image', 'parent', 'child', 'tag', 'feed', 'calendar', 'group', 'user', 'relationship', 'performer', 'rrule', 'exrule', 'rdate', 'exdate', 'date', 'category'];
}
elsif($method eq 'events/recurrence/list') {
$force_array = ['recurrence'];
}
elsif($method eq 'events/tags/cloud') {
$force_array = ['tag'];
}
elsif($method eq 'events/validate/hcal') {
$force_array = ['tag', 'event_url', 'venue_url', 'event'];
}
elsif($method eq 'groups/get') {
$force_array = ['user', 'calendar', 'link', 'comment', 'trackback', 'image', 'tag'];
}
elsif($method eq 'groups/search') {
$force_array = ['group'];
}
elsif($method eq 'groups/users/list') {
$force_array = ['user'];
}
elsif($method eq 'internal/events/submissions/pending') {
$force_array = ['submission'];
}
elsif($method eq 'internal/events/submissions/set_status') {
$force_array = ['submission'];
}
elsif($method eq 'internal/events/submissions/status') {
$force_array = ['target'];
}
elsif($method eq 'internal/submissions/targets') {
$force_array = ['target'];
}
elsif($method eq 'performers/demands/list') {
$force_array = ['demand'];
}
elsif($method eq 'performers/get') {
$force_array = ['link', 'comment', 'image', 'tag', 'event', 'demand', 'trackback'];
}
elsif($method eq 'performers/search') {
$force_array = ['performer'];
}
elsif($method eq 'users/calendars/get') {
$force_array = ['rule', 'feed'];
}
elsif($method eq 'users/calendars/list') {
$force_array = ['calendar'];
}
elsif($method eq 'users/comments/get') {
$force_array = ['comment'];
}
elsif($method eq 'users/events/recent') {
$force_array = ['event'];
}
elsif($method eq 'users/get') {
$force_array = ['site', 'im_account', 'event', 'venue', 'performer', 'comment', 'trackback', 'calendar', 'locale', 'link', 'event'];
}
elsif($method eq 'users/groups/list') {
$force_array = ['group'];
}
elsif($method eq 'users/search') {
$force_array = ['user'];
}
elsif($method eq 'users/venues/get') {
$force_array = ['user_venue'];
}
elsif($method eq 'venues/get') {
$force_array = ['link', 'comment', 'trackback', 'image', 'parent', 'child', 'event', 'tag', 'feed', 'calendar', 'group'];
}
elsif($method eq 'venues/tags/cloud') {
$force_array = ['tag'];
}
else {
$force_array = ['event', 'venue', 'comment', 'trackback', 'calendar', 'group', 'user', 'performer', 'member'];
}
# END REPLACE
}
# Construct the method URL.
my $url = join '/', $self->{api_root}, $self->{parser}->flavor, $method;
print "Calling ($url)...\n" if $VERBOSE;
# Pre-process the arguments into a hash (for searching) and an array ref
# (to pass on to HTTP::Request::Common).
my $arg_present = {};
if (ref($args) eq 'ARRAY')
{
# Create a hash of the array values (assumes [foo => 'bar', baz => 1]).
my %arg_present = @{$args};
$arg_present = \%arg_present;
}
elsif (ref($args) eq 'HASH')
{
# Migrate the provided hash to an array ref.
$arg_present = $args;
my @args = %{$args};
$args = \@args;
}
else
{
$errcode = 'Missing parameter';
$errstr = 'Missing parameters: The second argument to call() should be an array or hash reference.';
return undef;
}
# Add the standard arguments to the list.
foreach my $k ('app_key', 'user', 'user_key')
{
if ($self->{$k} and !$arg_present->{$k})
{
push @{$args}, $k, $self->{$k};
}
}
# If one of the arguments is a file, set up the Common-friendly
# file indicator field and set the content-type.
my $content_type = '';
foreach my $this_field (keys %{$arg_present})
{
# Any argument with a name that ends in "_file" is a file.
if ($this_field =~ /_file$/)
{
$content_type = 'form-data';
next if ref($arg_present->{$this_field}) eq 'ARRAY';
my $file =
[
$arg_present->{$this_field},
];
# Replace the original argument with the file indicator.
$arg_present->{$this_field} = $file;
my $last_arg = scalar(@{$args}) - 1;
( run in 0.937 second using v1.01-cache-2.11-cpan-39bf76dae61 )