Add API message function

This commit is contained in:
Ben Goldsworthy 2020-11-08 15:05:53 +00:00
parent f57dc63277
commit 279127a6d4
2 changed files with 74 additions and 1 deletions

View file

@ -141,8 +141,8 @@ sub startup {
$api_public->post('/register')->to('api-register#post_register'); $api_public->post('/register')->to('api-register#post_register');
$api_public->post('/logout')->to('api-auth#post_logout'); $api_public->post('/logout')->to('api-auth#post_logout');
$api_public->post('/feedback')->to('api-feedback#post_feedback'); $api_public->post('/feedback')->to('api-feedback#post_feedback');
$api_public->post('/add-device-token')->to('api-devices#add_token');
$api_public->post('/send-message')->to('api-sendmessage#post_message'); $api_public->post('/send-message')->to('api-sendmessage#post_message');
#$api_public->post('/send-message')->to('api-sendmessage#post_message');
# Private, must be authenticated api routes # Private, must be authenticated api routes
my $api = $api_public->under('/')->to('api-auth#auth'); my $api = $api_public->under('/')->to('api-auth#auth');

View file

@ -1,5 +1,10 @@
package Pear::LocalLoop::Controller::Api::Sendmessage; package Pear::LocalLoop::Controller::Api::Sendmessage;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use LWP::UserAgent;
use JSON;
use Mojo::JWT;
use Mojo::File;
use Carp;
has error_messages => sub { has error_messages => sub {
return { return {
@ -13,6 +18,46 @@ has error_messages => sub {
}; };
}; };
=begin comment
Credit: Peter Scott/StackOverflow
https://stackoverflow.com/a/53357961/4580273
Credit: jeffez/StackOverflow
https://stackoverflow.com/q/56556438/4580273
=cut
my $jwt = create_jwt_from_path_and_scopes('./localspend-47012.json', 'email https://www.googleapis.com/auth/compute');
my $ua = LWP::UserAgent->new();
my $bearer_token = $ua->post('https://www.googleapis.com/oauth2/v4/token',
{
'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
'assertion' => $jwt
}
);
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;
}
sub post_message { sub post_message {
my $c = shift; my $c = shift;
@ -27,6 +72,34 @@ sub post_message {
return $c->api_validation_error if $validation->has_error; return $c->api_validation_error if $validation->has_error;
my $user = $user_rs->find({'email' => $validation->param('email')}); my $user = $user_rs->find({'email' => $validation->param('email')});
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");
$request->header('Content-Type' => 'application/json');
$request->content(JSON::encode_json ({
message => {
token => $user->param('token'),
notification => {
title => 'test',
body => 'test content'
},
webpush => {
headers => {
Urgency => 'high'
},
notification => {
body => 'test content',
requireInteraction => 'true'
}
}
}
}));
$ua->request($request);
=begin comment =begin comment
$c->schema->resultset('Feedback')->create({ $c->schema->resultset('Feedback')->create({
user => $user, user => $user,