Merge branch 'development' into finn/OrgDataAPI
This commit is contained in:
commit
b224182e61
35 changed files with 2151 additions and 175 deletions
|
@ -4,8 +4,8 @@ use Mojo::Base 'Mojolicious::Controller';
|
|||
has error_messages => sub {
|
||||
return {
|
||||
email => {
|
||||
required => { message => 'Email is required', status => 400 },
|
||||
in_resultset => { message => 'Change meeee', status => 400 },
|
||||
required => { message => 'Email is required or not registered', status => 400 },
|
||||
in_resultset => { message => 'Email is required or not registered', status => 400, error => "required" },
|
||||
},
|
||||
feedbacktext => {
|
||||
required => { message => 'Feedback is required', status => 400 },
|
||||
|
|
|
@ -9,18 +9,18 @@ has error_messages => sub {
|
|||
in_resultset => { message => 'Token invalid or has been used.', status => 401 },
|
||||
},
|
||||
name => {
|
||||
required => { message => 'No name sent or was blank.', status => 400 },
|
||||
required => { message => 'No organisation name sent or was blank.', status => 400 },
|
||||
},
|
||||
display_name => {
|
||||
required => { message => 'No name sent or was blank.', status => 400 },
|
||||
required => { message => 'No display name sent or was blank.', status => 400 },
|
||||
},
|
||||
full_name => {
|
||||
required => { message => 'No name sent or was blank.', status => 400 },
|
||||
required => { message => 'No full name sent or was blank.', status => 400 },
|
||||
},
|
||||
email => {
|
||||
required => { message => 'No email sent.', status => 400 },
|
||||
email => { message => 'Email is invalid.', status => 400 },
|
||||
not_in_resultset => { message => 'Email exists.', status => 403 },
|
||||
not_in_resultset => { message => 'Email already in use.', status => 403 },
|
||||
},
|
||||
postcode => {
|
||||
required => { message => 'No postcode sent.', status => 400 },
|
||||
|
@ -34,16 +34,16 @@ has error_messages => sub {
|
|||
in => { message => '"usertype" is invalid.', status => 400 },
|
||||
},
|
||||
year_of_birth => {
|
||||
required => { message => 'No year_of_birth sent.', status => 400 },
|
||||
number => { message => 'year_of_birth is invalid', status => 400 },
|
||||
gt_num => { message => 'year_of_birth must be within last 150 years', status => 400 },
|
||||
lt_num => { message => 'year_of_birth must be atleast 10 years ago', status => 400 },
|
||||
required => { message => 'No year of birth sent.', status => 400 },
|
||||
number => { message => 'year of birth is invalid', status => 400 },
|
||||
gt_num => { message => 'year of birth must be within last 150 years', status => 400 },
|
||||
lt_num => { message => 'year of birth must be atleast 10 years ago', status => 400 },
|
||||
},
|
||||
street_name => {
|
||||
required => { message => 'No street_name sent.', status => 400 },
|
||||
required => { message => 'No street name sent.', status => 400 },
|
||||
},
|
||||
town => {
|
||||
required => { message => 'No town sent.', status => 400 },
|
||||
required => { message => 'No town/city sent.', status => 400 },
|
||||
},
|
||||
};
|
||||
};
|
||||
|
|
|
@ -18,23 +18,23 @@ sub post_index {
|
|||
my $user = $c->stash->{api_user}->entity;
|
||||
|
||||
my $today_rs = $user->purchases->today_rs;
|
||||
my $today_sum = $today_rs->get_column('value')->sum;
|
||||
my $today_sum = $today_rs->get_column('value')->sum || 0;
|
||||
my $today_count = $today_rs->count;
|
||||
|
||||
my $week_rs = $user->purchases->week_rs;
|
||||
my $week_sum = $week_rs->get_column('value')->sum;
|
||||
my $week_sum = $week_rs->get_column('value')->sum || 0;
|
||||
my $week_count = $week_rs->count;
|
||||
|
||||
my $month_rs = $user->purchases->month_rs;
|
||||
my $month_sum = $month_rs->get_column('value')->sum;
|
||||
my $month_sum = $month_rs->get_column('value')->sum || 0;
|
||||
my $month_count = $month_rs->count;
|
||||
|
||||
my $user_rs = $user->purchases;
|
||||
my $user_sum = $user_rs->get_column('value')->sum;
|
||||
my $user_sum = $user_rs->get_column('value')->sum || 0;
|
||||
my $user_count = $user_rs->count;
|
||||
|
||||
my $global_rs = $c->schema->resultset('Transaction');
|
||||
my $global_sum = $global_rs->get_column('value')->sum;
|
||||
my $global_sum = $global_rs->get_column('value')->sum || 0;
|
||||
my $global_count = $global_rs->count;
|
||||
|
||||
my $leaderboard_rs = $c->schema->resultset('Leaderboard');
|
||||
|
@ -44,15 +44,15 @@ sub post_index {
|
|||
|
||||
return $c->render( json => {
|
||||
success => Mojo::JSON->true,
|
||||
today_sum => $today_sum || 0,
|
||||
today_sum => $today_sum / 100000,
|
||||
today_count => $today_count,
|
||||
week_sum => $week_sum || 0,
|
||||
week_sum => $week_sum / 100000,
|
||||
week_count => $week_count,
|
||||
month_sum => $month_sum || 0,
|
||||
month_sum => $month_sum / 100000,
|
||||
month_count => $month_count,
|
||||
user_sum => $user_sum || 0,
|
||||
user_sum => $user_sum / 100000,
|
||||
user_count => $user_count,
|
||||
global_sum => $global_sum || 0,
|
||||
global_sum => $global_sum / 100000,
|
||||
global_count => $global_count,
|
||||
user_position => defined $current_user_position ? $current_user_position->position : 0,
|
||||
});
|
||||
|
@ -91,6 +91,15 @@ sub post_leaderboards {
|
|||
|
||||
my @leaderboard_array = $today_values->all;
|
||||
|
||||
if ( $validation->param('type') =~ /total$/ ) {
|
||||
@leaderboard_array = (map {
|
||||
{
|
||||
%$_,
|
||||
value => $_->{value} / 100000,
|
||||
}
|
||||
} @leaderboard_array);
|
||||
}
|
||||
|
||||
my $current_user_position = $today_values->find({ entity_id => $c->stash->{api_user}->entity->id });
|
||||
|
||||
return $c->render( json => {
|
||||
|
|
|
@ -34,7 +34,7 @@ sub post_transaction_list_purchases {
|
|||
my @transaction_list = (
|
||||
map {{
|
||||
seller => $_->seller->name,
|
||||
value => $_->value,
|
||||
value => $_->value / 100000,
|
||||
purchase_time => $_->purchase_time,
|
||||
}} $transactions->all
|
||||
);
|
||||
|
|
|
@ -50,17 +50,17 @@ The postcode of an organisation, optional key. Used when transaction_Type is 3.
|
|||
has error_messages => sub {
|
||||
return {
|
||||
transaction_type => {
|
||||
required => { message => 'transaction_type is missing.', status => 400 },
|
||||
in => { message => 'transaction_type is not a valid value.', status => 400 },
|
||||
required => { message => 'transaction type is missing.', status => 400 },
|
||||
in => { message => 'transaction type is not a valid value.', status => 400 },
|
||||
},
|
||||
transaction_value => {
|
||||
required => { message => 'transaction_value is missing', status => 400 },
|
||||
number => { message => 'transaction_value does not look like a number', status => 400 },
|
||||
gt_num => { message => 'transaction_value cannot be equal to or less than zero', status => 400 },
|
||||
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 },
|
||||
},
|
||||
purchase_time => {
|
||||
required => { message => 'purchase_time is missing', status => 400 },
|
||||
is_full_iso_datetime => { message => 'purchase_time is in incorrect format', status => 400 },
|
||||
required => { message => 'purchase time is missing', status => 400 },
|
||||
is_full_iso_datetime => { message => 'purchase time is in incorrect format', status => 400 },
|
||||
},
|
||||
file => {
|
||||
required => { message => 'No file uploaded', status => 400 },
|
||||
|
@ -68,15 +68,18 @@ has error_messages => sub {
|
|||
filetype => { message => 'File must be of type image/jpeg', status => 400 },
|
||||
},
|
||||
organisation_id => {
|
||||
required => { message => 'organisation_id is missing', status => 400 },
|
||||
number => { message => 'organisation_id is not a number', status => 400 },
|
||||
in_resultset => { message => 'organisation_id does not exist in the database', status => 400 },
|
||||
required => { message => 'existing organisation ID is missing', status => 400 },
|
||||
number => { message => 'organisation ID is not a number', status => 400 },
|
||||
in_resultset => { message => 'organisation ID does not exist in the database', status => 400 },
|
||||
},
|
||||
organisation_name => {
|
||||
required => { message => 'organisation_name is missing', status => 400 },
|
||||
required => { message => 'organisation name is missing', status => 400 },
|
||||
},
|
||||
town => {
|
||||
required => { message => 'town/city is missing', status => 400 },
|
||||
},
|
||||
search_name => {
|
||||
required => { message => 'search_name is missing', status => 400 },
|
||||
required => { message => 'search name is missing', status => 400 },
|
||||
},
|
||||
postcode => {
|
||||
postcode => { message => 'postcode must be valid', status => 400 },
|
||||
|
@ -138,7 +141,7 @@ sub post_upload {
|
|||
# Unknown Organisation
|
||||
$validation->required('organisation_name');
|
||||
$validation->optional('street_name');
|
||||
$validation->optional('town');
|
||||
$validation->required('town');
|
||||
$validation->optional('postcode')->postcode;
|
||||
|
||||
return $c->api_validation_error if $validation->has_error;
|
||||
|
@ -175,7 +178,7 @@ sub post_upload {
|
|||
'sales',
|
||||
{
|
||||
buyer => $user->entity,
|
||||
value => $transaction_value,
|
||||
value => $transaction_value * 100000,
|
||||
( defined $file ? ( proof_image => $file ) : () ),
|
||||
purchase_time => $c->format_db_datetime($purchase_time),
|
||||
}
|
||||
|
|
|
@ -28,10 +28,10 @@ has error_messages => sub {
|
|||
required => { message => 'No password sent.', status => 400 },
|
||||
},
|
||||
street_name => {
|
||||
required => { message => 'No street_name sent.', status => 400 },
|
||||
required => { message => 'No street name sent.', status => 400 },
|
||||
},
|
||||
town => {
|
||||
required => { message => 'No town sent.', status => 400 },
|
||||
required => { message => 'No town/city sent.', status => 400 },
|
||||
},
|
||||
sector => {
|
||||
required => { message => 'No sector sent.', status => 400 },
|
||||
|
@ -39,22 +39,6 @@ has error_messages => sub {
|
|||
};
|
||||
};
|
||||
|
||||
sub post_day {
|
||||
my $c = shift;
|
||||
|
||||
my $validation = $c->validation;
|
||||
|
||||
$validation->input( $c->stash->{api_json} );
|
||||
|
||||
$validation->optional('day')->is_iso_datetime;
|
||||
|
||||
return $c->api_validation_error if $validation->has_error;
|
||||
|
||||
$c->render( json => {
|
||||
success => Mojo::JSON->true,
|
||||
});
|
||||
}
|
||||
|
||||
sub post_account {
|
||||
my $c = shift;
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ sub index {
|
|||
sales_last_30_days
|
||||
purchases_last_7_days
|
||||
purchases_last_30_days
|
||||
customers_range
|
||||
/ );
|
||||
|
||||
return $c->api_validation_error if $validation->has_error;
|
||||
|
@ -43,6 +44,40 @@ sub index {
|
|||
return $c->$graph_sub;
|
||||
}
|
||||
|
||||
sub graph_customers_range {
|
||||
my $c = shift;
|
||||
|
||||
my $validation = $c->validation;
|
||||
$validation->input( $c->stash->{api_json} );
|
||||
$validation->required('start')->is_iso_date;
|
||||
$validation->required('end')->is_iso_date;
|
||||
|
||||
return $c->api_validation_error if $validation->has_error;
|
||||
|
||||
my $entity = $c->stash->{api_user}->entity;
|
||||
|
||||
my $data = { labels => [], data => [] };
|
||||
my $start = $c->parse_iso_date( $validation->param('start') );
|
||||
my $end = $c->parse_iso_date( $validation->param('end') );
|
||||
|
||||
while ( $start <= $end ) {
|
||||
my $next_end = $start->clone->add( days => 1 );
|
||||
my $transactions = $entity->sales
|
||||
->search_between( $start, $next_end )
|
||||
->count;
|
||||
push @{ $data->{ labels } }, $c->format_iso_date( $start );
|
||||
push @{ $data->{ data } }, $transactions;
|
||||
$start->add( days => 1 );
|
||||
}
|
||||
|
||||
return $c->render(
|
||||
json => {
|
||||
success => Mojo::JSON->true,
|
||||
graph => $data,
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
sub graph_customers_last_7_days {
|
||||
my $c = shift;
|
||||
|
||||
|
@ -102,9 +137,9 @@ sub _sales_last_duration {
|
|||
my $transactions = $entity->sales
|
||||
->search_between( $start, $next_end )
|
||||
->get_column('value')
|
||||
->sum || 0;
|
||||
->sum || 0 + 0;
|
||||
push @{ $data->{ labels } }, $start->day_name;
|
||||
push @{ $data->{ data } }, $transactions;
|
||||
push @{ $data->{ data } }, $transactions / 100000;
|
||||
$start->add( days => 1 );
|
||||
}
|
||||
|
||||
|
@ -134,9 +169,9 @@ sub _purchases_last_duration {
|
|||
my $transactions = $entity->purchases
|
||||
->search_between( $start, $next_end )
|
||||
->get_column('value')
|
||||
->sum || 0;
|
||||
->sum || 0 + 0;
|
||||
push @{ $data->{ labels } }, $start->day_name;
|
||||
push @{ $data->{ data } }, $transactions;
|
||||
push @{ $data->{ data } }, $transactions / 100000;
|
||||
$start->add( days => 1 );
|
||||
}
|
||||
|
||||
|
|
|
@ -28,26 +28,32 @@ sub index {
|
|||
my $today_sales = $entity->sales->search_between( $today, $now );
|
||||
$data->{ today_sales_count } = $today_sales->count;
|
||||
$data->{ today_sales_total } = $today_sales->get_column('value')->sum || 0;
|
||||
$data->{ today_sales_total } /= 100000;
|
||||
|
||||
my $week_sales = $entity->sales->search_between( $week_ago, $today );
|
||||
$data->{ this_week_sales_count } = $week_sales->count;
|
||||
$data->{ this_week_sales_total } = $week_sales->get_column('value')->sum || 0;
|
||||
$data->{ this_week_sales_total } /= 100000;
|
||||
|
||||
my $month_sales = $entity->sales->search_between( $month_ago, $today );
|
||||
$data->{ this_month_sales_count } = $month_sales->count;
|
||||
$data->{ this_month_sales_total } = $month_sales->get_column('value')->sum || 0;
|
||||
$data->{ this_month_sales_total } /= 100000;
|
||||
|
||||
my $today_purchases = $entity->purchases->search_between( $today, $now );
|
||||
$data->{ today_purchases_count } = $today_purchases->count;
|
||||
$data->{ today_purchases_total } = $today_purchases->get_column('value')->sum || 0;
|
||||
$data->{ today_purchases_total } /= 100000;
|
||||
|
||||
my $week_purchases = $entity->purchases->search_between( $week_ago, $today );
|
||||
$data->{ this_week_purchases_count } = $week_purchases->count;
|
||||
$data->{ this_week_purchases_total } = $week_purchases->get_column('value')->sum || 0;
|
||||
$data->{ this_week_purchases_total } /= 100000;
|
||||
|
||||
my $month_purchases = $entity->purchases->search_between( $month_ago, $today );
|
||||
$data->{ this_month_purchases_count } = $month_purchases->count;
|
||||
$data->{ this_month_purchases_total } = $month_purchases->get_column('value')->sum || 0;
|
||||
$data->{ this_month_purchases_total } /= 100000;
|
||||
|
||||
return $c->render(
|
||||
json => {
|
||||
|
|
Reference in a new issue