CallBackery
view release on metacpan or search on metacpan
lib/CallBackery/Controller/RpcService.pm view on Meta::CPAN
my $plugin = shift;
my $args = shift;
my $obj = await $self->instantiatePlugin_p($plugin,$args);
return $obj->filterHashKey($obj->screenCfg,'backend');
}
=head2 runEventActions(event[,args])
Call the eventAction handlers of all configured plugins. Currently the
following events are known:
changeConfig
=cut
sub runEventActions {
my $self = shift;
my $event = shift;
my @args = @_;
for my $obj (@{$self->config->configPlugins}){
if (my $action = $obj->eventActions->{$event}){
$action->(@args)
}
}
}
=head2 setPreDestroyAction(key,callback);
This can be used to have tasks completed at the end of a webtransaction since
the controller gets instantiated per transaction.
An example application would be backing up the configuration changes only
once even if more than one configChange event has occured.
=cut
my $runPreDestroyActions = sub {
my $self = shift;
my $actions = $self->{preDestroyActions} // {};
$self->log->debug('destroying controller');
for my $key (keys %$actions){
$self->log->debug('running preDestroyAction '.$key);
eval {
$actions->{$key}->();
};
if ($@){
$self->log->error("preDestoryAction $key: ".$@);
}
# and thus hopefully releasing the controller
delete $actions->{$key};
}
delete $self->{preDestroyActions}
};
sub setPreDestroyAction {
my $self = shift;
my $key = shift;
my $cb = shift;
if (not $self->{preDestroyActions}){
# we want to run these pretty soon, basically as soon as
# controll returns to the ioloop
Mojo::IOLoop->timer("0.2" => sub{ $self->$runPreDestroyActions });
}
$self->{preDestroyActions}{$key} = $cb;
}
=head2 handleUpload
Process incoming upload request. This is getting called via a route and NOT
in the usual way, hence we have to render our own response!
=cut
async sub handleUpload {
my $self = shift;
$self->render_later;
if (not $self->user->isUserAuthenticated){
return $self->render(json => {exception=>{
message=>trm('Access Denied'),code=>4922}});
}
my $name = $self->req->param('name');
if (not $name){
return $self->render(json => {exception=>{
message=>trm('Plugin Name missing'),code=>3934}});
}
my $upload = $self->req->upload('file');
if (not $upload){
return $self->render(json => {exception=>{
message=>trm('Upload Missing'),code=>9384}});
}
my $obj = await $self->instantiatePlugin_p($name);
my $form;
if (my $formData = $self->req->param('formData')){
$form = eval { decode_json($formData) };
if ($@){
return $self->render(json=>{exception=>{
message=>trm('Data Decoding Problem %1',$@),code=>7932}});
}
}
$form->{uploadObj} = $upload;
my $return;
try {
$return = await $self->config->promisify($obj->processData({
key => $self->req->param('key'),
formData => $form,
}));
} catch ($error) {
if (blessed $error){
if ($error->isa('CallBackery::Exception')){
return $self->render(json=>{exception=>{
message=>$error->message,code=>$error->code}});
}
elsif ($error->isa('Mojo::Exception')){
return $self->render(json=>{exception=>{message=>$error->message,code=>9999}});
}
}
return $self->render(json=>{exception=>{message=>$error,code=>9999}});
( run in 0.503 second using v1.01-cache-2.11-cpan-e1769b4cff6 )