App-Dochazka-REST
view release on metacpan or search on metacpan
lib/App/Dochazka/REST/Dispatch.pm view on Meta::CPAN
return 0;
}
$self->context->{'stashed_daterange'} = {
"begin" => $begin,
"end" => $end,
};
}
# second pass
return $CELL->status_ok( 'DOCHAZKA_HOLIDAYS_AND_WEEKENDS_IN_TSRANGE',
tsrange => $self->context->{'mapping'}->{'tsrange'},
payload => holidays_and_weekends( %{ $self->context->{'stashed_daterange'} } )
);
}
=head3 handler_param
Handler for 'param/:type/:param' resource.
=cut
sub handler_param {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_param, pass number $pass" );
# get parameters
my $method = $self->context->{'method'};
my $mapping = $self->context->{'mapping'};
my ( $type, $param );
if ( $mapping ) {
$type = $self->context->{'mapping'}->{'type'};
$param = $self->context->{'mapping'}->{'param'};
} else {
die "AAAHAHAHAAHAAHAAAAAAAA! no mapping?? in handler_param_get";
}
my $resource_name = $self->context->{'resource_name'};
my ( $bool, $param_obj );
if ( $type eq 'meta' ) {
$param_obj = $meta;
} elsif ( $type eq 'core' ) {
$param_obj = $core;
} elsif ( $type eq 'site' ) {
$param_obj = $site;
}
if ( ! $param_obj) {
$self->mrest_declare_status( code => '500', explanation => 'IMPROPER TYPE' );
return 0;
}
# first pass
if ( $pass == 1 ) {
$bool = $param_obj->exists( $param );
$bool = $bool ? 1 : 0;
$self->context->{'stash'}->{'param_value'} = $param_obj->get( $param ) if $bool;
return $bool;
}
# second pass
if ( $type ne 'meta' and $method =~ m/^(PUT)|(DELETE)$/ ) {
$self->mrest_declare_status( code => 400, explanation =>
'PUT and DELETE can be used with meta parameters only' );
return $fail;
}
if ( $method eq 'GET' ) {
return $CELL->status_ok( 'MREST_PARAMETER_VALUE', payload => {
$param => $self->context->{'stash'}->{'param_value'},
} );
} elsif ( $method eq 'PUT' ) {
$log->debug( "Request entity: " . Dumper( $self->context->{'request_entity'} ) );
return $param_obj->set( $param, $self->context->{'request_entity'} );
} elsif ( $method eq 'DELETE' ) {
delete $param_obj->{$param};
return $CELL->status_ok( 'MREST_PARAMETER_DELETED', payload => {
'type' => $type,
'param' => $param,
} );
}
}
=head3 handler_noop
Generalized handler for resources that don't do anything.
=cut
sub handler_noop {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_noop" );
# first pass
return 1 if $pass == 1;
# second pass
my $method = $self->context->{'method'};
my $resource_name = $self->context->{'resource_name'};
my $def = $resources->{$resource_name};
my $pl = {
'resource_name' => $resource_name,
'description' => $def->{$method}->{'description'},
'parent' => $def->{'parent'},
'children' => $def->{'children'},
};
return $CELL->status_ok( 'DISPATCH_NOOP',
payload => $pl
);
}
=head3
Handler for the C<session> resource.
=cut
sub handler_session {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_session" );
# first pass
return 1 if $pass == 1;
# second pass
my $session = $self->request->{'env'}->{'psgix.session'};
return $CELL->status_ok( 'DISPATCH_SESSION_DATA', payload => {
session => $session,
} );
}
lib/App/Dochazka/REST/Dispatch.pm view on Meta::CPAN
=head3 handler_post_activity_code
Handler for 'POST activity/code' resource. This is a little more complicated
because it can be either create or modify.
=cut
sub handler_post_activity_code {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_post_activity_code" );
# first pass
return 1 if $pass == 1;
# second pass
# - check that entity is kosher
my $status = shared_entity_check( $self, 'code' );
return $status unless $status->ok;
my $context = $self->context;
my $entity = $context->{'request_entity'};
# - create or modify?
my $code = $entity->{'code'};
my $act = shared_first_pass_lookup( $self, 'code', $code );
$self->nullify_declared_status;
# - perform the insert/update
if ( $act ) {
return shared_update_activity( $self, $act, $entity );
} else {
return shared_insert_activity( $self, $code, $entity );
}
}
=head3 handler_activity_aid
Handler for the 'activity/aid/:aid' resource.
=cut
sub handler_activity_aid {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_activity_aid" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
my $act = shared_first_pass_lookup( $self, 'AID', $context->{'mapping'}->{'aid'} );
return 0 unless $act;
$context->{'stashed_activity_object'} = $act;
return 1;
}
# second pass
if ( $context->{'method'} eq 'GET' ) {
return $CELL->status_ok( 'DISPATCH_ACTIVITY_FOUND',
payload => $context->{'stashed_activity_object'}
);
} elsif ( $context->{'method'} eq 'PUT' ) {
return shared_update_activity(
$self,
$context->{'stashed_activity_object'},
$context->{'request_entity'}
);
} elsif ( $context->{'method'} eq 'DELETE' ) {
return $context->{'stashed_activity_object'}->delete( $context );
}
return $CELL->status_crit("Aaaaaaaaaaahhh! Swallowed by the abyss" );
}
=head3 handler_get_activity_code
Handler for the 'GET activity/code/:code' resource.
=cut
sub handler_get_activity_code {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_get_activity_code" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
my $act = shared_first_pass_lookup( $self, 'code', $context->{'mapping'}->{'code'} );
return 0 unless $act;
$context->{'stashed_activity_object'} = $act;
return 1;
}
# second pass
return $CELL->status_ok( 'DISPATCH_ACTIVITY_FOUND',
payload => $context->{'stashed_activity_object'}
);
}
=head3 handler_delete_activity_code
Handler for the 'DELETE activity/code/:code' resource.
=cut
sub handler_delete_activity_code {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_delete_activity_code" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
my $act = shared_first_pass_lookup( $self, 'code', $context->{'mapping'}->{'code'} );
return 0 unless $act;
$context->{'stashed_activity_object'} = $act;
return 1;
}
# second pass
return $context->{'stashed_activity_object'}->delete( $context );
}
=head3 handler_put_activity_code
Handler for the 'PUT activity/code/:code' resource.
=cut
sub handler_put_activity_code {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_put_activity_code" );
my $context = $self->context;
# first pass
return 1 if ( $pass == 1 );
# second pass
# - create or modify?
my $code = $context->{'mapping'}->{'code'};
my $entity = $context->{'request_entity'};
if ( ! defined($entity) ) {
$self->mrest_declare_status( 'code' => 400, 'explanation' => 'Missing request entity' );
return $fail;
}
my $act = shared_first_pass_lookup( $self, 'code', $code );
$self->nullify_declared_status;
# - perform insert/update operation
if ( $act ) {
return shared_update_activity( $self, $act, $entity );
} else {
return shared_insert_activity( $self, $code, $entity );
}
}
=head2 Component handlers
=head3 handler_get_component_all
Handler for 'GET component/all'
=cut
sub handler_get_component_all {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_get_component_all" );
# first pass
return 1 if $pass == 1 ;
# second pass
return App::Dochazka::REST::Model::Component::get_all_components(
$self->context->{'dbix_conn'},
);
}
=head3 handler_post_component_cid
Handler for 'POST component/cid' resource.
lib/App/Dochazka/REST/Dispatch.pm view on Meta::CPAN
Handler for 'POST component/path' resource. This is a little more complicated
because it can be either create or modify.
=cut
sub handler_post_component_path {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_post_component_path" );
# first pass
return 1 if $pass == 1;
# second pass
# - check that entity is kosher
my $status = shared_entity_check( $self, 'path' );
return $status unless $status->ok;
my $context = $self->context;
my $entity = $context->{'request_entity'};
# - create or modify?
my $path = $entity->{'path'};
my $comp = shared_first_pass_lookup( $self, 'path', $path );
$self->nullify_declared_status;
# - perform the insert/update
if ( $comp ) {
return shared_update_component( $self, $comp, $entity );
} else {
my $status = shared_entity_check( $self, 'path', 'source', 'acl' );
return $status unless $status->ok;
return shared_insert_component( $self, $path, $entity );
}
}
=head3 handler_component_cid
Handler for the 'component/cid/:cid' resource.
=cut
sub handler_component_cid {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_component_cid" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
my $comp = shared_first_pass_lookup( $self, 'cid', $context->{'mapping'}->{'cid'} );
return 0 unless $comp;
$context->{'stashed_component_object'} = $comp;
return 1;
}
# second pass
if ( $context->{'method'} eq 'GET' ) {
return $CELL->status_ok( 'DISPATCH_COMPONENT_FOUND',
payload => $context->{'stashed_component_object'}
);
} elsif ( $context->{'method'} eq 'PUT' ) {
return shared_update_component(
$self,
$context->{'stashed_component_object'},
$context->{'request_entity'}
);
} elsif ( $context->{'method'} eq 'DELETE' ) {
return $context->{'stashed_component_object'}->delete( $context );
}
return $CELL->status_crit("Aaaabllaaaaaaahhh Component! Swallowed by the abyss" );
}
=head2 Employee handlers
=head3 handler_get_employee_count
Handler for 'GET employee/count/?:priv' resource.
=cut
sub handler_get_employee_count {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_get_employee_count" );
# first pass
return 1 if $pass == 1;
# second pass
my $result;
if ( my $priv = $self->context->{'mapping'}->{'priv'} ) {
$result = noof_employees_by_priv( $self->context->{'dbix_conn'}, lc $priv );
} else {
$result = noof_employees_by_priv( $self->context->{'dbix_conn'}, 'total' );
}
return $result;
}
=head3 handler_get_employee_list
Handler for 'GET employee/list/?:priv' resource.
=cut
sub handler_get_employee_list {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_get_employee_list" );
# first pass
return 1 if $pass == 1;
# second pass
my $result;
if ( my $priv = $self->context->{'mapping'}->{'priv'} ) {
$result = list_employees_by_priv( $self->context->{'dbix_conn'}, lc $priv );
} else {
$result = list_employees_by_priv( $self->context->{'dbix_conn'}, 'all' );
}
lib/App/Dochazka/REST/Dispatch.pm view on Meta::CPAN
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
$context->{'stashed_employee_object'} = $context->{'current'};
return 1;
}
# second pass
return $self->_handler_get_employee_full_pass2();
}
=head3 handler_get_employee_eid_full
Handler for GET requests on 'employee/eid/:eid/full'
=cut
sub handler_get_employee_eid_full {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_get_employee_eid_full" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
return shared_get_employee_pass1( $self, $pass, 'EID', $self->context->{'mapping'}->{'eid'} );
}
# second pass
return $self->_handler_get_employee_full_pass2();
}
=head3 handler_get_employee_nick_full
Handler for GET requests on 'employee/nick/:nick/full'
=cut
sub handler_get_employee_nick_full {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_get_employee_nick_full" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
return shared_get_employee_pass1( $self, $pass, 'nick', $self->context->{'mapping'}->{'nick'} );
}
# second pass
return $self->_handler_get_employee_full_pass2();
}
=head3 handler_put_employee_eid
Handler for 'PUT employee/eid/:eid' - can only be update.
=cut
sub handler_put_employee_eid {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_put_employee_eid" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
# determine if this is an insert or an update
my $emp = shared_first_pass_lookup( $self, 'EID', $self->context->{'mapping'}->{'eid'} );
return 0 unless $emp;
return 0 unless shared_employee_acl_part1( $self, $emp ); # additional ACL checks
$context->{'stashed_employee_object'} = $emp;
return 1;
}
# second pass
return $fail unless shared_employee_acl_part2( $self );
return shared_update_employee(
$self,
$context->{'stashed_employee_object'},
$context->{'request_entity'}
);
}
=head3 handler_post_employee_eid
Handler for 'POST employee/eid' - can only be update.
=cut
sub handler_post_employee_eid {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_post_employee_eid" );
my $context = $self->context;
# first pass
return 1 if $pass == 1;
# second pass
my ( $eid, $emp );
if ( $eid = $context->{'request_entity'}->{'eid'} ) {
$emp = shared_first_pass_lookup( $self, 'EID', $eid );
return $fail unless $emp;
return $fail unless shared_employee_acl_part1( $self, $emp ); # additional ACL checks
return $fail unless shared_employee_acl_part2( $self );
} else {
$self->mrest_declare_status( code => 400,
explanation => 'DISPATCH_PROP_MISSING_IN_ENTITY', args => [ 'eid' ],
);
return $fail;
}
return shared_update_employee(
$self,
$emp,
$context->{'request_entity'}
);
}
=head3 handler_put_employee_nick
Handler for 'PUT employee/nick/:nick' - a little complicated because it can
be insert or update, depending on whether or not the employee exists.
=cut
sub handler_put_employee_nick {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_put_employee_nick" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
# determine if this is an insert or an update
my $emp = shared_first_pass_lookup( $self, 'nick', $self->context->{'mapping'}->{'nick'} );
if ( $emp ) {
$context->{'put_employee_func'} = 'update_employee';
} else {
$context->{'put_employee_func'} = 'insert_employee';
}
return 0 unless shared_employee_acl_part1( $self, $emp ); # additional ACL checks
$context->{'stashed_employee_object'} = $emp;
$self->nullify_declared_status;
return 1;
}
# second pass
my $func = $context->{'put_employee_func'};
$log->debug( "PUT employee function is $func - " );
if ( $func eq 'update_employee' ) {
return $fail unless shared_employee_acl_part2( $self );
} elsif ( $func eq 'insert_employee' ) {
$context->{'request_entity'}->{'nick'} = $context->{'mapping'}->{'nick'};
} else {
die "AAAAAAAAAAAAGAGGGGGGGGAAAHAHAAHHHH!";
}
return $iue_dispatch{$func}->(
$self,
$context->{'stashed_employee_object'},
$context->{'request_entity'}
);
}
=head3 handler_post_employee_nick
Handler for 'POST employee/nick' - a little complicated because it can
be insert or update, depending on whether or not the employee exists.
=cut
sub handler_post_employee_nick {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_post_employee_nick" );
my $context = $self->context;
# first pass
return 1 if $pass == 1;
# second pass
my ( $nick, $emp, $func );
if ( $nick = $context->{'request_entity'}->{'nick'} ) {
$emp = shared_first_pass_lookup( $self, 'nick', $nick );
$func = $emp ? 'update_employee' : 'insert_employee';
return $fail unless shared_employee_acl_part1( $self, $emp ); # additional ACL checks
$self->nullify_declared_status;
} else {
$self->mrest_declare_status( code => 400,
explanation => 'DISPATCH_PROP_MISSING_IN_ENTITY', args => [ 'nick' ],
);
return $fail;
}
if ( $func eq 'update_employee' ) {
delete $context->{'request_entity'}->{'nick'};
return $fail unless shared_employee_acl_part2( $self );
} elsif ( $func eq 'insert_employee' ) {
$log->info( "Ready to insert new employee $nick" );
} else {
die "AAAAAAAAAAAAGAGGGGGGGGAAAHAHAAHHHH!";
}
die "AAGAGAGAGGGGGGGGG self is undef" unless defined $self;
return $iue_dispatch{$func}->(
$self,
$emp,
$context->{'request_entity'}
);
lib/App/Dochazka/REST/Dispatch.pm view on Meta::CPAN
sub handler_get_employee_eid {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_get_employee_eid" );
return shared_get_employee( $self, $pass, 'EID', $self->context->{'mapping'}->{'eid'} );
}
=head3 _ldap_sync_pass1
=cut
sub _ldap_sync_pass1 {
my ( $self, $emp ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::_ldap_sync_pass1" );
my $status = $emp->ldap_sync();
$log->debug( "ldap_sync status: " . Dumper( $status ) );
if ( $status->not_ok ) {
if ( $status->code eq 'DOCHAZKA_LDAP_SYSTEM_USER_NOSYNC' ) {
# system user - 403
$status->{'http_code'} = 403;
} else {
$status->{'http_code'} = 404;
}
$self->mrest_declare_status( $status );
return 0;
}
$self->context->{'stashed_employee_object'} = $emp;
return 1;
}
=head3 handler_get_employee_ldap
Handler for 'GET employee/nick/:nick/ldap' resource.
=cut
sub handler_get_employee_ldap {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_get_employee_ldap" );
my $context = $self->context;
my $nick = $context->{'mapping'}->{'nick'};
if ( $pass == 1 ) {
my $emp = App::Dochazka::REST::Model::Employee->spawn(
'nick' => $nick,
'sync' => 1,
);
return $self->_ldap_sync_pass1( $emp );
}
return $CELL->status_ok( 'DOCHAZKA_LDAP_LOOKUP', payload => $context->{'stashed_employee_object'} );
}
=head3 handler_put_employee_ldap
Handler for 'PUT employee/nick/:nick/ldap' resource.
=cut
sub handler_put_employee_ldap {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_put_employee_ldap" );
my $context = $self->context;
$log->debug( "mapping " . Dumper( $context->{'mapping'} ) );
my $nick = $context->{'mapping'}->{'nick'};
my $status;
# first pass
if ( $pass == 1 ) {
# determine if this is an insert or an update
my $emp = shared_first_pass_lookup( $self, 'nick', $nick );
$self->nullify_declared_status;
return 0 unless shared_employee_acl_part1( $self, $emp ); # additional ACL checks
if ( $emp ) {
$context->{'put_employee_func'} = 'update_employee';
} else {
$context->{'put_employee_func'} = 'insert_employee';
$emp = App::Dochazka::REST::Model::Employee->spawn( 'nick' => $nick );
}
$emp->sync( 1 );
return $self->_ldap_sync_pass1( $emp );
}
# second pass
my $emp = $context->{'stashed_employee_object'};
my $func = $context->{'put_employee_func'};
if ( $func eq 'update_employee' ) {
$log->debug( "Updating employee from LDAP" );
$status = $emp->update( $context );
} elsif ( $func eq 'insert_employee' ) {
$log->debug( "Inserting new employee from LDAP" );
$status = $emp->insert( $context );
} else {
die "AAAAAAAAAAAAGAGGGGGGGGAAAHAHAAHHHH!";
}
return $status;
}
=head3 handler_get_employee_minimal
Handler for 'GET employee/eid/:eid/minimal' resource.
Handler for 'GET employee/nick/:nick/minimal' resource.
Handler for 'GET employee/sec_id/:sec_id/minimal' resource.
=cut
sub handler_get_employee_minimal {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_get_employee_minimal" );
if ( $pass == 1 ) {
lib/App/Dochazka/REST/Dispatch.pm view on Meta::CPAN
# - additional ACL check
if (
! acl_check_is_me( $self, 'eid' => $int->eid ) and
! acl_check_is_my_report( $self, 'eid' => $int->eid )
)
{
$self->mrest_declare_status( code => 403, explanation => "DISPATCH_KEEP_TO_YOURSELF" );
return 0;
}
$context->{'stashed_interval_object'} = $int;
return 1;
}
# second pass
my $int = $context->{'stashed_interval_object'};
my $method = $context->{'method'};
if ( $method eq 'GET' ) {
return $CELL->status_ok( 'DISPATCH_INTERVAL_FOUND', payload => $int );
}
die "AAGAGAGGGGGGGGGGHHGHGHKD! method is " . ( $method || "undef" );
}
=head3 handler_interval_iid
Handler for 'interval/iid/:iid' resource.
=cut
sub handler_interval_iid {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__. "::handler_interval_iid" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
# - get IID
my $iid = $self->context->{'mapping'}->{'iid'};
return 0 unless $iid;
# - is there an interval with this IID?
my $int = shared_first_pass_lookup( $self, 'IID', $iid );
return 0 unless $int;
# - additional ACL check
if ( ! acl_check_is_me( $self, 'eid' => $int->eid ) ) {
$self->mrest_declare_status( code => 403, explanation => "DISPATCH_KEEP_TO_YOURSELF" );
return 0;
}
$context->{'stashed_interval_object'} = $int;
return 1;
}
# second pass
my $int = $context->{'stashed_interval_object'};
my $method = $context->{'method'};
if ( $method =~ m/^(PUT)|(POST)$/ ) {
return shared_update_intlock( $self, $int, $context->{'request_entity'} );
} elsif ( $method eq 'DELETE' ) {
return $int->delete( $context );
}
die "AAGAGAGGGGGGGGGGHHGHGHKD! method is " . ( $method || "undef" );
}
=head3 handler_get_interval_summary
Handler for "GET interval/summary/eid/:eid/:tsrange"
=cut
sub handler_get_interval_summary {
my ( $self, $pass ) = @_;
$log->debug("Reached " . __PACKAGE__ . "::handler_get_interval_summary" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
my $rv = $self->_handler_intlock( 'Summary', 'eid', $pass );
return 0 unless $rv;
}
return $context->{'stashed_attendance_status'};
}
=head2 Lock handlers
=head3 handler_lock_new
Handler for 'POST lock/new'
=cut
sub handler_lock_new {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__. "::handler_lock_new" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
$context->{'post_is_create'} = 1;
return 1;
}
# second pass
my $status = shared_entity_check( $self, 'intvl' );
return $fail if $status->not_ok;
if ( check_acl_context( $context )->not_ok ) {
$self->mrest_declare_status( code => 403, explanation => 'DISPATCH_KEEP_TO_YOURSELF' );
return $fail;
}
lib/App/Dochazka/REST/Dispatch.pm view on Meta::CPAN
! acl_check_is_my_report( $self, 'eid' => $lock->eid )
)
{
$self->mrest_declare_status( code => 403, explanation => "DISPATCH_KEEP_TO_YOURSELF" );
return 0;
}
$context->{'stashed_lock_object'} = $lock;
return 1;
}
# second pass
my $lock = $context->{'stashed_lock_object'};
my $method = $context->{'method'};
if ( $method eq 'GET' ) {
return $CELL->status_ok( 'DISPATCH_LOCK_FOUND', payload => $lock );
}
die "AAGAGAGGGGGGGGGGHHGHGHKD! method is " . ( $method || "undef" );
}
=head3 handler_lock_lid
Handler for 'lock/lid/:lid' resource.
=cut
sub handler_lock_lid {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__. "::handler_lock_lid" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
# - get LID
my $lid = $self->context->{'mapping'}->{'lid'};
return 0 unless $lid;
# - is there a lock with this LID?
my $lock = shared_first_pass_lookup( $self, 'LID', $lid );
return 0 unless $lock;
# - additional ACL check
if (
! acl_check_is_me( $self, 'eid' => $lock->eid )
)
{
$self->mrest_declare_status( code => 403, explanation => "DISPATCH_KEEP_TO_YOURSELF" );
return 0;
}
$context->{'stashed_lock_object'} = $lock;
return 1;
}
# second pass
my $lock = $context->{'stashed_lock_object'};
my $method = $context->{'method'};
if ( $method =~ m/^(PUT)|(POST)$/ ) {
return shared_update_intlock( $self, $lock, $context->{'request_entity'} );
} elsif ( $method eq 'DELETE' ) {
return $lock->delete( $context );
}
die "AAGAGAGGGGGGGGGGHHGHGHKD! method is " . ( $method || "undef" );
}
=head2 Priv handlers
=head3 handler_priv_get_eid
=cut
sub handler_priv_get_eid {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . ":handler_priv_get_eid" );
my $eid = $self->context->{'mapping'}->{'eid'};
return shared_get_privsched( $self, 'priv', $pass, 'EID', $eid );
}
=head3 handler_priv_get_nick
=cut
sub handler_priv_get_nick {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . ":handler_priv_get_nick" );
my $nick = $self->context->{'mapping'}->{'nick'};
return shared_get_privsched( $self, 'priv', $pass, 'nick', $nick );
}
=head3 handler_priv_get_self
=cut
sub handler_priv_get_self {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . ":handler_priv_get_self" );
return shared_get_privsched( $self, 'priv', $pass, 'EID', $self->context->{'current'}->{'eid'} );
}
=head2 Schedule handlers
=head3 schedule_all
Works for both 'GET schedule/all' and 'GET schedule/all/disabled'
=cut
sub handler_schedule_all {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::handler_schedule_all" );
# first pass
if ( $pass == 1 ) {
lib/App/Dochazka/REST/Dispatch.pm view on Meta::CPAN
} elsif ( $status->code eq 'DOCHAZKA_SCHEDULE_UPDATE_OK' ) {
$self->context->{'create_path'} = '.../schedule/shid/' . $sched->sid;
$code = 'DISPATCH_SCHEDULE_UPDATE_OK';
$log->info( "POST schedule/new: Existing schedule updated" );
} elsif ( $status->code eq 'DOCHAZKA_SCHEDULE_INSERT_OK' ) {
$self->context->{'create_path'} = '.../schedule/shid/' . $sched->sid;
$code = 'DISPATCH_SCHEDULE_INSERT_OK';
$log->info( "POST schedule/new: New schedule inserted" );
} else {
die "AGGHGHG! could not handle App::Dochazka::REST::Model::Schedule->insert status: "
. Dumper( $status );
}
} else {
$self->mrest_declare_status( code => 500, explanation =>
"schedule/new: Model/Schedule.pm->insert failed: " . $status->text );
$intvls->delete( $context->{'dbix_conn'} );
return $fail;
}
#
# delete the schedintvls object
$status = $intvls->delete( $context->{'dbix_conn'} ); # schedintvls is not audited
if ( $status->not_ok ) {
$self->mrest_declare_status( code => 500, explanation => "Could not delete schedintvls: " . $status->text );
return $fail;
}
$log->info( "schedule/new: scratch intervals deleted" );
#
# success
return $CELL->status_ok( $code, payload => $sched->TO_JSON );
}
=head3 handler_get_schedule_sid
Handler for '/schedule/sid/:sid'
=cut
sub handler_get_schedule_sid {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . ":handler_get_schedule_sid" );
# first pass
if ( $pass == 1 ) {
my $sched = shared_first_pass_lookup( $self, 'SID', $self->context->{'mapping'}->{'sid'} );
return 0 unless $sched;
$self->context->{'stashed_schedule_object'} = $sched;
return 1;
}
# second pass
return $CELL->status_ok(
'DISPATCH_SCHEDULE_FOUND',
payload => $self->context->{'stashed_schedule_object'},
);
}
=head3 handler_put_schedule_sid
Handler for 'PUT schedule/sid/:sid'
=cut
sub handler_put_schedule_sid {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . ":handler_put_schedule_sid" );
my $context = $self->context;
my $sid = $context->{'mapping'}->{'sid'};
# first pass
if ( $pass == 1 ) {
my $sched = shared_first_pass_lookup( $self, 'SID', $sid );
return 0 unless $sched;
$context->{'stashed_schedule_object'} = $sched;
return 1;
}
# run the update operation
return shared_update_schedule(
$self,
$context->{'stashed_schedule_object'},
$context->{'request_entity'}
);
}
=head3 handler_delete_schedule_sid
Handler for '/schedule/sid/:sid'
=cut
sub handler_delete_schedule_sid {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . ":handler_delete_schedule_sid" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
return $self->handler_get_schedule_sid( $pass );
}
# second pass
return $context->{'stashed_schedule_object'}->delete( $context );
}
=head3 handler_get_schedule_scode
Handler for '/schedule/scode/:scode'
=cut
sub handler_get_schedule_scode {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . ":handler_get_schedule_scode" );
# first pass
if ( $pass == 1 ) {
my $sched = shared_first_pass_lookup( $self, 'scode', $self->context->{'mapping'}->{'scode'} );
return 0 unless $sched;
$self->context->{'stashed_schedule_object'} = $sched;
return 1;
}
# second pass
return $CELL->status_ok(
'DISPATCH_SCHEDULE_FOUND',
payload => $self->context->{'stashed_schedule_object'},
);
}
=head3 handler_put_schedule_scode
Handler for 'PUT schedule/scode/:scode'
=cut
sub handler_put_schedule_scode {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . ":handler_put_schedule_scode" );
my $context = $self->context;
my $scode = $context->{'mapping'}->{'scode'};
# first pass
if ( $pass == 1 ) {
my $sched = shared_first_pass_lookup( $self, 'scode', $scode );
return 0 unless $sched;
$context->{'stashed_schedule_object'} = $sched;
return 1;
}
# run the update operation
return shared_update_schedule(
$self,
$context->{'stashed_schedule_object'},
$context->{'request_entity'}
);
}
=head3 handler_delete_schedule_scode
Handler for '/schedule/scode/:scode'
=cut
sub handler_delete_schedule_scode {
my ( $self, $pass ) = @_;
$log->debug( "Entering " . __PACKAGE__ . ":handler_delete_schedule_scode" );
my $context = $self->context;
# first pass
if ( $pass == 1 ) {
return $self->handler_get_schedule_scode( $pass );
}
# second pass
return $context->{'stashed_schedule_object'}->delete( $context );
}
=head2 Helper functions
=head3 _first_pass_always_exists
Boilerplate code for use in handlers of resources that always exist
=cut
sub _first_pass_always_exists {
my ( $self, $pass ) = @_;
( run in 0.946 second using v1.01-cache-2.11-cpan-13bb782fe5a )