package Pear::LocalLoop::Controller::Api::Transactions; use Mojo::Base 'Mojolicious::Controller'; use Mojo::JSON; has error_messages => sub { return { email => { required => { message => 'No email sent.', status => 400 }, email => { message => 'Email is invalid.', status => 400 }, }, value => { required => { message => 'transaction amount is missing', status => 400 }, number => { message => 'transaction amount does not look like a number', status => 400 }, gt_num => { message => 'transaction amount cannot be equal to or less than zero', status => 400 }, }, apply_time => { required => { message => 'purchase time is missing', status => 400 }, is_full_iso_datetime => { message => 'time is in incorrect format', status => 400 }, }, id => { required => { message => 'Recurring Transaction not found', status => 400 }, }, category => { in_resultset => { message => 'Category is invalid', status => 400 }, }, }; }; sub post_transaction_list_purchases { my $c = shift; my $user = $c->stash->{api_user}; my $validation = $c->validation; $validation->input( $c->stash->{api_json} ); $validation->optional('page')->number; return $c->api_validation_error if $validation->has_error; my $transactions = $user->entity->purchases->search( undef, { page => $validation->param('page') || 1, rows => 10, order_by => { -desc => 'purchase_time' }, }, ); my $recurring_transactions = $c->schema->resultset('TransactionRecurring')->search( { buyer_id => $user->id, } ); # purchase_time needs timezone attached to it my @transaction_list = ( map { { seller => $_->seller->name, value => $_->value / 100000, purchase_time => $c->format_iso_datetime( $_->purchase_time ), ( $_->meta ? ( net_value => $_->meta->net_value / 100000, sales_tax_value => $_->meta->sales_tax_value / 100000, gross_value => $_->meta->gross_value / 100000, ) : ( net_value => undef, sales_tax_value => undef, gross_value => undef, ) ), } } $transactions->all ); my @recurring_transaction_list = ( map { { id => $_->id, seller => $_->seller->name, value => $_->value / 100000, start_time => $c->format_iso_datetime( $_->start_time ), last_updated => $c->format_iso_datetime( $_->last_updated ) || undef, essential => $_->essential, category => $_->category_id || 0, recurring_period => $_->recurring_period, } } $recurring_transactions->all ); return $c->render( json => { success => Mojo::JSON->true, transactions => \@transaction_list, recurring_transactions => \@recurring_transaction_list, page_no => $transactions->pager->total_entries, } ); } sub update_recurring { my $c = shift; my $user = $c->stash->{api_user}; my $validation = $c->validation; $validation->input( $c->stash->{api_json} ); $validation->required('id'); return $c->api_validation_error if $validation->has_error; my $id = $validation->param('id'); my $recur_transaction = $c->schema->resultset('TransactionRecurring')->find($id); unless ($recur_transaction) { return $c->render( json => { success => Mojo::JSON->false, message => 'Error Finding Recurring Transaction', error => 'recurring_error', }, status => 400, ); } $validation->required('recurring_period'); $validation->required('apply_time')->is_full_iso_datetime; $validation->optional('category') ->in_resultset( 'id', $c->schema->resultset('Category') ); $validation->optional('essential'); $validation->required('value'); return $c->api_validation_error if $validation->has_error; my $apply_time = $c->parse_iso_datetime( $validation->param('apply_time') ); $c->schema->storage->txn_do( sub { $recur_transaction->update( { start_time => $c->format_db_datetime($apply_time), last_updated => undef, category_id => $validation->param('category'), essential => $validation->param('essential'), value => $validation->param('value') * 100000, recurring_period => $validation->param('recurring_period'), } ); } ); return $c->render( json => { success => Mojo::JSON->true, message => 'Recurring Transaction Updated Successfully', } ); } sub delete_recurring { my $c = shift; my $user = $c->stash->{api_user}; my $validation = $c->validation; $validation->input( $c->stash->{api_json} ); $validation->required('id'); return $c->api_validation_error if $validation->has_error; my $id = $validation->param('id'); my $recur_transaction = $c->schema->resultset('TransactionRecurring')->find($id); unless ($recur_transaction) { return $c->render( json => { success => Mojo::JSON->false, message => 'Error Finding Recurring Transaction', error => 'recurring_error', }, status => 400, ); } $recur_transaction->delete; return $c->render( json => { success => Mojo::JSON->true, message => 'Recurring Transaction Deleted Successfully', } ); } 1;