Bug 18821: Convert to using cache with date checking
authorKyle M Hall <kyle@bywatersolutions.com>
Sat, 26 May 2018 06:40:24 +0000 (06:40 +0000)
committerFridolin Somers <fridolin.somers@biblibre.com>
Tue, 26 Jun 2018 07:46:00 +0000 (09:46 +0200)
Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
(cherry picked from commit 1e19bb32844dedc3d2d4d506e22f60bfac2b4057)
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
(cherry picked from commit 30ea1a4b4b783635e817dd3c06a3d0c881961d59)
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>

C4/Auth.pm
t/db_dependent/Auth.t

index 83abbce..0b9ce4d 100644 (file)
@@ -33,6 +33,7 @@ use C4::Search::History;
 use Koha;
 use Koha::Caches;
 use Koha::AuthUtils qw(get_script_name hash_password);
+use Koha::DateUtils qw(dt_from_string);
 use Koha::Libraries;
 use Koha::LibraryCategories;
 use Koha::Patrons;
@@ -1188,7 +1189,7 @@ sub checkauth {
             );
         }
 
-        track_login_for_session( $userid, $session );
+        track_login_for_session( $userid );
 
         return ( $userid, $cookie, $sessionID, $flags );
     }
@@ -2097,26 +2098,30 @@ sub getborrowernumber {
 
 =head2 track_login_for_session
 
-  track_login_for_session( $userid, $session );
+  track_login_for_session( $userid );
 
 C<$userid> the userid of the member
-C<$session> the CGI::Session object used to store the session's state.
 
 Wraps the call to $patron->track_login, the method used to update borrowers.lastseen.
 
 =cut
 
 sub track_login_for_session {
-    my ( $userid, $session ) = @_;
+    my $userid = shift;
+    return unless $userid;
 
-    if ( $userid && $session && !$session->param('tracked_for_session') ) {
-        $session->param( 'tracked_for_session', 1 );
-        $session->flush();
+    my $patron = Koha::Patrons->find( { userid => $userid } );
+    return unless $patron;
 
-        # track_login also depends on pref TrackLastPatronActivity
-        my $patron = Koha::Patrons->find( { userid => $userid } );
-        $patron->track_login if $patron;
-    }
+    my $cache     = Koha::Caches->get_instance();
+    my $cache_key = "seen-for-session-" . $patron->id;
+    my $cached    = $cache->get_from_cache( $cache_key, { unsafe => 1 } );
+
+    my $today = dt_from_string()->ymd;
+    return if $cached && $cached eq $today;
+
+    $patron->track_login;
+    $cache->set_in_cache( $cache_key, $today );
 }
 
 END { }    # module clean-up code here (global destructor)
index 1063bf3..686811b 100644 (file)
@@ -77,38 +77,33 @@ subtest 'track_login_for_session() tests' => sub {
     $patron->lastseen( undef );
     $patron->store();
 
-    # Mock a CGI object with real userid param
-    my $cgi = Test::MockObject->new();
-    $cgi->mock( 'param', sub { return $patron; } );
-    $cgi->mock( 'cookie', sub { return; } );
-
-    my $session = new CGI::Session( undef, undef, { Directory => File::Spec->tmpdir } );
+    my $cache     = Koha::Caches->get_instance();
+    my $cache_key = "seen-for-session-" . $patron->id;
+    $cache->clear_from_cache($cache_key);
 
     t::lib::Mocks::mock_preference( 'TrackLastPatronActivity', '1' );
 
-    C4::Auth::track_login_for_session( $userid );
-    $patron->_result()->discard_changes();
-    is( $patron->lastseen, undef, 'Patron last seen should be unchanged if no session is passed' );
+    is( $patron->lastseen, undef, 'Patron should have not last seen when newly created' );
 
-    C4::Auth::track_login_for_session( $userid, $session );
+    C4::Auth::track_login_for_session( $userid );
     $patron->_result()->discard_changes();
     isnt( $patron->lastseen, undef, 'Patron should have last seen set when TrackLastPatronActivity = 1' );
 
     sleep(1); # We need to wait a tiny bit to make sure the timestamp will be different
     my $last_seen = $patron->lastseen;
-    C4::Auth::track_login_for_session( $userid, $session );
+    C4::Auth::track_login_for_session( $userid );
     $patron->_result()->discard_changes();
     is( $patron->lastseen, $last_seen, 'Patron last seen should be unchanged if passed the same session' );
 
-    $session = new CGI::Session( undef, undef, { Directory => File::Spec->tmpdir } );
-    C4::Auth::track_login_for_session( $userid, $session );
+    $cache->clear_from_cache($cache_key);
+    C4::Auth::track_login_for_session( $userid );
     $patron->_result()->discard_changes();
     isnt( $patron->lastseen, $last_seen, 'Patron last seen should be changed if given a new session' );
 
     t::lib::Mocks::mock_preference( 'TrackLastPatronActivity', '0' );
     sleep(1);
     $last_seen = $patron->lastseen;
-    C4::Auth::track_login_for_session( $userid, $session );
+    C4::Auth::track_login_for_session( $userid );
     $patron->_result()->discard_changes();
     is( $patron->lastseen, $last_seen, 'Patron should have last seen unchanged when TrackLastPatronActivity = 0' );