LP#1860703: Additional A/T hooks for use with various patron changes
authorMike Rylander <mrylander@gmail.com>
Thu, 14 May 2020 18:13:38 +0000 (14:13 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Tue, 8 Sep 2020 14:52:50 +0000 (10:52 -0400)
This commit normalizes the au.update/au.updated and au.create/au.created
hooks, making them match between code and seed data, and adds two
entirely new hooks, au.renewed and au.barcode_changed.

Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Troy Leonard <leonardt@aadl.org>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>

Open-ILS/src/perlmods/lib/OpenILS/Application/Actor.pm
Open-ILS/src/sql/Pg/950.data.seed-values.sql
Open-ILS/src/sql/Pg/upgrade/YYYY.new_user_a-t_hooks.sql [new file with mode: 0644]

index d04160f..21c608a 100644 (file)
@@ -480,6 +480,7 @@ sub update_patron {
 
     my $old_patron;
     my $barred_hook = '';
+    my $renew_hook = '';
 
     if($patron->isnew()) {
         ( $new_patron, $evt ) = _add_patron($e, _clone_patron($patron));
@@ -495,6 +496,8 @@ sub update_patron {
         $old_patron = $e->retrieve_actor_user($patron->id) or
             return $e->die_event;
 
+        $renew_hook = 'au.renewed' if ($old_patron->expire_date ne $new_patron->expire_date);
+
         if($U->is_true($old_patron->barred) != $U->is_true($new_patron->barred)) {
             my $perm = $U->is_true($old_patron->barred) ? 'UNBAR_PATRON' : 'BAR_PATRON';
             return $e->die_event unless $e->allowed($perm, $patron->home_ou);
@@ -546,10 +549,13 @@ sub update_patron {
     my $tses = OpenSRF::AppSession->create('open-ils.trigger');
     if($patron->isnew) {
         $tses->request('open-ils.trigger.event.autocreate',
-            'au.create', $new_patron, $new_patron->home_ou);
+            'au.created', $new_patron, $new_patron->home_ou);
     } else {
         $tses->request('open-ils.trigger.event.autocreate',
-            'au.update', $new_patron, $new_patron->home_ou);
+            'au.updated', $new_patron, $new_patron->home_ou);
+
+        $tses->request('open-ils.trigger.event.autocreate', $renew_hook,
+            $new_patron, $new_patron->home_ou) if $renew_hook;
 
         $tses->request('open-ils.trigger.event.autocreate', $barred_hook,
             $new_patron, $new_patron->home_ou) if $barred_hook;
@@ -916,6 +922,7 @@ sub _add_update_cards {
 
     my $virtual_id; #id of the card before creation
 
+    my $card_changed = 0;
     my $cards = $patron->cards();
     for my $card (@$cards) {
 
@@ -932,13 +939,18 @@ sub _add_update_cards {
                 $new_patron->card($card->id());
                 $new_patron->ischanged(1);
             }
+            $card_changed++;
 
         } elsif( ref($card) and $card->ischanged() ) {
             $evt = _update_card($e, $card);
             return (undef, $evt) if $evt;
+            $card_changed++;
         }
     }
 
+    $U->create_events_for_hook('au.barcode_changed', $new_patron, $e->requestor->ws_ou)
+        if $card_changed;
+
     return ( $new_patron, undef );
 }
 
@@ -1565,6 +1577,7 @@ sub update_passwd {
         return new OpenILS::Event('INCORRECT_PASSWORD');
     }
 
+    my $at_event = 0;
     if( $api =~ /password/o ) {
         # NOTE: with access to the plain text password we could crypt
         # the password without the extra MD5 pre-hashing.  Other changes
@@ -1587,15 +1600,20 @@ sub update_passwd {
                 return new OpenILS::Event('USERNAME_EXISTS');
             }
             $db_user->usrname($new_val);
+            $at_event++;
 
         } elsif( $api =~ /email/o ) {
             $db_user->email($new_val);
+            $at_event++;
         }
     }
 
     $e->update_actor_user($db_user) or return $e->die_event;
     $e->commit;
 
+    $U->create_events_for_hook('au.updated', $db_user, $e->requestor->ws_ou)
+        if $at_event;
+
     # update the cached user to pick up these changes
     $U->simplereq('open-ils.auth', 'open-ils.auth.session.reset_timeout', $auth, 1);
     return 1;
@@ -3617,8 +3635,8 @@ sub update_user_pending_address {
     my $e = new_editor(authtoken => $auth, xact => 1);
     return $e->die_event unless $e->checkauth;
 
+    my $user = $e->retrieve_actor_user($addr->usr) or return $e->die_event;
     if($addr->usr != $e->requestor->id) {
-        my $user = $e->retrieve_actor_user($addr->usr) or return $e->die_event;
         return $e->die_event unless $e->allowed('UPDATE_USER', $user->home_ou);
     }
 
@@ -3631,6 +3649,8 @@ sub update_user_pending_address {
     }
 
     $e->commit;
+    $U->create_events_for_hook('au.updated', $user, $e->requestor->ws_ou);
+
     return $addr->id;
 }
 
index 7100bea..7d6ed61 100644 (file)
@@ -16609,6 +16609,15 @@ INSERT INTO action_trigger.environment (event_def, path) VALUES
 INSERT INTO action_trigger.hook (key, core_type, description, passive)
     VALUES ('au.created', 'au', 'A user was created', 't');
        
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+    VALUES ('au.updated', 'au', 'A user was updated', 't');
+       
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+    VALUES ('au.barcode_changed', 'au', 'A card was updated or created for an existing user', 't');
+       
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+    VALUES ('au.renewed', 'au', 'A user was renewed by having their expire date changed', 't');
+
 --SQL to create event definition for new account creation notice
 --Inactive, owned by top of org tree by default.  Modify to suit needs.
 
diff --git a/Open-ILS/src/sql/Pg/upgrade/YYYY.new_user_a-t_hooks.sql b/Open-ILS/src/sql/Pg/upgrade/YYYY.new_user_a-t_hooks.sql
new file mode 100644 (file)
index 0000000..8857cd1
--- /dev/null
@@ -0,0 +1,26 @@
+BEGIN;
+
+SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+
+-- First, normalize the au.create[d] and au.update[d] hooks.  The code and seed data differ.
+
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+    VALUES ('au.created', 'au', 'A user was created', 't') ON CONFLICT DO NOTHING;
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+    VALUES ('au.updated', 'au', 'A user was updated', 't') ON CONFLICT DO NOTHING;
+
+
+UPDATE action_trigger.event_definition SET hook = 'au.created' WHERE hook = 'au.create';
+UPDATE action_trigger.event_definition SET hook = 'au.updated' WHERE hook = 'au.update';
+
+DELETE FROM action_trigger.hook WHERE key = 'au.create';
+DELETE FROM action_trigger.hook WHERE key = 'au.update';
+
+-- Now the entirely new ones...
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+    VALUES ('au.renewed', 'au', 'A user was renewed by having their expire date changed', 't');
+
+INSERT INTO action_trigger.hook (key, core_type, description, passive)
+    VALUES ('au.barcode_changed', 'au', 'A card was updated or created for an existing user', 't');
+
+COMMIT;