Browse Source

Bug 18821: Convert to using cache with date checking

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
18.11.x
Kyle Hall 4 years ago
committed by Nick Clemens
parent
commit
495512f6ea
  1. 27
      C4/Auth.pm
  2. 23
      t/db_dependent/Auth.t

27
C4/Auth.pm

@ -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::Library::Groups;
use Koha::Libraries;
use Koha::Patrons;
@ -1201,7 +1202,7 @@ sub checkauth {
);
}
track_login_for_session( $userid, $session );
track_login_for_session( $userid );
return ( $userid, $cookie, $sessionID, $flags );
}
@ -2078,26 +2079,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)

23
t/db_dependent/Auth.t

@ -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' );

Loading…
Cancel
Save