refactor: add respond_once helper and refactor async handlers to use it
This commit is contained in:
@@ -37,36 +37,48 @@ sub startup {
|
||||
}
|
||||
);
|
||||
|
||||
$self->helper(
|
||||
respond_once => sub {
|
||||
my $c = shift;
|
||||
my $callback = shift;
|
||||
return if $c->rendered;
|
||||
$callback->($c);
|
||||
}
|
||||
);
|
||||
|
||||
my $r = $self->routes;
|
||||
|
||||
$r->get('/health')->to(
|
||||
cb => sub {
|
||||
my $c = shift;
|
||||
$c->render_later;
|
||||
my $responded = 0;
|
||||
$c->db->ping->then(
|
||||
sub {
|
||||
return if $responded;
|
||||
$responded = 1;
|
||||
$c->render(
|
||||
json => {
|
||||
status => 'ok',
|
||||
version => $c->version
|
||||
$c->respond_once(
|
||||
sub {
|
||||
$c->render(
|
||||
json => {
|
||||
status => 'ok',
|
||||
version => $c->version
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
)->catch(
|
||||
sub {
|
||||
my $err = shift;
|
||||
return if $responded;
|
||||
$responded = 1;
|
||||
$c->app->log->error("Health check DB error: $err");
|
||||
$c->render(
|
||||
json => {
|
||||
status => 'error',
|
||||
error => 'Database connection failed'
|
||||
},
|
||||
status => 503
|
||||
$c->respond_once(
|
||||
sub {
|
||||
$c->app->log->error("Health check DB error: $err");
|
||||
$c->render(
|
||||
json => {
|
||||
status => 'error',
|
||||
error => 'Database connection failed'
|
||||
},
|
||||
status => 503
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
@@ -99,7 +111,6 @@ sub startup {
|
||||
cb => sub {
|
||||
my $c = shift;
|
||||
$c->render_later;
|
||||
my $responded = 0;
|
||||
my $short_code = $c->param('short_code') // '';
|
||||
my $url_service = $c->url_service;
|
||||
my $validator = $c->validator;
|
||||
@@ -107,11 +118,13 @@ sub startup {
|
||||
unless ( $short_code
|
||||
&& $validator->validate_short_code($short_code) )
|
||||
{
|
||||
return if $responded;
|
||||
$responded = 1;
|
||||
$c->render(
|
||||
template => '404',
|
||||
status => 404
|
||||
$c->respond_once(
|
||||
sub {
|
||||
$c->render(
|
||||
template => '404',
|
||||
status => 404
|
||||
);
|
||||
}
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -119,27 +132,31 @@ sub startup {
|
||||
return $url_service->get_original_url($short_code)->then(
|
||||
sub {
|
||||
my $original_url = shift;
|
||||
return if $responded;
|
||||
$responded = 1;
|
||||
if ($original_url) {
|
||||
$c->redirect_to($original_url);
|
||||
}
|
||||
else {
|
||||
$c->render(
|
||||
template => '404',
|
||||
status => 404
|
||||
);
|
||||
}
|
||||
$c->respond_once(
|
||||
sub {
|
||||
if ($original_url) {
|
||||
$c->redirect_to($original_url);
|
||||
}
|
||||
else {
|
||||
$c->render(
|
||||
template => '404',
|
||||
status => 404
|
||||
);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
)->catch(
|
||||
sub {
|
||||
my $err = shift;
|
||||
return if $responded;
|
||||
$responded = 1;
|
||||
$c->app->log->error("Redirect lookup error: $err");
|
||||
$c->render(
|
||||
template => '500',
|
||||
status => 500
|
||||
$c->respond_once(
|
||||
sub {
|
||||
$c->app->log->error("Redirect lookup error: $err");
|
||||
$c->render(
|
||||
template => '500',
|
||||
status => 500
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user