diff --git a/lib/NGCP/Panel/Controller/API/PbxDeviceModelImages.pm b/lib/NGCP/Panel/Controller/API/PbxDeviceModelImages.pm index 9ca8c80e91..231a501ddd 100644 --- a/lib/NGCP/Panel/Controller/API/PbxDeviceModelImages.pm +++ b/lib/NGCP/Panel/Controller/API/PbxDeviceModelImages.pm @@ -1,18 +1,15 @@ package NGCP::Panel::Controller::API::PbxDeviceModelImages; -use NGCP::Panel::Utils::Generic qw(:all); use Sipwise::Base; +use NGCP::Panel::Utils::Generic qw(:all); -use boolean qw(true); -use Data::HAL qw(); -use Data::HAL::Link qw(); -use HTTP::Headers qw(); -use HTTP::Status qw(:constants); +use parent qw/NGCP::Panel::Role::Entities NGCP::Panel::Role::API::PbxDeviceModelImages NGCP::Panel::Role::API::PbxDeviceModels/; -require Catalyst::ActionRole::ACL; -require Catalyst::ActionRole::CheckTrailingSlash; -require NGCP::Panel::Role::HTTPMethods; -require Catalyst::ActionRole::RequireSSL; +__PACKAGE__->set_config(); + +sub config_allowed_roles { + return [qw/admin reseller subscriberadmin subscriber/]; +} sub allowed_methods{ return [qw/OPTIONS/]; @@ -36,64 +33,6 @@ sub query_params { ]; } -use parent qw/Catalyst::Controller NGCP::Panel::Role::API::PbxDeviceModelImages NGCP::Panel::Role::API::PbxDeviceModels/; - -sub resource_name{ - return 'pbxdevicemodelimages'; -} -sub dispatch_path{ - return '/api/pbxdevicemodelimages/'; -} -sub relation{ - return 'http://purl.org/sipwise/ngcp-api/#rel-pbxdevicemodelimages'; -} - -__PACKAGE__->config( - action => { - map { $_ => { - ACLDetachTo => '/api/root/invalid_user', - AllowedRole => [qw/admin reseller subscriberadmin subscriber/], - Args => 0, - Does => [qw(ACL CheckTrailingSlash RequireSSL)], - Method => $_, - Path => __PACKAGE__->dispatch_path, - } } @{ __PACKAGE__->allowed_methods }, - }, -); - -sub gather_default_action_roles { - my ($self, %args) = @_; my @roles = (); - push @roles, 'NGCP::Panel::Role::HTTPMethods' if $args{attributes}->{Method}; - return @roles; -} - -sub auto :Private { - my ($self, $c) = @_; - - $self->set_body($c); - #$self->log_request($c); - return 1; -} - -sub OPTIONS :Allow { - my ($self, $c) = @_; - my $allowed_methods = $self->allowed_methods_filtered($c); - $c->response->headers(HTTP::Headers->new( - Allow => join(', ', @{ $allowed_methods }), - Accept_Post => 'application/hal+json; profile=http://purl.org/sipwise/ngcp-api/#rel-'.$self->resource_name, - )); - $c->response->content_type('application/json'); - $c->response->body(JSON::to_json({ methods => $allowed_methods })."\n"); - return; -} - -sub end : Private { - my ($self, $c) = @_; - - $self->log_response($c); - return; -} - 1; # vim: set tabstop=4 expandtab: diff --git a/lib/NGCP/Panel/Controller/API/PbxDeviceModelImagesItem.pm b/lib/NGCP/Panel/Controller/API/PbxDeviceModelImagesItem.pm index 909f38e84b..e173217891 100644 --- a/lib/NGCP/Panel/Controller/API/PbxDeviceModelImagesItem.pm +++ b/lib/NGCP/Panel/Controller/API/PbxDeviceModelImagesItem.pm @@ -1,112 +1,55 @@ package NGCP::Panel::Controller::API::PbxDeviceModelImagesItem; +use Sipwise::Base; + use NGCP::Panel::Utils::Generic qw(:all); -use Sipwise::Base; +use parent qw/NGCP::Panel::Role::EntitiesItem NGCP::Panel::Role::API::PbxDeviceModelImages NGCP::Panel::Role::API::PbxDeviceModels/; -use HTTP::Headers qw(); use HTTP::Status qw(:constants); -use NGCP::Panel::Utils::ValidateJSON qw(); -require Catalyst::ActionRole::ACL; -require NGCP::Panel::Role::HTTPMethods; -require Catalyst::ActionRole::RequireSSL; +__PACKAGE__->set_config(); sub allowed_methods{ return [qw/GET OPTIONS HEAD/]; } -use parent qw/Catalyst::Controller NGCP::Panel::Role::API::PbxDeviceModelImages NGCP::Panel::Role::API::PbxDeviceModels/; - -sub resource_name{ - return 'pbxdevicemodelimages'; -} -sub dispatch_path{ - return '/api/pbxdevicemodelimages/'; -} -sub relation{ - return 'http://purl.org/sipwise/ngcp-api/#rel-pbxdevicemodelimages'; +sub config_allowed_roles { + return [qw/admin reseller subscriberadmin subscriber/]; } -__PACKAGE__->config( - action => { - map { $_ => { - ACLDetachTo => '/api/root/invalid_user', - AllowedRole => [qw/admin reseller subscriberadmin subscriber/], - Args => 1, - Does => [qw(ACL RequireSSL)], - Method => $_, - Path => __PACKAGE__->dispatch_path, - } } @{ __PACKAGE__->allowed_methods } - }, -); - -sub gather_default_action_roles { - my ($self, %args) = @_; my @roles = (); - push @roles, 'NGCP::Panel::Role::HTTPMethods' if $args{attributes}->{Method}; - return @roles; -} - -sub auto :Private { - my ($self, $c) = @_; - - $self->set_body($c); - $self->log_request($c); -} - -sub GET :Allow { - my ($self, $c, $id) = @_; - { - last unless $self->valid_id($c, $id); - my $item = $self->item_by_id($c, $id); - last unless $self->resource_exists($c, pbxdevicemodelimages => $item); - my $type = $c->req->param('type') // 'front'; - my $data; - my $ctype; - if($type eq 'mac') { - $data = $item->mac_image; - $ctype = $item->mac_image_type; - } else { - $data = $item->front_image; - $ctype = $item->front_image_type; - } - unless(defined $data) { - $self->error($c, HTTP_NOT_FOUND, "Image type '$type' is not uploaded"); - last; - } - - my $fext = $ctype; $fext =~ s/^.*?([a-zA-Z0-9]+)$/$1/; - my $fname = $item->vendor . ' ' . $item->model . ".$fext"; - $c->response->header ('Content-Disposition' => 'attachment; filename="' . $fname . '"'); - $c->response->content_type($ctype); - $c->response->body($data); +sub _set_config{ + my ($self, $method) = @_; + if($method && 'GET' eq $method){ + return { + ReturnContentType => 'binary', + }; + } + return { + log_response => 0, + }; +} + +sub get_item_binary_data{ + my($self, $c, $id, $item) = @_; + my $type = $c->req->param('type') // 'front'; + my $data; + my $mime_type; + if($type eq 'mac') { + $data = $item->mac_image; + $mime_type = $item->mac_image_type; + } else { + $data = $item->front_image; + $mime_type = $item->front_image_type; + } + unless(defined $data) { + $self->error($c, HTTP_NOT_FOUND, "Image type '$type' is not uploaded"); return; } - return; -} - -sub HEAD :Allow { - my ($self, $c, $id) = @_; - $c->forward(qw(GET)); - $c->response->body(q()); - return; -} - -sub OPTIONS :Allow { - my ($self, $c, $id) = @_; - my $allowed_methods = $self->allowed_methods_filtered($c); - $c->response->headers(HTTP::Headers->new( - Allow => join(', ', @{ $allowed_methods }), - Accept_Patch => 'application/json-patch+json', - )); - $c->response->content_type('application/json'); - $c->response->body(JSON::to_json({ methods => $allowed_methods })."\n"); - return; -} - -sub end : Private { - my ($self, $c) = @_; - #$self->log_response($c); + my $fext = $mime_type; + $fext =~ s/^.*?([a-zA-Z0-9]+)$/$1/; + my $filename = $item->vendor . ' ' . $item->model . ".$fext"; + return (\$data, $mime_type, $filename); } 1; diff --git a/lib/NGCP/Panel/Role/API.pm b/lib/NGCP/Panel/Role/API.pm index a83aca5f1d..1b208fd113 100644 --- a/lib/NGCP/Panel/Role/API.pm +++ b/lib/NGCP/Panel/Role/API.pm @@ -1203,6 +1203,9 @@ sub return_requested_type { $filename //= $self->item_name.''.$self->get_item_id($c, $item); $mime_type //= 'application/octet-stream' ; + if(!$data_ref){ + return; + } $c->response->header ('Content-Disposition' => 'attachment; filename="' . $filename . '"'); $c->response->content_type( $mime_type ); $c->response->body($$data_ref); diff --git a/lib/NGCP/Panel/Role/API/PbxDeviceModelImages.pm b/lib/NGCP/Panel/Role/API/PbxDeviceModelImages.pm index c62bbb2d34..5d0670eeab 100644 --- a/lib/NGCP/Panel/Role/API/PbxDeviceModelImages.pm +++ b/lib/NGCP/Panel/Role/API/PbxDeviceModelImages.pm @@ -5,6 +5,16 @@ use Sipwise::Base; use parent 'NGCP::Panel::Role::API'; +sub resource_name{ + return 'pbxdevicemodelimages'; +} +sub dispatch_path{ + return '/api/pbxdevicemodelimages/'; +} +sub relation{ + return 'http://purl.org/sipwise/ngcp-api/#rel-pbxdevicemodelimages'; +} + sub get_form { my ($self, $c) = @_; return; diff --git a/lib/NGCP/Panel/Role/EntitiesItem.pm b/lib/NGCP/Panel/Role/EntitiesItem.pm index 9b63de4176..87f67b61e5 100644 --- a/lib/NGCP/Panel/Role/EntitiesItem.pm +++ b/lib/NGCP/Panel/Role/EntitiesItem.pm @@ -28,6 +28,7 @@ sub set_config { Does => [qw(ACL RequireSSL)], Method => $_, Path => $self->dispatch_path, + ReturnContentType => 'application/json', %{$self->_set_config($_)}, } } @{ $self->allowed_methods } }, @@ -57,9 +58,14 @@ sub get { my $item = $self->item_by_id_valid($c, $id); last unless $item; my $header_accept = $c->request->header('Accept'); - if(defined $header_accept - && ($header_accept ne 'application/json') - && ($header_accept ne '*/*') + + if( ( defined $header_accept + && ($header_accept ne 'application/json') + && ($header_accept ne '*/*') + ) + || ( $self->config->{action}->{GET}->{ReturnContentType} + && $self->config->{action}->{GET}->{ReturnContentType} ne 'application/json' + ) ) { $self->return_requested_type($c,$id,$item); return;