diff --git a/lib/Urupam/API.pm b/lib/Urupam/API.pm new file mode 100644 index 0000000..8e776b2 --- /dev/null +++ b/lib/Urupam/API.pm @@ -0,0 +1,113 @@ +package Urupam::API; + +use Mojo::Base 'Mojolicious::Controller'; +use Urupam::Utils; + +sub shorten { + my $c = shift; + $c->render_later; + my $url_service = $c->url_service; + my $validator = $c->validator; + + my $json = $c->req->json; + unless ( defined $json && ref $json eq 'HASH' ) { + $c->render( + json => { error => 'Invalid JSON format' }, + status => 400 + ); + return; + } + + my $original_url = Urupam::Utils::sanitize_input( $json->{url} || '' ); + + unless ($original_url) { + $c->render( + json => { error => 'URL is required' }, + status => 400 + ); + return; + } + + $validator->validate_url_with_checks($original_url)->then( + sub { + my $sanitized_url = shift; + return $url_service->create_short_url($sanitized_url); + } + )->then( + sub { + my $short_code = shift; + 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 => $original_url + } + ); + } + )->catch( + sub { + my $err = shift; + $c->app->log->error("API URL validation/creation error: $err"); + my $status = $c->get_error_status($err); + my $sanitized_error = Urupam::Utils::sanitize_error_message($err); + $c->render( + json => { error => $sanitized_error }, + status => $status + ); + } + ); +} + +sub get_url { + my $c = shift; + $c->render_later; + 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) ) { + $c->render( + json => { error => 'Invalid short code format' }, + status => 400 + ); + return; + } + + $url_service->get_original_url($short_code)->then( + sub { + my $original_url = shift; + 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 + ); + } + } + )->catch( + sub { + my $err = shift; + $c->app->log->error("API URL retrieval error: $err"); + my $status = $c->get_error_status($err); + my $sanitized_error = Urupam::Utils::sanitize_error_message($err); + $c->render( + json => { error => $sanitized_error }, + status => $status + ); + } + ); +} + +1;