Files
Malin 8d4eaa1489 feat: add full Zonemaster stack with Docker and Spanish UI
- 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>
2026-04-21 08:19:24 +02:00

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;