summaryrefslogblamecommitdiffstats
path: root/lib/WWW/YNAB.pm
blob: 74d0f4d61e67e9f5926c8e37dcc1d9f5d085e3d3 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11










                                    

                                       











































































































                                                                            




















                                                     










                                                                       

































                                                                                


































                                        
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::ScheduledSubTransaction;
use WWW::YNAB::ScheduledTransaction;
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 = %$_;
        if ($transaction{account_id}) {
            ($transaction{account_name}) = map {
                $_->{name}
            } grep {
                $_->{id} eq $transaction{account_id}
            } @{ $budget{accounts} };
        }
        if ($transaction{payee_id}) {
            ($transaction{payee_name}) = map {
                $_->{name}
            } grep {
                $_->{id} eq $transaction{payee_id}
            } @{ $budget{payees} };
        }
        if ($transaction{category_id}) {
            ($transaction{category_name}) = map {
                $_->{name}
            } grep {
                $_->{id} eq $transaction{category_id}
            } @{ $budget{categories} };
        }
        $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;

    my @scheduled_transactions = map {
        my %transaction = %$_;
        if ($transaction{account_id}) {
            ($transaction{account_name}) = map {
                $_->{name}
            } grep {
                $_->{id} eq $transaction{account_id}
            } @{ $budget{accounts} };
        }
        if ($transaction{payee_id}) {
            ($transaction{payee_name}) = map {
                $_->{name}
            } grep {
                $_->{id} eq $transaction{payee_id}
            } @{ $budget{payees} };
        }
        if ($transaction{category_id}) {
            ($transaction{category_name}) = map {
                $_->{name}
            } grep {
                $_->{id} eq $transaction{category_id}
            } @{ $budget{categories} };
        }
        $transaction{subtransactions} = [
            map {
                $self->model_from_data('WWW::YNAB::ScheduledSubTransaction', $_)
            } grep {
                $_->{scheduled_transaction_id} eq $transaction{id}
            } @{ $budget{scheduled_subtransactions} }
        ];
        $self->model_from_data('WWW::YNAB::ScheduledTransaction', \%transaction)
    } @{ $budget{scheduled_transactions} };
    $budget{scheduled_transactions} = \@scheduled_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;