Move webhook database queries to Users model
This commit is contained in:
parent
0d108e4334
commit
209e291821
4 changed files with 92 additions and 74 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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">
|
||||||
|
|
Loading…
Reference in a new issue