Bug 24031: Add plugin hook after_hold_create
authorJulian Maurice <julian.maurice@biblibre.com>
Wed, 13 Nov 2019 10:11:54 +0000 (11:11 +0100)
committerJonathan Druart <jonathan.druart@bugs.koha-community.org>
Thu, 30 Jul 2020 15:30:23 +0000 (17:30 +0200)
It is called after a hold has been placed

Test plan:
1. Write a plugin that implements only after_hold_create (see
   `perldoc Koha::Plugins` for implementation details). Install it and
   enable it
2. Place a hold and verify that your plugin method has been called with
   the right parameters

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Pasi Kallinen <pasi.kallinen@koha-suomi.fi>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

C4/Reserves.pm
Koha/Plugins.pm
t/db_dependent/Koha/Plugins/Plugins.t

index bf14584..950d29f 100644 (file)
@@ -45,6 +45,7 @@ use Koha::Items;
 use Koha::Libraries;
 use Koha::Old::Hold;
 use Koha::Patrons;
+use Koha::Plugins;
 
 use Carp;
 use Data::Dumper;
@@ -296,6 +297,8 @@ sub AddReserve {
         }
     }
 
+    Koha::Plugins->call('after_hold_create', $hold);
+
     return $reserve_id;
 }
 
index 9dc42c5..4e7926b 100644 (file)
@@ -52,6 +52,29 @@ sub new {
     return bless( $args, $class );
 }
 
+=head2 call
+
+Calls a plugin method for all enabled plugins
+
+    @responses = Koha::Plugins->call($method, @args)
+
+=cut
+
+sub call {
+    my ($class, $method, @args) = @_;
+
+    if (C4::Context->preference('UseKohaPlugins') && C4::Context->config('enable_plugins')) {
+        my @plugins = $class->new({ enable_plugins => 1 })->GetPlugins({ method => $method });
+        my @responses;
+        foreach my $plugin (@plugins) {
+            my $response = $plugin->$method(@args);
+            push @responses, $response;
+        }
+
+        return @responses;
+    }
+}
+
 =head2 GetPlugins
 
 This will return a list of all available plugins, optionally limited by
@@ -161,6 +184,30 @@ sub InstallPlugins {
 1;
 __END__
 
+=head1 AVAILABLE HOOKS
+
+=head2 after_hold_create
+
+=head3 Parameters
+
+=over
+
+=item * C<$hold> - A Koha::Hold object that has just been inserted in database
+
+=back
+
+=head3 Return value
+
+None
+
+=head3 Example
+
+    sub after_hold_create {
+        my ($self, $hold) = @_;
+
+        warn "New hold for borrower " . $hold->borrower->borrowernumber;
+    }
+
 =head1 AUTHOR
 
 Kyle M Hall <kyle.m.hall@gmail.com>
index 178c544..ed19ecf 100755 (executable)
@@ -25,7 +25,7 @@ use File::Temp qw( tempdir tempfile );
 use FindBin qw($Bin);
 use Module::Load::Conditional qw(can_load);
 use Test::MockModule;
-use Test::More tests => 51;
+use Test::More tests => 52;
 
 use C4::Context;
 use Koha::Database;
@@ -46,6 +46,33 @@ BEGIN {
 
 my $schema = Koha::Database->new->schema;
 
+subtest 'call() tests' => sub {
+    plan tests => 2;
+
+    $schema->storage->txn_begin;
+    # Temporarily remove any installed plugins data
+    Koha::Plugins::Methods->delete;
+
+    my $plugins = Koha::Plugins->new({ enable_plugins => 1 });
+    my @plugins = $plugins->InstallPlugins;
+    foreach my $plugin (@plugins) {
+        $plugin->enable();
+    }
+
+    my @responses = Koha::Plugins->call('check_password', { password => 'foo' });
+
+    my $expected = [ { error => 1, msg => 'PIN should be four digits' } ];
+    is_deeply(\@responses, $expected, 'call() should return all responses from plugins');
+
+    # Make sure parameters are correctly passed to the plugin method
+    my @responses = Koha::Plugins->call('check_password', { password => '1234' });
+
+    my $expected = [ { error => 0 } ];
+    is_deeply(\@responses, $expected, 'call() should return all responses from plugins');
+
+    $schema->storage->txn_rollback;
+};
+
 subtest 'GetPlugins() tests' => sub {
 
     plan tests => 2;