From af5a924ae38a8f07892b84db7fc16bbd87e22838 Mon Sep 17 00:00:00 2001 From: Kharec Date: Mon, 29 Dec 2025 15:31:43 +0100 Subject: [PATCH] refactor: add respond_once helper and refactor async handlers to use it --- lib/Urupam/App.pm | 95 ++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 39 deletions(-) diff --git a/lib/Urupam/App.pm b/lib/Urupam/App.pm index 7232c2b..26ff4e1 100644 --- a/lib/Urupam/App.pm +++ b/lib/Urupam/App.pm @@ -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 + ); + } ); } );