refactor: add respond_once helper and refactor async handlers to use it

This commit is contained in:
2025-12-29 15:31:43 +01:00
parent 4730c577fa
commit af5a924ae3

View File

@@ -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; my $r = $self->routes;
$r->get('/health')->to( $r->get('/health')->to(
cb => sub { cb => sub {
my $c = shift; my $c = shift;
$c->render_later; $c->render_later;
my $responded = 0;
$c->db->ping->then( $c->db->ping->then(
sub { sub {
return if $responded; $c->respond_once(
$responded = 1; sub {
$c->render( $c->render(
json => { json => {
status => 'ok', status => 'ok',
version => $c->version version => $c->version
}
);
} }
); );
} }
)->catch( )->catch(
sub { sub {
my $err = shift; my $err = shift;
return if $responded; $c->respond_once(
$responded = 1; sub {
$c->app->log->error("Health check DB error: $err"); $c->app->log->error("Health check DB error: $err");
$c->render( $c->render(
json => { json => {
status => 'error', status => 'error',
error => 'Database connection failed' error => 'Database connection failed'
}, },
status => 503 status => 503
);
}
); );
} }
); );
@@ -99,7 +111,6 @@ sub startup {
cb => sub { cb => sub {
my $c = shift; my $c = shift;
$c->render_later; $c->render_later;
my $responded = 0;
my $short_code = $c->param('short_code') // ''; my $short_code = $c->param('short_code') // '';
my $url_service = $c->url_service; my $url_service = $c->url_service;
my $validator = $c->validator; my $validator = $c->validator;
@@ -107,11 +118,13 @@ sub startup {
unless ( $short_code unless ( $short_code
&& $validator->validate_short_code($short_code) ) && $validator->validate_short_code($short_code) )
{ {
return if $responded; $c->respond_once(
$responded = 1; sub {
$c->render( $c->render(
template => '404', template => '404',
status => 404 status => 404
);
}
); );
return; return;
} }
@@ -119,27 +132,31 @@ sub startup {
return $url_service->get_original_url($short_code)->then( return $url_service->get_original_url($short_code)->then(
sub { sub {
my $original_url = shift; my $original_url = shift;
return if $responded; $c->respond_once(
$responded = 1; sub {
if ($original_url) { if ($original_url) {
$c->redirect_to($original_url); $c->redirect_to($original_url);
} }
else { else {
$c->render( $c->render(
template => '404', template => '404',
status => 404 status => 404
); );
} }
}
);
} }
)->catch( )->catch(
sub { sub {
my $err = shift; my $err = shift;
return if $responded; $c->respond_once(
$responded = 1; sub {
$c->app->log->error("Redirect lookup error: $err"); $c->app->log->error("Redirect lookup error: $err");
$c->render( $c->render(
template => '500', template => '500',
status => 500 status => 500
);
}
); );
} }
); );