From 7005e0852af9e02f0ef3347c5f681c8b69316fd0 Mon Sep 17 00:00:00 2001 From: Kharec Date: Mon, 29 Dec 2025 15:31:59 +0100 Subject: [PATCH] refactor: use respond_once helper in async handlers --- lib/Urupam/API.pm | 133 +++++++++++++++++++++++++--------------------- 1 file changed, 73 insertions(+), 60 deletions(-) diff --git a/lib/Urupam/API.pm b/lib/Urupam/API.pm index 27758cd..43dfd31 100644 --- a/lib/Urupam/API.pm +++ b/lib/Urupam/API.pm @@ -6,17 +6,18 @@ use Urupam::Utils qw(sanitize_input get_error_status sanitize_error_message); sub shorten { my $c = shift; $c->render_later; - my $responded = 0; my $url_service = $c->url_service; my $validator = $c->validator; my $json = $c->req->json; unless ( defined $json && ref $json eq 'HASH' ) { - return if $responded; - $responded = 1; - $c->render( - json => { error => 'Invalid JSON format' }, - status => 400 + $c->respond_once( + sub { + $c->render( + json => { error => 'Invalid JSON format' }, + status => 400 + ); + } ); return; } @@ -24,11 +25,13 @@ sub shorten { my $original_url = sanitize_input( $json->{url} || '' ); unless ($original_url) { - return if $responded; - $responded = 1; - $c->render( - json => { error => 'URL is required' }, - status => 400 + $c->respond_once( + sub { + $c->render( + json => { error => 'URL is required' }, + status => 400 + ); + } ); return; } @@ -43,29 +46,34 @@ sub shorten { )->then( sub { my $short_code = shift; - return if $responded; - $responded = 1; - my $short_url = $c->url_for("/$short_code")->to_abs; - $c->render( - json => { - success => 1, - short_url => $short_url, - short_code => $short_code, - original_url => $normalized_url + $c->respond_once( + sub { + my $short_url = $c->url_for("/$short_code")->to_abs; + $c->render( + json => { + success => 1, + short_url => $short_url, + short_code => $short_code, + original_url => $normalized_url + } + ); } ); } )->catch( sub { my $err = shift; - return if $responded; - $responded = 1; - $c->app->log->error("API URL validation/creation error: $err"); - my $status = get_error_status($err); - my $sanitized_error = sanitize_error_message($err); - $c->render( - json => { error => $sanitized_error }, - status => $status + $c->respond_once( + sub { + $c->app->log->error( + "API URL validation/creation error: $err"); + my $status = get_error_status($err); + my $sanitized_error = sanitize_error_message($err); + $c->render( + json => { error => $sanitized_error }, + status => $status + ); + } ); } ); @@ -74,17 +82,18 @@ sub shorten { sub get_url { 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; unless ( $short_code && $validator->validate_short_code($short_code) ) { - return if $responded; - $responded = 1; - $c->render( - json => { error => 'Invalid short code format' }, - status => 400 + $c->respond_once( + sub { + $c->render( + json => { error => 'Invalid short code format' }, + status => 400 + ); + } ); return; } @@ -92,37 +101,41 @@ sub get_url { return $url_service->get_original_url($short_code)->then( sub { my $original_url = shift; - return if $responded; - $responded = 1; - if ($original_url) { - my $short_url = $c->url_for("/$short_code")->to_abs; - $c->render( - json => { - success => 1, - short_code => $short_code, - original_url => $original_url, - short_url => $short_url + $c->respond_once( + sub { + if ($original_url) { + my $short_url = $c->url_for("/$short_code")->to_abs; + $c->render( + json => { + success => 1, + short_code => $short_code, + original_url => $original_url, + short_url => $short_url + } + ); } - ); - } - else { - $c->render( - json => { error => 'Short code not found' }, - status => 404 - ); - } + else { + $c->render( + json => { error => 'Short code not found' }, + status => 404 + ); + } + } + ); } )->catch( sub { my $err = shift; - return if $responded; - $responded = 1; - $c->app->log->error("API URL retrieval error: $err"); - my $status = get_error_status($err); - my $sanitized_error = sanitize_error_message($err); - $c->render( - json => { error => $sanitized_error }, - status => $status + $c->respond_once( + sub { + $c->app->log->error("API URL retrieval error: $err"); + my $status = get_error_status($err); + my $sanitized_error = sanitize_error_message($err); + $c->render( + json => { error => $sanitized_error }, + status => $status + ); + } ); } );