TT#47534 Implement api timesets upload/download

Change-Id: I9d83b19e9d5efee8cd360392e304d14e997a4712
changes/97/27297/14
Irina Peshinskaya 7 years ago
parent 9adf470adc
commit ec178cd8e4

@ -9,6 +9,14 @@ use NGCP::Panel::Utils::TimeSet;
__PACKAGE__->set_config({
allowed_roles => [qw/admin reseller/],
backward_allow_empty_upload => 1,
POST => {
'ContentType' => ['multipart/form-data','application/json'],
#'Uploads' => { 'calendarfile' => [NGCP::Panel::Utils::TimeSet::CALENDAR_MIME_TYPE] },
#perl -e 'use File::Type; my $ft = File::Type->new();print $ft->mime_type("/root/VMHost/data/test_from_form_1.ics");'
# =====> application/x-awk
'Uploads' => ['calendarfile'],
},
});
sub allowed_methods{
@ -38,19 +46,21 @@ sub query_params {
sub create_item {
my ($self, $c, $resource, $form, $process_extras) = @_;
my $schema = $c->model('DB');
my $tset;
my $timeset;
try {
# # no checks, they are in check_resource
$tset = NGCP::Panel::Utils::TimeSet::create_timeset( c => $c, resource => $resource );
# no checks, they are in check_resource
$timeset = NGCP::Panel::Utils::TimeSet::create_timeset(
c => $c,
resource => $resource,
);
} catch($e) {
$c->log->error("failed to create timeset: $e");
$self->error($c, HTTP_INTERNAL_SERVER_ERROR, "Failed to create timeset.");
return;
}
return $tset;
return $timeset;
}
1;

@ -11,7 +11,19 @@ __PACKAGE__->set_config({
Default => [qw/admin reseller/],
Journal => [qw/admin reseller/],
},
backward_allow_empty_upload => 1,
PATCH => { ops => [qw/add replace remove copy/] },
PUT => {
'ContentType' => ['multipart/form-data','application/json'],#,
#'Uploads' => {'calendarfile' => [NGCP::Panel::Utils::TimeSet::CALENDAR_MIME_TYPE]},
#perl -e 'use File::Type; my $ft = File::Type->new();print $ft->mime_type("/root/VMHost/data/test_from_form_1.ics");'
# =====> application/x-awk
'Uploads' => ['calendarfile'],
},
GET => {
#first element of array is default, if no accept header was recieved.
'ReturnContentType' => [ NGCP::Panel::Utils::TimeSet::CALENDAR_MIME_TYPE, 'application/json' ],
},
});
sub allowed_methods{
@ -27,6 +39,20 @@ sub get_journal_methods{
return [qw/handle_item_base_journal handle_journals_get handle_journalsitem_get handle_journals_options handle_journalsitem_options handle_journals_head handle_journalsitem_head/];
}
sub get_item_binary_data{
my($self, $c, $id, $item, $return_type) = @_;
#caller waits for: $data_ref,$mime_type,$filename
#while we will not strictly check Accepted header, if item can return only one type of the binary data
my $extension = mime_type_to_extension($return_type);
my $filename = NGCP::Panel::Utils::TimeSet::get_calendar_file_name(c => $c, timeset => $item ).'.'.$extension;
my $data_ref = NGCP::Panel::Utils::TimeSet::get_timeset_icalendar(
c => $c,
timeset => $item,
);
$$data_ref //= '';
return $data_ref, $return_type, $filename;
}
1;
# vim: set tabstop=4 expandtab:

@ -1,22 +1,12 @@
package NGCP::Panel::Form::TimeSet::API;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';
has_field 'id' => (
type => 'Hidden',
);
extends 'NGCP::Panel::Form::TimeSet::Reseller';
has_field 'reseller_id' => (
type => 'Integer',
required => 1,
);
has_field 'name' => (
type => 'Text',
label => 'Name',
required => 1,
);
has_field 'times' => (
type => 'Repeatable',
do_wrapper => 1,

@ -83,6 +83,8 @@ sub validate {
if ($c->user->roles eq 'admin') {
if ($self->field('reseller')) {
$reseller_id = $self->field('reseller')->value;
} elsif ($self->field('reseller_id')) { #api variant
$reseller_id = $self->field('reseller_id')->value;
} elsif ($c->stash->{reseller} && $c->stash->{reseller}->first) {
#strange, reseller interface keeps rs as reseller, not reseller_rs
$reseller_id = $c->stash->{reseller}->first->id;

@ -48,17 +48,38 @@ sub _item_rs {
sub resource_from_item {
my ($self, $c, $item, $form) = @_;
my $resource = NGCP::Panel::Utils::TimeSet::get_timeset(
c => $c, timeset => $item, date_mysql_format => 1);
c => $c, timeset => $item);#, date_mysql_format => 1
return $resource;
}
sub process_form_resource{
my($self,$c, $item, $old_resource, $resource, $form, $process_extras) = @_;
$resource->{times} = $form->values->{times}; # not taking times from get_valid_data, but from form values, to benefit from formhandler inflation
my ($resource_from_upload,$fails, $text_success);
#name probably will be taken from uploaded file
if($c->user->roles eq 'reseller') {
$resource->{reseller_id} = $c->user->reseller_id;
}
use Data::Dumper;
$c->log->debug(Dumper([$form->values->{times}]));
#events specification in the body json part has higher priority than in uploaded file
#now resource is data from json, lets take it
if ($resource->{times}) {
# not taking times from get_valid_data, but from form values, to benefit from formhandler inflation for DateTime fields
$resource->{times} = $form->values->{times};
}
if (!$resource->{times} || !$resource->{name}) {
my ($fails, $text_success);
#name may be taken from uploaded file
($resource, $fails, $text_success) = NGCP::Panel::Utils::TimeSet::timeset_resource(
c => $c,
resource => $resource,
);
}
return $resource;
}
# called automatically by POST (and manually by update_item if you want)
sub check_resource {
my($self, $c, $item, $old_resource, $resource, $form) = @_;

@ -127,9 +127,13 @@ sub timeset_resource {
#we have checked that $name is not empty in the form validation
$resource->{name} = $calendar_parsed->{name};
}
#data will be taken from the request parameters or cache
my($fails, $text_success);
($resource->{times}, $fails, $text_success) = NGCP::Panel::Utils::TimeSet::parse_calendar_events(c => $c);
#data taken from the request parameters or cache has higher priority
my($events, $fails, $text_success);
#empty array from json input will be not overwritten, only if json "times" was not set
if (!$resource->{times}) {
($events, $fails, $text_success) = NGCP::Panel::Utils::TimeSet::parse_calendar_events(c => $c);
$resource->{times} = $events;
}
return $resource;
}

@ -38,7 +38,9 @@ $test_machine->DATA_ITEM_STORE($fake_data->process('timesets'));
$test_machine->form_data_item( );
# create 3 new sound sets from DATA_ITEM
$test_machine->check_create_correct( 3, sub{ $_[0]->{name} .= $_[1]->{i}; } );
my $headers_old = $test_machine->set('HEADERS' => {'GET' => {'Accept' => 'application/json'}});
$test_machine->check_get2put();
$test_machine->set('HEADERS' => $headers_old);
$test_machine->check_bundle();
$test_machine->clear_test_data_all();

@ -248,6 +248,18 @@ has 'QUERY_PARAMS' =>(
default => '',
);
has 'HEADERS' =>(
is => 'rw',
isa => 'HashRef',
default => sub{{
'GET' => {},
'POST' => {},
'PUT' => {},
'PATCH' => {},
'DELETE' => {},
}},
);
has 'PAGE' =>(
is => 'rw',
isa => 'Str',
@ -787,12 +799,17 @@ sub request_process{
sub get_request_get{
my($self, $uri, $headers) = @_;
$headers ||= {};
$uri = $self->normalize_uri($uri);
my $headers_default = $self->HEADERS->{GET}->{$self->uri2collection($uri)};
$headers_default ||= $self->HEADERS->{GET} // {};
$headers ||= {};
my $req = HTTP::Request->new('GET', $uri);
foreach my $key (keys %$headers){
$req->header($key => $headers->{$key});
}
foreach my $key (keys %$headers_default){
$req->header($key => $headers_default->{$key});
}
return $req ;
}
@ -1785,6 +1802,13 @@ sub uri2location{
return $uri;
}
sub uri2collection{
my($self,$uri) = @_;
my $collection = $uri;
$collection =~s/^.*?\/api\/(.*?)\//$1/;
return $collection;
}
sub http_code_msg{
my($self,$code,$message,$res,$content, $check_message) = @_;
my $message_res;

Loading…
Cancel
Save