Compare commits
2 Commits
65570d3b6d
...
ab68257e74
| Author | SHA1 | Date | |
|---|---|---|---|
| ab68257e74 | |||
| 50a12816b1 |
113
lib/Urupam/API.pm
Normal file
113
lib/Urupam/API.pm
Normal file
@@ -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;
|
||||||
@@ -2,6 +2,10 @@ package Urupam::App;
|
|||||||
|
|
||||||
use Mojo::Base 'Mojolicious';
|
use Mojo::Base 'Mojolicious';
|
||||||
use Urupam::DB;
|
use Urupam::DB;
|
||||||
|
use Urupam::URL;
|
||||||
|
use Urupam::Validation;
|
||||||
|
use Urupam::Utils;
|
||||||
|
use Urupam::API;
|
||||||
|
|
||||||
sub startup {
|
sub startup {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
@@ -13,7 +17,44 @@ sub startup {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$self->helper(
|
||||||
|
url_service => sub {
|
||||||
|
my $c = shift;
|
||||||
|
$c->stash->{url_service} ||= Urupam::URL->new( db => $c->db );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
$self->helper(
|
||||||
|
validator => sub {
|
||||||
|
my $c = shift;
|
||||||
|
$c->stash->{validator} ||= Urupam::Validation->new;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
$self->helper(
|
||||||
|
get_error_status => sub {
|
||||||
|
my ( $c, $err ) = @_;
|
||||||
|
return Urupam::Utils::get_error_status($err);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
my $r = $self->routes;
|
my $r = $self->routes;
|
||||||
|
my $api = $r->under('/api');
|
||||||
|
$api->post('/shorten')->to(
|
||||||
|
cb => sub {
|
||||||
|
my $c = shift;
|
||||||
|
bless $c, 'Urupam::API';
|
||||||
|
$c->shorten;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
$api->get('/url')->to(
|
||||||
|
cb => sub {
|
||||||
|
my $c = shift;
|
||||||
|
bless $c, 'Urupam::API';
|
||||||
|
$c->get_url;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
$r->get('/')->to(
|
$r->get('/')->to(
|
||||||
cb => sub {
|
cb => sub {
|
||||||
my $c = shift;
|
my $c = shift;
|
||||||
|
|||||||
Reference in New Issue
Block a user