diff --git a/lib/Pear/LocalLoop.pm b/lib/Pear/LocalLoop.pm index 32814cf..33742aa 100644 --- a/lib/Pear/LocalLoop.pm +++ b/lib/Pear/LocalLoop.pm @@ -149,6 +149,7 @@ sub startup { $api->post('/user/account')->to('api-user#post_account_update'); $api->post('/user-history')->to('api-user#post_user_history'); $api->post('/stats')->to('api-stats#post_index'); + $api->post('/stats/category')->to('api-categories#post_category_list'); $api->post('/stats/customer')->to('api-stats#post_customer'); $api->post('/stats/leaderboard')->to('api-stats#post_leaderboards'); $api->post('/stats/leaderboard/paged')->to('api-stats#post_leaderboards_paged'); diff --git a/lib/Pear/LocalLoop/Controller/Api/Categories.pm b/lib/Pear/LocalLoop/Controller/Api/Categories.pm new file mode 100644 index 0000000..0509581 --- /dev/null +++ b/lib/Pear/LocalLoop/Controller/Api/Categories.pm @@ -0,0 +1,80 @@ +package Pear::LocalLoop::Controller::Api::Categories; +use Mojo::Base 'Mojolicious::Controller'; + +use List::Util qw/ max sum /; + +has error_messages => sub { + return { + type => { + required => { message => 'Type of Leaderboard Required', status => 400 }, + in_resultset => { message => 'Unrecognised Leaderboard Type', status => 400 }, + }, + }; +}; + +sub post_category_list { + my $c = shift; + + my $entity = $c->stash->{api_user}->entity; + + my $duration = DateTime::Duration->new( days => 30 ); + my $end = DateTime->today; + my $start = $end->clone->subtract_duration( $duration ); + + my $data = { days => [], category => [], value => [] }; + + my $dtf = $c->schema->storage->datetime_parser; + my $driver = $c->schema->storage->dbh->{Driver}->{Name}; + my $month_transaction_rs = $c->schema->resultset('ViewQuantisedTransactionCategory' . $driver)->search( + { + purchase_time => { + -between => [ + $dtf->format_datetime($start), + $dtf->format_datetime($end), + ], + }, + buyer_id => $entity->id, + }, + { + columns => [ + { + quantised => 'quantised_days', + count => \"COUNT(*)", + } + ], + group_by => 'quantised_days', + order_by => { '-asc' => 'quantised_days' }, + } + ); + + for ( $transaction_rs->all ) { + my $quantised = $c->db_datetime_parser->parse_datetime($_->get_column('quantised')); + push @{ $data->{ days } }, ($c->format_iso_datetime( $quantised ) || 0); + push @{ $data->{ category } }, ($_->get_column('category_id') || 0); + push @{ $data->{ value } }, ($_->get_column('value') || 0) / 100000; + } + + return $c->render( + json => { + success => Mojo::JSON->true, + graph => $data, + } + ); +} + +sub pg_or_sqlite { + my ( $c, $pg_sql, $sqlite_sql ) = @_; + + my $driver = $c->schema->storage->dbh->{Driver}->{Name}; + + if ( $driver eq 'Pg' ) { + return \$pg_sql; + } elsif ( $driver eq 'SQLite' ) { + return \$sqlite_sql; + } else { + $c->app->log->warn('Unknown Driver Used'); + return undef; + } +} + +1; diff --git a/lib/Pear/LocalLoop/Schema/Result/ViewQuantisedTransactionCategoryPg.pm b/lib/Pear/LocalLoop/Schema/Result/ViewQuantisedTransactionCategoryPg.pm new file mode 100644 index 0000000..2ae0445 --- /dev/null +++ b/lib/Pear/LocalLoop/Schema/Result/ViewQuantisedTransactionCategoryPg.pm @@ -0,0 +1,26 @@ +package Pear::LocalLoop::Schema::Result::ViewQuantisedTransactionCategoryPg; + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +__PACKAGE__->table_class('DBIx::Class::ResultSource::View'); +__PACKAGE__->table('view_quantised_transactions'); +__PACKAGE__->result_source_instance->is_virtual(1); + +__PACKAGE__->result_source_instance->view_definition( qq/ +SELECT "transactions.value", + "transactions.distance", + "transactions.purchase_time", + "transactions.buyer_id", + "transactions.seller_id", + "transaction_category.category_id", + DATE_TRUNC('hour', "transactions.purchase_time") AS "quantised_hours", + DATE_TRUNC('day', "transactions.purchase_time") AS "quantised_days", + DATE_TRUNC('week', "transactions.purchase_time") AS "quantised_weeks" + FROM "transactions" +LEFT JOIN "transaction_category" ON "transactions.id" = "transaction_category.transaction_id" +/); + +1; diff --git a/lib/Pear/LocalLoop/Schema/Result/ViewQuantisedTransactionCategorySQLite.pm b/lib/Pear/LocalLoop/Schema/Result/ViewQuantisedTransactionCategorySQLite.pm new file mode 100644 index 0000000..0b68497 --- /dev/null +++ b/lib/Pear/LocalLoop/Schema/Result/ViewQuantisedTransactionCategorySQLite.pm @@ -0,0 +1,26 @@ +package Pear::LocalLoop::Schema::Result::ViewQuantisedTransactionCategorySQLite; + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +__PACKAGE__->table_class('DBIx::Class::ResultSource::View'); +__PACKAGE__->table('view_quantised_transactions'); +__PACKAGE__->result_source_instance->is_virtual(1); + +__PACKAGE__->result_source_instance->view_definition( qq/ +SELECT "value", + "distance", + "purchase_time", + "buyer_id", + "seller_id", + "transaction_category.category_id", + DATETIME(STRFTIME('%Y-%m-%d %H:00:00',"purchase_time")) AS "quantised_hours", + DATETIME(STRFTIME('%Y-%m-%d 00:00:00',"purchase_time")) AS "quantised_days", + DATETIME(STRFTIME('%Y-%m-%d 00:00:00',"purchase_time", 'weekday 1')) AS "quantised_weeks" + FROM "transactions" +LEFT JOIN "transaction_category" ON "transactions.id" = "transaction_category.transaction_id" +/); + +1;