From 0cb3426825c006c870ef144bcd69759e061075ff Mon Sep 17 00:00:00 2001 From: Finn Date: Tue, 13 Mar 2018 12:55:13 +0000 Subject: [PATCH 1/9] amended upload to allow for validation changes --- .../LocalLoop/Controller/Api/Transactions.pm | 19 ++++++++++++++++++- lib/Pear/LocalLoop/Controller/Api/Upload.pm | 6 +++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/Pear/LocalLoop/Controller/Api/Transactions.pm b/lib/Pear/LocalLoop/Controller/Api/Transactions.pm index 4a0ae8c..9273c2d 100644 --- a/lib/Pear/LocalLoop/Controller/Api/Transactions.pm +++ b/lib/Pear/LocalLoop/Controller/Api/Transactions.pm @@ -30,7 +30,11 @@ sub post_transaction_list_purchases { }, ); -# purchase_time needs timezone attached to it + 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, @@ -39,9 +43,22 @@ sub post_transaction_list_purchases { }} $transactions->all ); + my @recurring_transaction_list = ( + map {{ + seller => $_->seller->name, + value => $_->value / 100000, + start_time => $c->format_iso_datetime($_->start_time), + last_updated => $c->format_iso_datetime($_->last_updated), + essential => $_->essential, + category => $_->category->category->name, + 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, }); } diff --git a/lib/Pear/LocalLoop/Controller/Api/Upload.pm b/lib/Pear/LocalLoop/Controller/Api/Upload.pm index dea5678..61f1d2b 100644 --- a/lib/Pear/LocalLoop/Controller/Api/Upload.pm +++ b/lib/Pear/LocalLoop/Controller/Api/Upload.pm @@ -147,7 +147,7 @@ sub post_upload { # Unknown Organisation $validation->required('organisation_name'); $validation->optional('street_name'); - $validation->required('town'); + $validation->optional('town'); $validation->optional('postcode')->postcode; return $c->api_validation_error if $validation->has_error; @@ -198,7 +198,7 @@ sub post_upload { ( defined $file ? ( proof_image => $file ) : () ), purchase_time => $c->format_db_datetime($purchase_time), essential => ( defined $essential ? $essential : 0 ), - distance => $distance, + distance => ( defined $category ? $category : undef ), } ); @@ -227,7 +227,7 @@ sub post_upload { value => $transaction_value * 100000, start_time => $c->format_db_datetime($purchase_time), essential => ( defined $essential ? $essential : 0 ), - distance => $distance, + distance => ( defined $category ? $category : undef ), category_id => ( defined $category ? $category : undef ), recurring_period => $recurring_period, }); From d5e03cc9e3ac1ac4a25662941f0409aeee8c0f97 Mon Sep 17 00:00:00 2001 From: Finn Date: Wed, 14 Mar 2018 17:55:24 +0000 Subject: [PATCH 2/9] amended api for recurring transaction list --- lib/Pear/LocalLoop/Controller/Api/Transactions.pm | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/Pear/LocalLoop/Controller/Api/Transactions.pm b/lib/Pear/LocalLoop/Controller/Api/Transactions.pm index 9273c2d..8f4f2d0 100644 --- a/lib/Pear/LocalLoop/Controller/Api/Transactions.pm +++ b/lib/Pear/LocalLoop/Controller/Api/Transactions.pm @@ -45,12 +45,13 @@ sub post_transaction_list_purchases { 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), essential => $_->essential, - category => $_->category->category->name, + category => ( defined $_->category ? $_->category->name : 'Uncategorised' ), recurring_period => $_->recurring_period, }} $recurring_transactions->all ); @@ -63,4 +64,16 @@ sub post_transaction_list_purchases { }); } +sub update_recurring { + my $c = shift; + + my $user = $c->stash->{api_user}; + + my $validation = $c->validation; + + $validation->input( $c->stash->{api_json} ); + #TODO check that user matches seller on database before updating for that id + +} + 1; From 551a40a9a03924dc11e79b0c613c4da1e70d9c73 Mon Sep 17 00:00:00 2001 From: Finn Date: Wed, 14 Mar 2018 19:38:05 +0000 Subject: [PATCH 3/9] fixed critical bugs introduced earlier and changed category viewing --- lib/Pear/LocalLoop/Controller/Api/Upload.pm | 22 ++++++++++++--------- lib/Pear/LocalLoop/Plugin/Datetime.pm | 1 + 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/Pear/LocalLoop/Controller/Api/Upload.pm b/lib/Pear/LocalLoop/Controller/Api/Upload.pm index 61f1d2b..dea1f10 100644 --- a/lib/Pear/LocalLoop/Controller/Api/Upload.pm +++ b/lib/Pear/LocalLoop/Controller/Api/Upload.pm @@ -198,7 +198,7 @@ sub post_upload { ( defined $file ? ( proof_image => $file ) : () ), purchase_time => $c->format_db_datetime($purchase_time), essential => ( defined $essential ? $essential : 0 ), - distance => ( defined $category ? $category : undef ), + distance => $distance, } ); @@ -227,7 +227,7 @@ sub post_upload { value => $transaction_value * 100000, start_time => $c->format_db_datetime($purchase_time), essential => ( defined $essential ? $essential : 0 ), - distance => ( defined $category ? $category : undef ), + distance => $distance, category_id => ( defined $category ? $category : undef ), recurring_period => $recurring_period, }); @@ -243,18 +243,22 @@ sub post_category { my $c = shift; my $self = $c; - my $categories = { ids => [], names => [] }; - my $category_rs = $c->schema->resultset('Category'); - for ( $category_rs->all ) { - push @{ $categories->{ ids } }, $_->get_column('id'); - push @{ $categories->{ names } }, $_->get_column('name'); - } + # for ( $category_rs->all ) { + # push @{ $categories->{ ids } }, $_->get_column('id'); + # push @{ $categories->{ names } }, $_->get_column('name'); + # } + my @category_list = ( + map {{ + id => $_->id, + name => $_->name, + }} $category_rs->all + ); return $self->render( json => { success => Mojo::JSON->true, - categories => $categories, + categories => \@category_list, }); } diff --git a/lib/Pear/LocalLoop/Plugin/Datetime.pm b/lib/Pear/LocalLoop/Plugin/Datetime.pm index 1f79e45..c6f2e55 100644 --- a/lib/Pear/LocalLoop/Plugin/Datetime.pm +++ b/lib/Pear/LocalLoop/Plugin/Datetime.pm @@ -66,6 +66,7 @@ sub register { $app->helper( format_iso_datetime => sub { my ( $c, $datetime_obj ) = @_; + return unless defined $datetime_obj; return $c->iso_datetime_parser->format_datetime( $datetime_obj, ); From 60438ea51c4a6781e076bd8043153842b31db451 Mon Sep 17 00:00:00 2001 From: Finn Date: Thu, 15 Mar 2018 13:06:50 +0000 Subject: [PATCH 4/9] amended transactionlist code --- lib/Pear/LocalLoop/Controller/Api/Transactions.pm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Pear/LocalLoop/Controller/Api/Transactions.pm b/lib/Pear/LocalLoop/Controller/Api/Transactions.pm index 8f4f2d0..a2458d6 100644 --- a/lib/Pear/LocalLoop/Controller/Api/Transactions.pm +++ b/lib/Pear/LocalLoop/Controller/Api/Transactions.pm @@ -42,16 +42,16 @@ sub post_transaction_list_purchases { purchase_time => $c->format_iso_datetime($_->purchase_time), }} $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), + last_updated => $c->format_iso_datetime($_->last_updated) || undef, essential => $_->essential, - category => ( defined $_->category ? $_->category->name : 'Uncategorised' ), + category => $_->category_id, recurring_period => $_->recurring_period, }} $recurring_transactions->all ); From 97462df1a27cf38fae6338b56bd4038f06acd023 Mon Sep 17 00:00:00 2001 From: Finn Date: Mon, 19 Mar 2018 13:36:51 +0000 Subject: [PATCH 5/9] Fix to add org submission --- templates/admin/organisations/add_org.html.ep | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/admin/organisations/add_org.html.ep b/templates/admin/organisations/add_org.html.ep index 7a964a8..427d12d 100644 --- a/templates/admin/organisations/add_org.html.ep +++ b/templates/admin/organisations/add_org.html.ep @@ -59,8 +59,8 @@
@@ -68,8 +68,8 @@
From 2cf0678126bd5d3285a33eac90e772ee054cdf3b Mon Sep 17 00:00:00 2001 From: Finn Date: Tue, 20 Mar 2018 12:19:04 +0000 Subject: [PATCH 6/9] fixed to category viewing and recurring transaction data --- lib/Pear/LocalLoop/Controller/Api/Categories.pm | 2 +- lib/Pear/LocalLoop/Controller/Api/Transactions.pm | 4 ++-- lib/Pear/LocalLoop/Controller/Api/Upload.pm | 11 +++++------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/Pear/LocalLoop/Controller/Api/Categories.pm b/lib/Pear/LocalLoop/Controller/Api/Categories.pm index 9913f42..95f9db5 100644 --- a/lib/Pear/LocalLoop/Controller/Api/Categories.pm +++ b/lib/Pear/LocalLoop/Controller/Api/Categories.pm @@ -43,7 +43,7 @@ sub post_category_list { for my $cat_trans ( $month_transaction_category_rs->all ) { my $quantised = $c->db_datetime_parser->parse_datetime($cat_trans->get_column('quantised')); my $days = $c->format_iso_date( $quantised ) || 0; - my $category = $cat_trans->get_column('category_id') || 0; + my $category = $cat_trans->get_column('category_id') || undef; my $value = ($cat_trans->get_column('value') || 0) / 100000; $data->{categories}->{$days} = [] unless exists $data->{categories}->{$days}; push @{ $data->{categories}->{$days} }, { diff --git a/lib/Pear/LocalLoop/Controller/Api/Transactions.pm b/lib/Pear/LocalLoop/Controller/Api/Transactions.pm index a2458d6..e5bbc94 100644 --- a/lib/Pear/LocalLoop/Controller/Api/Transactions.pm +++ b/lib/Pear/LocalLoop/Controller/Api/Transactions.pm @@ -42,7 +42,7 @@ sub post_transaction_list_purchases { purchase_time => $c->format_iso_datetime($_->purchase_time), }} $transactions->all ); - + my @recurring_transaction_list = ( map {{ id => $_->id, @@ -51,7 +51,7 @@ sub post_transaction_list_purchases { start_time => $c->format_iso_datetime($_->start_time), last_updated => $c->format_iso_datetime($_->last_updated) || undef, essential => $_->essential, - category => $_->category_id, + category => $_->category_id || 0, recurring_period => $_->recurring_period, }} $recurring_transactions->all ); diff --git a/lib/Pear/LocalLoop/Controller/Api/Upload.pm b/lib/Pear/LocalLoop/Controller/Api/Upload.pm index dea1f10..31fa234 100644 --- a/lib/Pear/LocalLoop/Controller/Api/Upload.pm +++ b/lib/Pear/LocalLoop/Controller/Api/Upload.pm @@ -249,16 +249,15 @@ sub post_category { # push @{ $categories->{ ids } }, $_->get_column('id'); # push @{ $categories->{ names } }, $_->get_column('name'); # } - my @category_list = ( - map {{ - id => $_->id, - name => $_->name, - }} $category_rs->all + my %category_list = ( + map { + $_->id => $_->name, + } $category_rs->all ); return $self->render( json => { success => Mojo::JSON->true, - categories => \@category_list, + categories => \%category_list, }); } From 73d44feaced188add64c128154d1c4d2ac782360 Mon Sep 17 00:00:00 2001 From: Finn Date: Tue, 20 Mar 2018 18:43:00 +0000 Subject: [PATCH 7/9] added deleting and updating transactions --- lib/Pear/LocalLoop.pm | 2 + .../LocalLoop/Controller/Api/Transactions.pm | 94 ++++++++++++++++++- 2 files changed, 94 insertions(+), 2 deletions(-) diff --git a/lib/Pear/LocalLoop.pm b/lib/Pear/LocalLoop.pm index 5bd5e26..c996567 100644 --- a/lib/Pear/LocalLoop.pm +++ b/lib/Pear/LocalLoop.pm @@ -154,6 +154,8 @@ sub startup { $api->post('/stats/leaderboard')->to('api-stats#post_leaderboards'); $api->post('/stats/leaderboard/paged')->to('api-stats#post_leaderboards_paged'); $api->post('/outgoing-transactions')->to('api-transactions#post_transaction_list_purchases'); + $api->post('/recurring-transactions')->to('api-transactions#update_recurring'); + $api->post('/recurring-transactions/delete')->to('api-transactions#delete_recurring'); my $api_v1 = $api->under('/v1'); diff --git a/lib/Pear/LocalLoop/Controller/Api/Transactions.pm b/lib/Pear/LocalLoop/Controller/Api/Transactions.pm index e5bbc94..e2c4c18 100644 --- a/lib/Pear/LocalLoop/Controller/Api/Transactions.pm +++ b/lib/Pear/LocalLoop/Controller/Api/Transactions.pm @@ -8,6 +8,21 @@ has error_messages => sub { 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 }, + }, }; }; @@ -70,9 +85,84 @@ sub update_recurring { my $user = $c->stash->{api_user}; my $validation = $c->validation; - $validation->input( $c->stash->{api_json} ); - #TODO check that user matches seller on database before updating for that id + $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 Delete Successfully', + }); } From 49e5e9186066bae76d461e946f64f09ab35f07f7 Mon Sep 17 00:00:00 2001 From: Finn Date: Tue, 20 Mar 2018 18:46:50 +0000 Subject: [PATCH 8/9] made tests sane --- lib/Test/Pear/LocalLoop.pm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/Test/Pear/LocalLoop.pm b/lib/Test/Pear/LocalLoop.pm index 490aa1a..deffc44 100644 --- a/lib/Test/Pear/LocalLoop.pm +++ b/lib/Test/Pear/LocalLoop.pm @@ -114,6 +114,8 @@ sub dump_error { my $self = shift; if ( my $error = $self->tx->res->dom->at('pre[id="error"]') ) { diag $error->text; + } elsif ( my $route_error = $self->tx->res->dom->at('div[id="routes"] > p') ) { + diag $route_error->content; } else { diag $self->tx->res->to_string; } From 4ff3f07f9ad85d80c7b3343fc9cb55b922699d5b Mon Sep 17 00:00:00 2001 From: Finn Date: Tue, 20 Mar 2018 18:54:55 +0000 Subject: [PATCH 9/9] fixed transaction test for updating and deleting --- .../LocalLoop/Controller/Api/Transactions.pm | 2 +- t/api/transactions.t | 40 ++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/lib/Pear/LocalLoop/Controller/Api/Transactions.pm b/lib/Pear/LocalLoop/Controller/Api/Transactions.pm index e2c4c18..84bb0da 100644 --- a/lib/Pear/LocalLoop/Controller/Api/Transactions.pm +++ b/lib/Pear/LocalLoop/Controller/Api/Transactions.pm @@ -161,7 +161,7 @@ sub delete_recurring { return $c->render( json => { success => Mojo::JSON->true, - message => 'Recurring Transaction Delete Successfully', + message => 'Recurring Transaction Deleted Successfully', }); } diff --git a/t/api/transactions.t b/t/api/transactions.t index 849a2a8..1cd62f4 100644 --- a/t/api/transactions.t +++ b/t/api/transactions.t @@ -38,8 +38,6 @@ my $session_key = $framework->login({ password => 'abc123', }); -use Data::Dumper; - $t->post_ok('/api/outgoing-transactions' => json => { session_key => $session_key, }) @@ -50,6 +48,36 @@ $t->post_ok('/api/outgoing-transactions' => json => { ->json_has('/transactions/1/value') ->json_has('/transactions/1/purchase_time'); +my $test_purchase_time = "2017-08-14T11:29:07.965+01:00"; + +$t->post_ok('/api/recurring-transactions' => json => { + session_key => $session_key, + id => 1, + apply_time => $test_purchase_time, + essential => "false", + value => 5, + recurring_period => 'daily', + }) + ->status_is(200)->or($framework->dump_error) + ->json_is({ + success => Mojo::JSON->true, + message => 'Recurring Transaction Updated Successfully', + }); + +is $schema->resultset('TransactionRecurring')->count, 87; + +$t->post_ok('/api/recurring-transactions/delete' => json => { + session_key => $session_key, + id => 1, + }) + ->status_is(200)->or($framework->dump_error) + ->json_is({ + success => Mojo::JSON->true, + message => 'Recurring Transaction Deleted Successfully', + }); + +is $schema->resultset('TransactionRecurring')->count, 86; + sub create_random_transaction { my $buyer = shift; @@ -64,6 +92,14 @@ sub create_random_transaction { proof_image => 'a', purchase_time => $time, }); + $schema->resultset('TransactionRecurring')->create({ + buyer => $buyer_result, + seller => $seller_result, + value => 10, + start_time => $time, + essential => 1, + recurring_period => 'weekly', + }); } done_testing;