Move webhook database queries to Users model

This commit is contained in:
Daniel Friesel 2022-02-20 17:35:30 +01:00
parent 0d108e4334
commit 209e291821
No known key found for this signature in database
GPG key ID: 100D5BFB5166E005
4 changed files with 92 additions and 74 deletions

View file

@ -891,75 +891,11 @@ sub startup {
} }
); );
$self->helper(
'get_webhook' => sub {
my ( $self, $uid ) = @_;
$uid //= $self->current_user->{id};
my $res_h
= $self->pg->db->select( 'webhooks_str', '*',
{ user_id => $uid } )->hash;
$res_h->{latest_run} = epoch_to_dt( $res_h->{latest_run_ts} );
return $res_h;
}
);
$self->helper(
'set_webhook' => sub {
my ( $self, %opt ) = @_;
$opt{uid} //= $self->current_user->{id};
if ( $opt{token} ) {
$opt{token} =~ tr{\r\n}{}d;
}
my $res = $self->pg->db->insert(
'webhooks',
{
user_id => $opt{uid},
enabled => $opt{enabled},
url => $opt{url},
token => $opt{token}
},
{
on_conflict => \
'(user_id) do update set enabled = EXCLUDED.enabled, url = EXCLUDED.url, token = EXCLUDED.token, errored = null, latest_run = null, output = null'
}
);
}
);
$self->helper(
'mark_hook_status' => sub {
my ( $self, $uid, $url, $success, $text ) = @_;
if ( length($text) > 1000 ) {
$text = substr( $text, 0, 1000 ) . '…';
}
$self->pg->db->update(
'webhooks',
{
errored => $success ? 0 : 1,
latest_run => DateTime->now( time_zone => 'Europe/Berlin' ),
output => $text,
},
{
user_id => $uid,
url => $url
}
);
}
);
$self->helper( $self->helper(
'run_hook' => sub { 'run_hook' => sub {
my ( $self, $uid, $reason, $callback ) = @_; my ( $self, $uid, $reason, $callback ) = @_;
my $hook = $self->get_webhook($uid); my $hook = $self->users->get_webhook( uid => $uid );
if ( not $hook->{enabled} or not $hook->{url} =~ m{^ https?:// }x ) if ( not $hook->{enabled} or not $hook->{url} =~ m{^ https?:// }x )
{ {
@ -994,12 +930,20 @@ sub startup {
sub { sub {
my ($tx) = @_; my ($tx) = @_;
if ( my $err = $tx->error ) { if ( my $err = $tx->error ) {
$self->mark_hook_status( $uid, $hook->{url}, 0, $self->users->update_webhook_status(
"HTTP $err->{code} $err->{message}" ); uid => $uid,
url => $hook->{url},
success => 0,
text => "HTTP $err->{code} $err->{message}"
);
} }
else { else {
$self->mark_hook_status( $uid, $hook->{url}, 1, $self->users->update_webhook_status(
$tx->result->body ); uid => $uid,
url => $hook->{url},
success => 1,
text => $tx->result->body
);
} }
if ($callback) { if ($callback) {
&$callback(); &$callback();
@ -1009,7 +953,12 @@ sub startup {
)->catch( )->catch(
sub { sub {
my ($err) = @_; my ($err) = @_;
$self->mark_hook_status( $uid, $hook->{url}, 0, $err ); $self->users->update_webhook_status(
uid => $uid,
url => $hook->{url},
success => 0,
text => $err
);
if ($callback) { if ($callback) {
&$callback(); &$callback();
} }

View file

@ -378,13 +378,16 @@ sub insight {
sub webhook { sub webhook {
my ($self) = @_; my ($self) = @_;
my $hook = $self->get_webhook; my $uid = $self->current_user->{id};
my $hook = $self->users->get_webhook( uid => $uid );
if ( $self->param('action') and $self->param('action') eq 'save' ) { if ( $self->param('action') and $self->param('action') eq 'save' ) {
$hook->{url} = $self->param('url'); $hook->{url} = $self->param('url');
$hook->{token} = $self->param('token'); $hook->{token} = $self->param('token');
$hook->{enabled} = $self->param('enabled') // 0; $hook->{enabled} = $self->param('enabled') // 0;
$self->set_webhook( $self->users->set_webhook(
uid => $uid,
url => $hook->{url}, url => $hook->{url},
token => $hook->{token}, token => $hook->{token},
enabled => $hook->{enabled} enabled => $hook->{enabled}
@ -395,7 +398,7 @@ sub webhook {
sub { sub {
$self->render( $self->render(
'webhooks', 'webhooks',
hook => $self->get_webhook, hook => $self->users->get_webhook( uid => $uid ),
new_hook => 1 new_hook => 1
); );
} }

View file

@ -478,4 +478,70 @@ sub use_history {
} }
} }
sub get_webhook {
my ( $self, %opt ) = @_;
my $db = $opt{db} // $self->{pg}->db;
my $uid = $opt{uid};
my $res_h = $db->select( 'webhooks_str', '*', { user_id => $uid } )->hash;
$res_h->{latest_run} = DateTime->from_epoch(
epoch => $res_h->{latest_run_ts} // 0,
time_zone => 'Europe/Berlin',
locale => 'de-DE',
);
return $res_h;
}
sub set_webhook {
my ( $self, %opt ) = @_;
my $db = $opt{db} // $self->{pg}->db;
if ( $opt{token} ) {
$opt{token} =~ tr{\r\n}{}d;
}
my $res = $db->insert(
'webhooks',
{
user_id => $opt{uid},
enabled => $opt{enabled},
url => $opt{url},
token => $opt{token}
},
{
on_conflict => \
'(user_id) do update set enabled = EXCLUDED.enabled, url = EXCLUDED.url, token = EXCLUDED.token, errored = null, latest_run = null, output = null'
}
);
}
sub update_webhook_status {
my ( $self, %opt ) = @_;
my $db = $opt{db} // $self->{pg}->db;
my $uid = $opt{uid};
my $url = $opt{url};
my $success = $opt{success};
my $text = $opt{text};
if ( length($text) > 1000 ) {
$text = substr( $text, 0, 1000 ) . '…';
}
$db->update(
'webhooks',
{
errored => $success ? 0 : 1,
latest_run => DateTime->now( time_zone => 'Europe/Berlin' ),
output => $text,
},
{
user_id => $uid,
url => $url
}
);
}
1; 1;

View file

@ -35,7 +35,7 @@
% } % }
% my $acc = current_user(); % my $acc = current_user();
% my $hook = get_webhook(); % my $hook = users->get_webhook(uid => $acc->{id});
% my $traewelling = traewelling->get(uid => $acc->{id}); % my $traewelling = traewelling->get(uid => $acc->{id});
% my $use_history = users->use_history(uid => $acc->{id}); % my $use_history = users->use_history(uid => $acc->{id});
<div class="row"> <div class="row">