2020-11-01 18:06:11 +00:00
|
|
|
package Pear::LocalLoop::Controller::Api::Sendmessage;
|
|
|
|
use Mojo::Base 'Mojolicious::Controller';
|
2020-11-08 15:05:53 +00:00
|
|
|
use LWP::UserAgent;
|
|
|
|
use JSON;
|
2020-11-08 17:35:29 +00:00
|
|
|
use JSON::Parse 'parse_json';
|
2020-11-08 15:05:53 +00:00
|
|
|
use Mojo::JWT;
|
|
|
|
use Mojo::File;
|
|
|
|
use Carp;
|
2020-11-01 18:06:11 +00:00
|
|
|
|
|
|
|
has error_messages => sub {
|
2021-03-20 12:09:50 +00:00
|
|
|
return {
|
|
|
|
topic => {
|
|
|
|
required => { message => 'Topic is required', status => 400 },
|
|
|
|
},
|
|
|
|
sender => {
|
|
|
|
required => { message => 'Sender name is required', status => 400 },
|
|
|
|
in_resultset =>
|
|
|
|
{ message => 'Sender org not found', status => 400 },
|
|
|
|
},
|
|
|
|
messagetext => {
|
|
|
|
required => { message => 'Message is required', status => 400 },
|
|
|
|
},
|
|
|
|
};
|
2020-11-01 18:06:11 +00:00
|
|
|
};
|
|
|
|
|
2021-03-20 23:26:52 +00:00
|
|
|
# Credit: Peter Scott/StackOverflow https://stackoverflow.com/a/53357961/4580273
|
|
|
|
# Credit: jeffez/StackOverflow https://stackoverflow.com/q/56556438/4580273
|
2020-11-08 15:05:53 +00:00
|
|
|
|
2021-03-20 12:09:50 +00:00
|
|
|
my $jwt = create_jwt_from_path_and_scopes( './localspend-47012.json',
|
|
|
|
'email https://www.googleapis.com/auth/cloud-platform' );
|
2020-11-08 17:35:29 +00:00
|
|
|
|
2020-11-08 15:05:53 +00:00
|
|
|
my $ua = LWP::UserAgent->new();
|
|
|
|
|
2021-03-20 12:09:50 +00:00
|
|
|
my $response = $ua->post(
|
|
|
|
'https://www.googleapis.com/oauth2/v4/token',
|
|
|
|
{
|
|
|
|
'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
|
|
|
|
'assertion' => $jwt
|
|
|
|
}
|
2020-11-08 15:05:53 +00:00
|
|
|
);
|
|
|
|
|
2021-03-20 12:09:50 +00:00
|
|
|
my $bearer_token = parse_json( $response->content );
|
|
|
|
|
|
|
|
sub create_jwt_from_path_and_scopes {
|
|
|
|
my ( $path, $scope ) = @_;
|
|
|
|
croak("No path provided") if not defined $path;
|
|
|
|
croak("$path not available") if not -f $path;
|
|
|
|
my $json = decode_json( Mojo::File->new($path)->slurp );
|
|
|
|
croak("No Private key in $path") if not defined $json->{private_key};
|
|
|
|
croak("Not a service account") if $json->{type} ne 'service_account';
|
|
|
|
my $jwt = Mojo::JWT->new();
|
|
|
|
$jwt->algorithm('RS256');
|
|
|
|
$jwt->secret( $json->{private_key} );
|
|
|
|
|
|
|
|
$jwt->claims(
|
|
|
|
{
|
|
|
|
iss => $json->{client_email},
|
|
|
|
scope => $scope,
|
|
|
|
aud => 'https://www.googleapis.com/oauth2/v4/token',
|
|
|
|
iat => time(),
|
|
|
|
exp => time() + 3600
|
|
|
|
}
|
|
|
|
);
|
|
|
|
$jwt->set_iat(1);
|
|
|
|
return $jwt->encode;
|
2020-11-08 15:05:53 +00:00
|
|
|
}
|
|
|
|
|
2020-11-30 17:34:13 +00:00
|
|
|
sub get_topics {
|
2021-03-20 12:09:50 +00:00
|
|
|
my $c = shift;
|
|
|
|
|
|
|
|
my $topic_rs = $c->schema->resultset('Topic');
|
|
|
|
|
|
|
|
my @topics = (
|
|
|
|
map {
|
|
|
|
{
|
|
|
|
id => $_->id,
|
|
|
|
name => $_->name,
|
|
|
|
numberOfSubscribers =>
|
|
|
|
$_->search_related( 'device_subscriptions',
|
|
|
|
{ 'topic_id' => $_->id } )->count,
|
|
|
|
}
|
|
|
|
} $topic_rs->all
|
|
|
|
);
|
|
|
|
|
|
|
|
return $c->render(
|
|
|
|
json => {
|
|
|
|
success => Mojo::JSON->true,
|
|
|
|
topics => \@topics,
|
|
|
|
}
|
|
|
|
);
|
2020-11-30 17:34:13 +00:00
|
|
|
}
|
|
|
|
|
2020-11-01 18:06:11 +00:00
|
|
|
sub post_message {
|
2021-03-20 12:09:50 +00:00
|
|
|
my $c = shift;
|
|
|
|
|
|
|
|
my $validation = $c->validation;
|
|
|
|
$validation->input( $c->stash->{api_json} );
|
|
|
|
|
|
|
|
$validation->required('topic');
|
|
|
|
$validation->required('sender')
|
|
|
|
->in_resultset( 'name', $c->schema->resultset('Organisation') );
|
|
|
|
$validation->required('messagetext');
|
|
|
|
|
|
|
|
return $c->api_validation_error if $validation->has_error;
|
|
|
|
|
|
|
|
my $end_point =
|
|
|
|
"https://fcm.googleapis.com/v1/projects/localspend-47012/messages:send";
|
|
|
|
|
|
|
|
my $request = HTTP::Request->new( 'POST', $end_point );
|
|
|
|
$request->header(
|
|
|
|
'Authorization' => "Bearer $bearer_token->{access_token}" );
|
|
|
|
$request->header( 'Content-Type' => 'application/json' );
|
|
|
|
|
|
|
|
$request->content(
|
|
|
|
JSON::encode_json(
|
|
|
|
{
|
|
|
|
message => {
|
|
|
|
topic => $validation->param('topic'),
|
|
|
|
notification => {
|
|
|
|
title => $validation->param('sender'),
|
|
|
|
body => $validation->param('messagetext')
|
|
|
|
},
|
|
|
|
webpush => {
|
|
|
|
headers => {
|
|
|
|
urgency => 'very-low'
|
|
|
|
},
|
|
|
|
notification => {
|
|
|
|
title => $validation->param('sender'),
|
|
|
|
body => $validation->param('messagetext'),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
);
|
2020-11-08 15:05:53 +00:00
|
|
|
|
2021-03-20 12:09:50 +00:00
|
|
|
my $response = $ua->request($request);
|
2020-11-08 17:35:29 +00:00
|
|
|
|
2021-03-20 12:09:50 +00:00
|
|
|
if ( $response->is_success ) {
|
|
|
|
return $c->render(
|
|
|
|
json => {
|
|
|
|
success => Mojo::JSON->true,
|
|
|
|
message => 'Your message has been sent successfully!',
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
elsif ( $response->is_error ) {
|
|
|
|
return $c->render(
|
|
|
|
json => {
|
|
|
|
success => Mojo::JSON->false,
|
|
|
|
message => [ $response->decoded_content, $jwt, $bearer_token ],
|
|
|
|
error => 'message_error',
|
|
|
|
},
|
|
|
|
status => $response->code,
|
|
|
|
);
|
|
|
|
}
|
2020-11-01 18:06:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
1;
|