2017-04-06 21:43:27 +00:00
package Pear::LocalLoop::Controller::Api::Upload ;
2017-02-24 19:27:43 +00:00
use Mojo::Base 'Mojolicious::Controller' ;
use Data::Dumper ;
2017-04-04 21:22:22 +00:00
= head2 post_upload
2017-04-20 11:33:56 +00:00
Takes a file upload , with a file key of 'file' , and a json string under the
2017-04-04 21:22:22 +00:00
'json' key .
The json string should be an object , with the following keys :
= over
2017-04-20 00:27:18 +00:00
= item * transaction_value
2017-04-04 21:22:22 +00:00
The value of the transaction
2017-04-20 00:27:18 +00:00
= item * transaction_type
2017-04-04 21:22:22 +00:00
Is a value of 1 , 2 , or 3 - depending on the type of transaction .
2017-04-20 00:27:18 +00:00
= item * organisation_id
2017-04-04 21:22:22 +00:00
2017-04-20 00:27:18 +00:00
An ID of a valid organisation . used when transaction_type is 1 or 2 .
2017-04-04 21:22:22 +00:00
2017-04-20 00:27:18 +00:00
= item * organisation_name
2017-04-04 21:22:22 +00:00
2017-04-20 00:27:18 +00:00
The name of an organisation . Used when transaction_type is 3 .
2017-04-04 21:22:22 +00:00
2017-04-20 00:27:18 +00:00
= item * street_name
2017-04-04 21:22:22 +00:00
2017-04-20 00:27:18 +00:00
The street of an organisation , optional key . Used when transaction_type is 3 .
2017-04-04 21:22:22 +00:00
2017-04-20 00:27:18 +00:00
= item * town
2017-04-04 21:22:22 +00:00
2017-04-20 00:27:18 +00:00
The village /town/ci ty of an organisation . Used when transaction_type is 3 .
2017-04-04 21:22:22 +00:00
2017-04-20 00:27:18 +00:00
= item * postcode
2017-02-24 19:27:43 +00:00
2017-04-20 00:27:18 +00:00
The postcode of an organisation , optional key . Used when transaction_Type is 3 .
2017-02-24 19:27:43 +00:00
2017-04-20 00:27:18 +00:00
= back
2017-02-24 19:27:43 +00:00
2017-04-20 00:27:18 +00:00
= cut
has error_messages = > sub {
return {
2017-04-20 11:33:56 +00:00
transaction_type = > {
required = > { message = > 'transaction_type is missing.' , status = > 400 } ,
in = > { message = > 'transaction_type is not a valid value.' , status = > 400 } ,
2017-02-24 19:27:43 +00:00
} ,
2017-04-20 11:33:56 +00:00
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 } ,
2017-02-24 19:27:43 +00:00
} ,
2017-04-20 11:33:56 +00:00
file = > {
2017-04-20 00:27:18 +00:00
required = > { message = > 'No file uploaded' , status = > 400 } ,
2017-04-20 13:02:30 +00:00
upload = > { message = > 'file key does not contain a file' , status = > 400 } ,
2017-04-20 12:58:45 +00:00
filetype = > { message = > 'File must be of type image/jpeg' , status = > 400 } ,
2017-02-24 19:27:43 +00:00
} ,
2017-04-20 11:33:56 +00:00
organisation_id = > {
required = > { message = > 'organisation_id is missing' , status = > 400 } ,
2017-04-20 00:27:18 +00:00
number = > { message = > 'organisation_id is not a number' , status = > 400 } ,
2017-04-20 11:33:56 +00:00
in_resultset = > { message = > 'organisation_id does not exist in the database' , status = > 400 } ,
2017-02-24 19:27:43 +00:00
} ,
2017-04-20 11:33:56 +00:00
organisation_name = > {
required = > { message = > 'organisation_name is missing' , status = > 400 } ,
2017-04-20 00:27:18 +00:00
} ,
} ;
} ;
2017-02-24 19:27:43 +00:00
2017-04-20 00:27:18 +00:00
sub post_upload {
my $ c = shift ;
my $ self = $ c ;
2017-02-24 19:27:43 +00:00
2017-04-20 00:27:18 +00:00
my $ user = $ c - > stash - > { api_user } ;
my $ validation = $ c - > validation ;
# Test for file before loading the JSON in to the validator
2017-04-20 12:58:45 +00:00
$ validation - > required ( 'file' ) - > upload - > filetype ( 'image/jpeg' ) ;
2017-04-20 00:27:18 +00:00
$ validation - > input ( $ c - > stash - > { api_json } ) ;
2017-04-20 11:33:56 +00:00
$ validation - > required ( 'transaction_value' ) - > number - > gt_num ( 0 ) ;
$ validation - > required ( 'transaction_type' ) - > in ( 1 , 2 , 3 ) ;
2017-04-20 00:27:18 +00:00
# First pass of required items
return $ c - > api_validation_error if $ validation - > has_error ;
2017-04-20 11:33:56 +00:00
my $ type = $ validation - > param ( 'transaction_type' ) ;
2017-04-20 00:27:18 +00:00
if ( $ type == 1 ) {
# Validated Organisation
my $ valid_org_rs = $ c - > schema - > resultset ( 'Organisation' ) ;
2017-04-20 21:17:13 +00:00
$ validation - > required ( 'organisation_id' ) - > number - > in_resultset ( 'id' , $ valid_org_rs ) ;
2017-04-20 00:27:18 +00:00
} elsif ( $ type == 2 ) {
# Unvalidated Organisation
my $ valid_org_rs = $ c - > schema - > resultset ( 'PendingOrganisation' ) - > search ( { usersubmitted_fk = > $ user - > id } ) ;
2017-04-20 11:33:56 +00:00
$ validation - > required ( 'organisation_id' ) - > number - > in_resultset ( 'pendingorganisationid' , $ valid_org_rs ) ;
2017-04-20 00:27:18 +00:00
} elsif ( $ type == 3 ) {
# Unknown Organisation
2017-04-20 11:33:56 +00:00
$ validation - > required ( 'organisation_name' ) ;
$ validation - > optional ( 'street_name' ) ;
2017-04-20 00:27:18 +00:00
$ validation - > optional ( 'town' ) ;
$ validation - > optional ( 'postcode' ) - > postcode ;
2017-02-24 19:27:43 +00:00
}
2017-04-20 00:27:18 +00:00
return $ c - > api_validation_error if $ validation - > has_error ;
2017-04-20 11:33:56 +00:00
my $ transaction_value = $ validation - > param ( 'transaction_value' ) ;
2017-04-20 00:27:18 +00:00
2017-04-20 12:58:45 +00:00
my $ file = $ validation - > param ( 'file' ) ;
2017-04-20 00:27:18 +00:00
2017-02-24 19:27:43 +00:00
my $ ext = '.jpg' ;
my $ uuid = Data::UUID - > new - > create_str ;
my $ filename = $ uuid . $ ext ;
2017-04-20 00:27:18 +00:00
if ( $ type == 1 ) {
# Validated organisation
$ c - > schema - > resultset ( 'Transaction' ) - > create ( {
buyeruserid_fk = > $ user - > id ,
2017-04-20 11:33:56 +00:00
sellerorganisationid_fk = > $ validation - > param ( 'organisation_id' ) ,
valuemicrocurrency = > $ transaction_value ,
2017-04-20 00:27:18 +00:00
proofimage = > $ filename ,
timedatesubmitted = > DateTime - > now ,
} ) ;
$ file - > move_to ( 'images/' . $ filename ) ;
} elsif ( $ type == 2 ) {
# Unvalidated Organisation
$ c - > schema - > resultset ( 'PendingTransaction' ) - > create ( {
buyeruserid_fk = > $ user - > id ,
2017-04-20 11:33:56 +00:00
pendingsellerorganisationid_fk = > $ validation - > param ( 'organisation_id' ) ,
valuemicrocurrency = > $ transaction_value ,
2017-04-20 00:27:18 +00:00
proofimage = > $ filename ,
timedatesubmitted = > DateTime - > now ,
} ) ;
$ file - > move_to ( 'images/' . $ filename ) ;
} elsif ( $ type == 3 ) {
2017-04-20 11:33:56 +00:00
my $ organisation_name = $ validation - > param ( 'organisation_name' ) ;
my $ street_name = $ validation - > param ( 'street_name' ) ;
2017-04-20 00:27:18 +00:00
my $ town = $ validation - > param ( 'town' ) ;
my $ postcode = $ validation - > param ( 'postcode' ) ;
my $ fullAddress = "" ;
2017-04-20 11:33:56 +00:00
if ( defined $ street_name && ! ( $ street_name =~ m/^\s*$/ ) ) {
$ fullAddress = $ street_name ;
2017-02-24 19:27:43 +00:00
}
2017-04-20 00:27:18 +00:00
if ( defined $ town && ! ( $ town =~ m/^\s*$/ ) ) {
if ( $ fullAddress eq "" ) {
$ fullAddress = $ town ;
2017-02-24 19:27:43 +00:00
}
else {
2017-04-20 00:27:18 +00:00
$ fullAddress = $ fullAddress . ", " . $ town ;
2017-02-24 19:27:43 +00:00
}
}
2017-04-20 00:27:18 +00:00
my $ pending_org = $ c - > schema - > resultset ( 'PendingOrganisation' ) - > create ( {
usersubmitted_fk = > $ user - > id ,
timedatesubmitted = > DateTime - > now ,
2017-04-20 11:33:56 +00:00
name = > $ organisation_name ,
2017-04-20 00:27:18 +00:00
fulladdress = > $ fullAddress ,
postcode = > $ postcode ,
} ) ;
$ c - > schema - > resultset ( 'PendingTransaction' ) - > create ( {
buyeruserid_fk = > $ user - > id ,
pendingsellerorganisationid_fk = > $ pending_org - > pendingorganisationid ,
2017-04-20 11:33:56 +00:00
valuemicrocurrency = > $ transaction_value ,
2017-04-20 00:27:18 +00:00
proofimage = > $ filename ,
timedatesubmitted = > DateTime - > now ,
} ) ;
$ file - > move_to ( 'images/' . $ filename ) ;
2017-02-24 19:27:43 +00:00
}
2017-04-20 00:27:18 +00:00
return $ self - > render ( json = > {
success = > Mojo::JSON - > true ,
message = > 'Upload Successful' ,
} ) ;
2017-02-24 19:27:43 +00:00
}
#TODO this should limit the number of responses returned, when location is implemented that would be the main way of filtering.
sub post_search {
my $ self = shift ;
my $ userId = $ self - > get_active_user_id ( ) ;
my $ json = $ self - > req - > json ;
if ( ! defined $ json ) {
$ self - > app - > log - > debug ( 'Path Error: file:' . __FILE__ . ', line: ' . __LINE__ ) ;
return $ self - > render ( json = > {
success = > Mojo::JSON - > false ,
message = > 'JSON is missing.' ,
} ,
status = > 400 , ) ; #Malformed request
}
my $ searchName = $ json - > { searchName } ;
if ( ! defined $ searchName ) {
$ self - > app - > log - > debug ( 'Path Error: file:' . __FILE__ . ', line: ' . __LINE__ ) ;
return $ self - > render ( json = > {
success = > Mojo::JSON - > false ,
message = > 'searchName is missing.' ,
} ,
status = > 400 , ) ; #Malformed request
}
#Is blank
elsif ( $ searchName =~ m/^\s*$/ ) {
$ self - > app - > log - > debug ( 'Path Error: file:' . __FILE__ . ', line: ' . __LINE__ ) ;
return $ self - > render ( json = > {
success = > Mojo::JSON - > false ,
message = > 'searchName is blank.' ,
} ,
status = > 400 , ) ; #Malformed request
}
#Currently ignored
#TODO implement further.
my $ searchLocation = $ json - > { searchLocation } ;
my @ validatedOrgs = ( ) ;
{
2017-04-04 23:45:08 +00:00
my $ statementValidated = $ self - > db - > prepare ( "SELECT OrganisationalId, Name, FullAddress, PostCode FROM Organisations WHERE UPPER( Name ) LIKE ?" ) ;
$ statementValidated - > execute ( '%' . uc $ searchName . '%' ) ;
2017-02-24 19:27:43 +00:00
while ( my ( $ id , $ name , $ address , $ postcode ) = $ statementValidated - > fetchrow_array ( ) ) {
push ( @ validatedOrgs , $ self - > create_hash ( $ id , $ name , $ address , $ postcode ) ) ;
}
}
2017-04-04 23:45:08 +00:00
$ self - > app - > log - > debug ( "Orgs: " . Dumper @ validatedOrgs ) ;
2017-02-24 19:27:43 +00:00
my @ unvalidatedOrgs = ( ) ;
{
2017-04-04 23:45:08 +00:00
my $ statementUnvalidated = $ self - > db - > prepare ( "SELECT PendingOrganisationId, Name, FullAddress, Postcode FROM PendingOrganisations WHERE UPPER( Name ) LIKE ? AND UserSubmitted_FK = ?" ) ;
$ statementUnvalidated - > execute ( '%' . uc $ searchName . '%' , $ userId ) ;
2017-02-24 19:27:43 +00:00
while ( my ( $ id , $ name , $ fullAddress , $ postcode ) = $ statementUnvalidated - > fetchrow_array ( ) ) {
push ( @ unvalidatedOrgs , $ self - > create_hash ( $ id , $ name , $ fullAddress , $ postcode ) ) ;
}
}
2017-04-04 23:45:08 +00:00
$ self - > app - > log - > debug ( "Non Validated Orgs: " . Dumper @ unvalidatedOrgs ) ;
2017-02-24 19:27:43 +00:00
$ self - > app - > log - > debug ( 'Path Success: file:' . __FILE__ . ', line: ' . __LINE__ ) ;
return $ self - > render ( json = > {
success = > Mojo::JSON - > true ,
unvalidated = > \ @ unvalidatedOrgs ,
validated = > \ @ validatedOrgs ,
} ,
status = > 200 , ) ;
}
1 ;