version 1.9, 2010/01/23 07:15:40 |
version 1.12, 2010/01/26 03:51:49 |
|
|
package Text::Todo::REST::API; |
package Text::Todo::REST::API; |
|
|
# $AFresh1: API.pm,v 1.8 2010/01/19 03:18:34 andrew Exp $ |
# $AFresh1: API.pm,v 1.11 2010/01/24 04:38:21 andrew Exp $ |
|
|
use warnings; |
use warnings; |
use strict; |
use strict; |
use Carp; |
use Carp; |
|
|
use Text::Todo; |
use Text::Todo; |
|
use Text::Todo::REST::API::Response; |
|
|
use Class::Std::Utils; |
use Class::Std::Utils; |
use Digest::MD5 qw/ md5_hex /; |
use Digest::MD5 qw/ md5_hex /; |
|
|
} |
} |
} |
} |
|
|
if ($options{action} eq 'entry' && @{ $options{args} }) { |
if ( $options{action} eq 'entry' && @{ $options{args} } ) { |
$options{entry} = shift @{ $options{args} }; |
$options{entry} = shift @{ $options{args} }; |
if (@{ $options{args} }) { |
if ( @{ $options{args} } ) { |
$options{action} = lc shift @{ $options{args} }; |
$options{action} .= q{_} . lc shift @{ $options{args} }; |
} |
} |
} |
} |
|
|
push @{ $options{args} }, @args; |
push @{ $options{args} }, @args; |
|
|
$options{list} = defined $options{list} ? $options{list} : 'todo_file'; |
$options{list} |
|
= defined $options{list} ? $options{list} : 'todo_file'; |
|
|
if ( $options{format} ) { |
if ( $options{format} ) { |
$format_of{ ident $self } = $options{format}; |
$format_of{ ident $self } = $options{format}; |
|
|
sub _handle_action { |
sub _handle_action { |
my ( $self, @args ) = @_; |
my ( $self, @args ) = @_; |
|
|
my ($method, %options) = $self->_parse_options(@args); |
my ( $method, %options ) = $self->_parse_options(@args); |
|
|
my $todo = $self->_todo; |
my $todo = $self->_todo; |
$todo->load( $options{list} ); |
$todo->load( $options{list} ); |
|
|
foreach my $class ( $self ) { |
foreach my $class ($self) { |
if ($class->can($method) ) { |
if ( $class->can($method) ) { |
return $class->$method( $todo, \%options ); |
return Text::Todo::REST::API::Response->new( |
|
{ type => $options{action}, |
|
format => $self->_format, |
|
data => $class->$method( $todo, \%options ), |
|
} |
|
); |
} |
} |
} |
} |
|
|
|
|
|
|
my $suffix = $self->_suffix; |
my $suffix = $self->_suffix; |
|
|
if (( lc $options{list} ) eq 'files') { |
if ( ( lc $options{list} ) eq 'files' ) { |
$options{action} = lc $options{list}; |
$options{action} = lc $options{list}; |
$options{list} = q{}; |
$options{list} = q{}; |
} |
} |
elsif ($self->_todo->file( $options{list} )) { |
elsif ( $self->_todo->file( $options{list} ) ) { |
$options{list} = $self->_todo->file( $options{list} ); |
$options{list} = $self->_todo->file( $options{list} ); |
} |
} |
} |
} |
|
|
|
|
return $self->_handle_action( 'GET', @args ); |
return $self->_handle_action( 'GET', @args ); |
} |
} |
|
|
|
sub get_entry_done { |
|
my ( $self, $todo, $key ) = @_; |
|
my $entry = $self->get_entry( $todo, $key ); |
|
|
|
return $todo->list->[ $entry->{line} - 1 ]->done; |
|
} |
|
|
sub get_entry { |
sub get_entry { |
my ( $self, $todo, $key ) = @_; |
my ( $self, $todo, $key ) = @_; |
|
|
|
|
return $self->fail("get_entry requires arguments"); |
return $self->fail("get_entry requires arguments"); |
} |
} |
elsif ( ref $key eq 'ARRAY' ) { |
elsif ( ref $key eq 'ARRAY' ) { |
my @entries; |
return self->get_entry( $_->[0] ); |
foreach ( @{$key} ) { |
|
push @entries, $self->get_entry($_); |
|
} |
|
return @entries; |
|
} |
} |
elsif ( ref $key eq 'HASH' ) { |
elsif ( ref $key eq 'HASH' ) { |
if (exists $key->{entry}) { |
if ( exists $key->{entry} ) { |
$key = $key->{entry}; |
$key = $key->{entry}; |
} |
} |
else { |
else { |
return $self->fail('get_entry requires key [entry]'); |
return $self->fail('get_entry requires key [entry]'); |
} |
} |
} |
} |
|
|
my @list = $self->get_list($todo); |
my $list = $self->get_list($todo); |
|
|
my $entry; |
|
if ( $key =~ /^[[:xdigit:]]{32}$/xms ) { |
if ( $key =~ /^[[:xdigit:]]{32}$/xms ) { |
my $search = lc $key; |
my $search = lc $key; |
|
|
ENTRY: foreach my $e (@list) { |
foreach my $e ( @{$list} ) { |
if ( $search eq $e->{md5} ) { |
if ( $search eq $e->{md5} ) { |
$entry = $e; |
return $e; |
last ENTRY; |
|
} |
} |
} |
} |
} |
} |
elsif ( $key =~ /^\d+$/xms ) { |
elsif ( $key =~ /^\d+$/xms ) { |
$entry = $list[ $key - 1 ]; |
return $list->[ $key - 1 ]; |
} |
} |
|
|
if ( !$entry ) { |
return $self->fail("Unable to find entry!"); |
return $self->fail("Unable to find entry!"); |
|
} |
|
|
|
return $entry; |
|
} |
} |
|
|
sub get_list { |
sub get_list { |
my ($self, $todo) = @_; |
my ( $self, $todo ) = @_; |
|
|
my $line = 1; |
my $line = 1; |
return map ( { |
my @list = map ( { |
line => $line++, |
line => $line++, |
md5 => md5_hex( $_->text ), |
md5 => md5_hex( $_->text ), |
text => $_->text, |
text => $_->text, |
}, |
}, |
$todo->list ); |
$todo->list ); |
|
return \@list; |
} |
} |
|
|
sub get_files { |
sub get_files { |
my ($self, $todo) = @_; |
my ( $self, $todo ) = @_; |
my $dir = $todo->file('todo_dir'); |
my $dir = $todo->file('todo_dir'); |
|
|
if ( !$dir ) { |
if ( !$dir ) { |
|
|
my @files = grep {m/$file_regex/xms} readdir $dh; |
my @files = grep {m/$file_regex/xms} readdir $dh; |
closedir $dh; |
closedir $dh; |
|
|
return @files; |
return \@files; |
} |
} |
|
|
sub get_tags { |
sub get_tags { |
my ( $self, $todo, $tag ) = @_; |
my ( $self, $todo, $tag ) = @_; |
return $todo->listtag($tag); |
return [ $todo->listtag($tag) ]; |
} |
} |
|
|
sub POST { |
sub POST { |