App-Dochazka-REST
view release on metacpan or search on metacpan
lib/App/Dochazka/REST/Shared.pm view on Meta::CPAN
shared_employee_acl_part1
shared_employee_acl_part2
shared_update_activity
shared_update_component
shared_update_history
shared_insert_activity
shared_insert_component
shared_insert_interval
shared_insert_lock
shared_update_intlock
shared_process_quals
);
our %EXPORT_TAGS = ( ALL => [ @EXPORT_OK ] );
=head1 PACKAGE VARIABLES
The package variable C<%f_dispatch> is used in C<fetch_by_eid>, C<fetch_by_nick>,
and C<fetch_own>.
=cut
my %f_dispatch = (
"attendance" => \&App::Dochazka::REST::Model::Interval::fetch_by_eid_and_tsrange,
"lock" => \&App::Dochazka::REST::Model::Lock::fetch_by_eid_and_tsrange,
);
my %id_dispatch = (
"attendance" => "App::Dochazka::REST::Model::Interval",
"lock" => "App::Dochazka::REST::Model::Lock",
);
=head1 FUNCTIONS
=cut
=head2 shared_first_pass_lookup
Takes two scalar arguments, "key" and "value" and determines whether or not the
database contains an object answering to that description.
This should be used only for resources that require an exact match.
=cut
sub shared_first_pass_lookup {
my ( $d_obj, $key, $value ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::shared_first_pass_lookup with key $key, value $value" );
my $conn = $d_obj->context->{'dbix_conn'};
my ( $status, $thing );
if ( uc($key) eq 'AID' ) {
$thing = 'activity';
$status = App::Dochazka::REST::Model::Activity->load_by_aid( $conn, $value );
} elsif ( $key eq 'code' ) {
$thing = 'activity';
$status = App::Dochazka::REST::Model::Activity->load_by_code( $conn, $value );
} elsif ( uc($key) eq 'CID' ) {
$thing = 'component';
$status = App::Dochazka::REST::Model::Component->load_by_cid( $conn, $value );
} elsif ( $key eq 'path' ) {
$thing = 'component';
$status = App::Dochazka::REST::Model::Component->load_by_path( $conn, $value );
} elsif ( uc($key) eq 'EID' ) {
$thing = 'employee';
$status = App::Dochazka::REST::Model::Employee->load_by_eid( $conn, $value );
} elsif ( $key eq 'nick' ) {
$thing = 'employee';
$status = App::Dochazka::REST::Model::Employee->load_by_nick( $conn, $value );
} elsif ( $key eq 'sec_id' ) {
$thing = 'employee';
$status = App::Dochazka::REST::Model::Employee->load_by_sec_id( $conn, $value );
} elsif ( uc($key) eq 'IID' ) {
$thing = 'interval';
$status = App::Dochazka::REST::Model::Interval->load_by_iid( $conn, $value );
} elsif ( uc($key) eq 'LID' ) {
$thing = 'lock';
$status = App::Dochazka::REST::Model::Lock->load_by_lid( $conn, $value );
} elsif ( uc($key) eq 'PHID' ) {
$thing = 'privilege history record';
$status = App::Dochazka::REST::Model::Privhistory->load_by_phid( $conn, $value );
} elsif ( uc($key) eq 'SHID' ) {
$thing = 'schedule history record';
$status = App::Dochazka::REST::Model::Schedhistory->load_by_shid( $conn, $value );
} elsif ( uc($key) eq 'SID' ) {
$thing = 'schedule';
$status = App::Dochazka::REST::Model::Schedule->load_by_sid( $conn, $value );
} elsif ( $key eq 'scode' ) {
$thing = 'schedule';
$status = App::Dochazka::REST::Model::Schedule->load_by_scode( $conn, $value );
} else {
die "shared_first_pass_lookup could not do anything with key $key!";
}
if ( $status->level eq 'NOTICE' and $status->code eq 'DISPATCH_NO_RECORDS_FOUND' ) {
$d_obj->mrest_declare_status( code => 404,
explanation => 'DISPATCH_SEARCH_EMPTY',
args => [ $thing, "$key equals $value" ],
);
return;
}
if ( $status->not_ok ) {
$d_obj->mrest_declare_status( code => 500, explanation => $status->code,
args => $status->args
);
return;
}
return $status->payload;
}
=head2 shared_entity_check
Check request entity for presence of properties
=cut
sub shared_entity_check {
my ( $d_obj, @props ) = @_;
$log->debug( "Entering " . __PACKAGE__ . "::shared_entity_check with properties " .
lib/App/Dochazka/REST/Shared.pm view on Meta::CPAN
$d_obj->mrest_declare_status(
$CELL->status_err(
'DISPATCH_ACL_VIOLATION',
args => [ $cp, "update $prop property" ],
http_code => 403,
uri_path => $context->{'uri_path'},
)
);
return 0;
}
return 1;
}
$d_obj->mrest_declare_status(
$CELL->status_err(
'DISPATCH_ACL_VIOLATION',
args => [ $cp, "update employee profiles" ],
http_code => 403,
)
);
return 0;
}
=head2 shared_update_activity
Takes three arguments:
- $d_obj is the dispatch object
- $act is an activity object (blessed hashref)
- $over is a hashref with zero or more activity properties and new values
The values from $over replace those in $act
=cut
sub shared_update_activity {
my ( $d_obj, $act, $over ) = @_;
$log->debug("Entering " . __PACKAGE__ . "::shared_update_activity" );
delete $over->{'aid'} if exists $over->{'aid'};
return $act->update( $d_obj->context ) if pre_update_comparison( $act, $over );
$log->notice( "Update operation would not change database; skipping it" );
return $CELL->status_ok( 'DISPATCH_UPDATE_NO_CHANGE_OK' );
}
=head2 shared_update_component
Takes three arguments:
- $d_obj is the dispatch object
- $comp is a component object (blessed hashref)
- $over is a hashref with zero or more component properties and new values
The values from $over replace those in $comp
=cut
sub shared_update_component {
my ( $d_obj, $comp, $over ) = @_;
$log->debug("Entering " . __PACKAGE__ . "::shared_update_component" );
delete $over->{'cid'} if exists $over->{'cid'};
if ( pre_update_comparison( $comp, $over ) ) {
my $status = $comp->update( $d_obj->context );
return $status unless $status->level eq 'ERR' and $status->code eq 'DOCHAZKA_MALFORMED_400';
}
$d_obj->mrest_declare_status( code => 400, explanation => "DISPATCH_ILLEGAL_ENTITY" );
return $fail;
}
=head2 shared_update_history
Takes three arguments:
- $d_obj is the dispatch object
- $obj is a (priv/schedule) history object (blessed hashref)
- $over is a hashref with zero or more history properties and new values
The values from $over replace those in $obj
=cut
sub shared_update_history {
my ( $d_obj, $obj, $over ) = @_;
$log->debug("Entering " . __PACKAGE__ . "::shared_update_history" );
delete $over->{'eid'} if exists $over->{'eid'};
return $obj->update( $d_obj->context ) if pre_update_comparison( $obj, $over );
$log->notice( "Update operation would not change database; skipping it" );
return $CELL->status_ok( 'DISPATCH_UPDATE_NO_CHANGE_OK' );
}
=head2 shared_insert_activity
Takes two arguments: the dispatch object and the properties that are supposed
to be an activity object to be inserted.
=cut
sub shared_insert_activity {
my ( $d_obj, $code, $props ) = validate_pos( @_,
{ isa => 'App::Dochazka::REST::Dispatch' },
{ type => SCALAR },
{ type => HASHREF },
);
$log->debug("Reached " . __PACKAGE__ . "::shared_insert_activity" );
my %proplist_before = %$props;
$proplist_before{'code'} = $code; # overwrite whatever might have been there
$log->debug( "Properties before filter: " . join( ' ', keys %proplist_before ) );
# spawn an object, filtering the properties first
my @filtered_args = App::Dochazka::Common::Model::Activity::filter( %proplist_before );
my %proplist_after = @filtered_args;
$log->debug( "Properties after filter: " . join( ' ', keys %proplist_after ) );
my $act = App::Dochazka::REST::Model::Activity->spawn( @filtered_args );
# execute the INSERT db operation
return $act->insert( $d_obj->context );
}
( run in 0.629 second using v1.01-cache-2.11-cpan-39bf76dae61 )