- Clone all 5 Zonemaster component repos (LDNS, Engine, CLI, Backend, GUI) - Dockerfile.backend: 8-stage multi-stage build LDNS→Engine→CLI→Backend - Dockerfile.gui: Astro static build served via nginx - docker-compose.yml: backend (internal) + frontend (port 5353) - nginx.conf: root redirects to /es/, /api/ proxied to backend - zonemaster-gui/config.ts: defaultLanguage set to 'es' (Spanish) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
163 lines
2.8 KiB
Perl
163 lines
2.8 KiB
Perl
package Zonemaster::Backend::Error;
|
|
use Moose;
|
|
use Data::Dumper;
|
|
|
|
use overload '""' => \&as_string;
|
|
|
|
has 'message' => (
|
|
is => 'ro',
|
|
isa => 'Str',
|
|
required => 1,
|
|
);
|
|
|
|
has 'code' => (
|
|
is => 'ro',
|
|
isa => 'Int',
|
|
required => 1,
|
|
);
|
|
|
|
has 'data' => (
|
|
is => 'ro',
|
|
isa => 'Any',
|
|
default => undef,
|
|
);
|
|
|
|
sub as_hash {
|
|
my $self = shift;
|
|
my $error = {
|
|
code => $self->code,
|
|
message => $self->message,
|
|
error => ref($self),
|
|
};
|
|
$error->{data} = $self->data if defined $self->data;
|
|
return $error;
|
|
}
|
|
|
|
sub as_string {
|
|
my $self = shift;
|
|
my $str = sprintf "%s (code %d).", $self->message, $self->code;
|
|
if (defined $self->data) {
|
|
$str .= sprintf " Context: %s", $self->_data_dump;
|
|
}
|
|
return $str;
|
|
}
|
|
|
|
sub _data_dump {
|
|
my $self = shift;
|
|
local $Data::Dumper::Indent = 0;
|
|
local $Data::Dumper::Terse = 1;
|
|
my $data = Dumper($self->data);
|
|
$data =~ s/[\n\r]/ /g;
|
|
return $data ;
|
|
}
|
|
|
|
package Zonemaster::Backend::Error::Internal;
|
|
use Moose;
|
|
|
|
use overload '""' => \&as_string;
|
|
|
|
extends 'Zonemaster::Backend::Error';
|
|
|
|
has '+message' => (
|
|
default => 'Internal server error'
|
|
);
|
|
|
|
has '+code' => (
|
|
default => -32603
|
|
);
|
|
|
|
has 'reason' => (
|
|
isa => 'Str',
|
|
is => 'ro'
|
|
);
|
|
|
|
has 'method' => (
|
|
is => 'ro',
|
|
isa => 'Str',
|
|
builder => '_build_method'
|
|
);
|
|
|
|
sub _build_method {
|
|
my $s = 0;
|
|
while (my @c = caller($s)) {
|
|
$s ++;
|
|
last if $c[3] eq 'Moose::Object::new';
|
|
}
|
|
my @c = caller($s);
|
|
if ($c[3] =~ /^(.*)::handle_exception$/ ) {
|
|
@c = caller(++$s);
|
|
}
|
|
|
|
return $c[3];
|
|
}
|
|
|
|
sub as_string {
|
|
my $self = shift;
|
|
|
|
my $reason = $self->reason;
|
|
$reason =~ s/\s+/ /g;
|
|
$reason =~ s/^\s+|\s+$//g;
|
|
|
|
my $str = sprintf "Caught %s in the `%s` method: %s", ref($self), $self->method, $reason;
|
|
if (defined $self->data) {
|
|
$str .= sprintf " Context: %s", $self->_data_dump;
|
|
}
|
|
return $str;
|
|
}
|
|
|
|
around as_hash => sub {
|
|
my ($orig, $self) = @_;
|
|
|
|
my $hash = $self->$orig;
|
|
$hash->{reason} = $self->reason;
|
|
$hash->{method} = $self->method;
|
|
return $hash;
|
|
};
|
|
|
|
|
|
package Zonemaster::Backend::Error::ResourceNotFound;
|
|
use Moose;
|
|
|
|
extends 'Zonemaster::Backend::Error';
|
|
|
|
has '+message' => (
|
|
default => 'Resource not found'
|
|
);
|
|
|
|
has '+code' => (
|
|
default => -32000
|
|
);
|
|
|
|
package Zonemaster::Backend::Error::PermissionDenied;
|
|
use Moose;
|
|
|
|
extends 'Zonemaster::Backend::Error';
|
|
|
|
has '+message' => (
|
|
default => 'Permission denied'
|
|
);
|
|
|
|
has '+code' => (
|
|
default => -32001
|
|
);
|
|
|
|
package Zonemaster::Backend::Error::Conflict;
|
|
use Moose;
|
|
|
|
extends 'Zonemaster::Backend::Error';
|
|
|
|
has '+message' => (
|
|
default => 'Conflicting resource'
|
|
);
|
|
|
|
has '+code' => (
|
|
default => -32002
|
|
);
|
|
|
|
package Zonemaster::Backend::Error::JsonError;
|
|
use Moose;
|
|
|
|
extends 'Zonemaster::Backend::Error::Internal';
|
|
|
|
1;
|