diff options
Diffstat (limited to 'lib/WWW/YNAB.pm')
-rw-r--r-- | lib/WWW/YNAB.pm | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/lib/WWW/YNAB.pm b/lib/WWW/YNAB.pm index e69de29..b44e004 100644 --- a/lib/WWW/YNAB.pm +++ b/lib/WWW/YNAB.pm @@ -0,0 +1,165 @@ +package WWW::YNAB; +use Moose; + +# ABSTRACT: Wrapper for the YNAB API + +use WWW::YNAB::Account; +use WWW::YNAB::Budget; +use WWW::YNAB::CategoryGroup; +use WWW::YNAB::Category; +use WWW::YNAB::Month; +use WWW::YNAB::Payee; +use WWW::YNAB::SubTransaction; +use WWW::YNAB::Transaction; +use WWW::YNAB::UA; +use WWW::YNAB::User; + +with 'WWW::YNAB::ModelHelpers'; + +has access_token => ( + is => 'ro', + isa => 'Str', + required => 1, +); + +has base_uri => ( + is => 'ro', + isa => 'Str', + default => 'https://api.youneedabudget.com/v1/', +); + +has ua => ( + is => 'ro', + isa => 'HTTP::Tiny', + lazy => 1, + default => sub { HTTP::Tiny->new }, +); + +has _ua => ( + is => 'ro', + isa => 'WWW::YNAB::UA', + lazy => 1, + default => sub { + my $self = shift; + WWW::YNAB::UA->new( + access_token => $self->access_token, + base_uri => $self->base_uri, + ua => $self->ua, + ) + }, +); + +sub user { + my $self = shift; + + my $data = $self->_ua->get('/user'); + my $user = $data->{data}{user}; + $self->model_from_data('WWW::YNAB::User', $user); +} + +sub budgets { + my $self = shift; + + my $data = $self->_ua->get('/budgets'); + map { + $self->model_from_data('WWW::YNAB::Budget', $_) + } @{ $data->{data}{budgets} }; +} + +sub budget { + my $self = shift; + my ($id, $server_knowledge) = @_; + + my $params; + if (defined $server_knowledge) { + $params = { + last_knowledge_of_server => $server_knowledge, + } + } + + my $data = $self->_ua->get("/budgets/$id", $params); + my $budget = $data->{data}{budget}; + my %budget = %$budget; + + my @accounts = map { + $self->model_from_data('WWW::YNAB::Account', $_) + } @{ $budget{accounts} }; + $budget{accounts} = \@accounts; + + my @payees = map { + $self->model_from_data('WWW::YNAB::Payee', $_) + } @{ $budget{payees} }; + $budget{payees} = \@payees; + + my @category_groups = map { + my %category_group = %$_; + $category_group{categories} = [ + map { + $self->model_from_data('WWW::YNAB::Category', $_) + } grep { + $_->{category_group_id} eq $category_group{id} + } @{ $budget{categories} } + ]; + $self->model_from_data('WWW::YNAB::CategoryGroup', \%category_group) + } @{ $budget{category_groups} }; + $budget{category_groups} = \@category_groups; + + my @months = map { + my %month = %$_; + $month{categories} = [ + map { + $self->model_from_data('WWW::YNAB::Category', $_) + } @{ $month{categories} } + ]; + $self->model_from_data('WWW::YNAB::Month', \%month) + } @{ $budget{months} }; + $budget{months} = \@months; + + my @transactions = map { + my %transaction = %$_; + $transaction{subtransactions} = [ + map { + $self->model_from_data('WWW::YNAB::SubTransaction', $_) + } grep { + $_->{transaction_id} eq $transaction{id} + } @{ $budget{subtransactions} } + ]; + $self->model_from_data('WWW::YNAB::Transaction', \%transaction) + } @{ $budget{transactions} }; + $budget{transactions} = \@transactions; + + $self->model_from_data( + 'WWW::YNAB::Budget', + \%budget, + $data->{data}{server_knowledge}, + ); +} + +sub rate_limit { + my $self = shift; + + $self->_ua->rate_limit +} + +sub knows_rate_limit { + my $self = shift; + + $self->_ua->knows_rate_limit +} + +sub total_rate_limit { + my $self = shift; + + $self->_ua->total_rate_limit +} + +sub knows_total_rate_limit { + my $self = shift; + + $self->_ua->knows_total_rate_limit +} + +__PACKAGE__->meta->make_immutable; +no Moose; + +1; |