diff --git a/lib/Pear/LocalLoop.pm b/lib/Pear/LocalLoop.pm index dae393a..4a04c01 100644 --- a/lib/Pear/LocalLoop.pm +++ b/lib/Pear/LocalLoop.pm @@ -114,6 +114,8 @@ sub startup { $user_routes->get('/home')->to('root#home'); + $user_routes->post('/portal/upload')->to('portal#post_upload'); + $self->hook( before_dispatch => sub { my $self = shift; diff --git a/lib/Pear/LocalLoop/Controller/Portal.pm b/lib/Pear/LocalLoop/Controller/Portal.pm new file mode 100644 index 0000000..798dcd7 --- /dev/null +++ b/lib/Pear/LocalLoop/Controller/Portal.pm @@ -0,0 +1,140 @@ +package Pear::LocalLoop::Controller::Portal; +use Mojo::Base 'Mojolicious::Controller'; + +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 }, + }, + 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 }, + }, + file => { + required => { message => 'No file uploaded', status => 400 }, + upload => { message => 'file key does not contain a file', status => 400 }, + 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 }, + }, + organisation_name => { + required => { message => 'organisation_name is missing', status => 400 }, + }, + }; +}; + +sub post_upload { + my $c = shift; + + my $user = $c->current_user; + my $validation = $c->validation; + + $validation->required('file')->upload->filetype('image/jpeg'); + $validation->required('transaction_value')->number->gt_num(0); + $validation->required('transaction_type')->in( 1, 2, 3 ); + + # First pass of required items + return $c->api_validation_error if $validation->has_error; + + my $type = $validation->param('transaction_type'); + + if ( $type == 1 ) { + # Validated Organisation + my $valid_org_rs = $c->schema->resultset('Organisation'); + $validation->required('organisation_id')->number->in_resultset( 'organisationalid', $valid_org_rs ); + } elsif ( $type == 2 ) { + # Unvalidated Organisation + my $valid_org_rs = $c->schema->resultset('PendingOrganisation')->search({ usersubmitted_fk => $user->id }); + $validation->required('organisation_id')->number->in_resultset( 'pendingorganisationid', $valid_org_rs ); + } elsif ( $type == 3 ) { + # Unknown Organisation + $validation->required('organisation_name'); + $validation->optional('street_name'); + $validation->optional('town'); + $validation->optional('postcode')->postcode; + } + + return $c->api_validation_error if $validation->has_error; + + my $transaction_value = $validation->param('transaction_value'); + + my $file = $validation->param('file'); + + my $ext = '.jpg'; + my $uuid = Data::UUID->new->create_str; + my $filename = $uuid . $ext; + + if ( $type == 1 ) { + # Validated organisation + $c->schema->resultset('Transaction')->create({ + buyeruserid_fk => $user->id, + sellerorganisationid_fk => $validation->param('organisation_id'), + valuemicrocurrency => $transaction_value, + proofimage => $filename, + timedatesubmitted => DateTime->now, + }); + + $file->move_to('images/' . $filename); + } elsif ( $type == 2 ) { + # Unvalidated Organisation + $c->schema->resultset('PendingTransaction')->create({ + buyeruserid_fk => $user->id, + pendingsellerorganisationid_fk => $validation->param('organisation_id'), + valuemicrocurrency => $transaction_value, + proofimage => $filename, + timedatesubmitted => DateTime->now, + }); + + $file->move_to('images/' . $filename); + } elsif ( $type == 3 ) { + my $organisation_name = $validation->param('organisation_name'); + my $street_name = $validation->param('street_name'); + my $town = $validation->param('town'); + my $postcode = $validation->param('postcode'); + + my $fullAddress = ""; + + if ( defined $street_name && ! ($street_name =~ m/^\s*$/) ){ + $fullAddress = $street_name; + } + + if ( defined $town && ! ($town =~ m/^\s*$/) ){ + if ($fullAddress eq ""){ + $fullAddress = $town; + } + else{ + $fullAddress = $fullAddress . ", " . $town; + } + + } + + my $pending_org = $c->schema->resultset('PendingOrganisation')->create({ + usersubmitted_fk => $user->id, + timedatesubmitted => DateTime->now, + name => $organisation_name, + fulladdress => $fullAddress, + postcode => $postcode, + }); + + $c->schema->resultset('PendingTransaction')->create({ + buyeruserid_fk => $user->id, + pendingsellerorganisationid_fk => $pending_org->pendingorganisationid, + valuemicrocurrency => $transaction_value, + proofimage => $filename, + timedatesubmitted => DateTime->now, + }); + + $file->move_to('images/' . $filename); + } + return $c->render( json => { + success => Mojo::JSON->true, + message => 'Upload Successful', + }); +} + +1; diff --git a/public/static/user/css/main.css b/public/static/user/css/main.css new file mode 100644 index 0000000..91558d6 --- /dev/null +++ b/public/static/user/css/main.css @@ -0,0 +1,4 @@ +body { + background: whitesmoke; + padding-top: 70px; +} diff --git a/public/static/user/js/home.js b/public/static/user/js/home.js new file mode 100644 index 0000000..f42fd0d --- /dev/null +++ b/public/static/user/js/home.js @@ -0,0 +1,24 @@ +$(function() { + $('form#receipt-form').submit(function( event ) { + event.preventDefault(); + event.stopPropagation(); + + // Create new form data object with the contents of this form + var formData = new FormData(this); + + $.ajax({ + url: $(this).attr("action"), + type: 'POST', + data: formData, + success: function(data) { + alert(data); + }, + cache: false, + contentType: false, + processData: false + }); + + // Stop propogation of event + return false; + }); +}); diff --git a/templates/layouts/user.html.ep b/templates/layouts/user.html.ep index 96975a5..76f7dd3 100644 --- a/templates/layouts/user.html.ep +++ b/templates/layouts/user.html.ep @@ -7,11 +7,11 @@ - + - %= content_for 'css'; + %= stylesheet '/static/user/css/main.css';
- <%= content %> +