diff options
author | Matthew Somerville <matthew-github@dracos.co.uk> | 2018-05-14 12:38:36 +0100 |
---|---|---|
committer | Matthew Somerville <matthew-github@dracos.co.uk> | 2018-05-23 18:55:09 +0100 |
commit | 4264a9aac285fc31b354a74805c5bff72b517fb7 (patch) | |
tree | 20483ccac14d8cbf02d78e16bf59034c5c3f34af | |
parent | 910b1b8fef7e19b102459c97fc700a117d7a12aa (diff) |
Update last_active on login/logout/session expiry.
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rwxr-xr-x | bin/expire-sessions | 17 | ||||
-rw-r--r-- | perllib/Catalyst/Plugin/FixMyStreet/Session/StoreSessions.pm | 2 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/Result/User.pm | 7 |
4 files changed, 25 insertions, 2 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b54031a4..104ad1c3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ - Nicer Open311 errors. #2078 - Deleted body categories now hidden by default #1962 - Display contents of report's extra field #1809 + - Store user creation and last active times. - Development improvements: - Add HTML email previewer. - Add CORS header to Open311 output. #2022 diff --git a/bin/expire-sessions b/bin/expire-sessions index 2ec0a09da..351c4a483 100755 --- a/bin/expire-sessions +++ b/bin/expire-sessions @@ -26,13 +26,19 @@ my $rs = FixMyStreet::DB->resultset("Session"); # Delete expired sessions (including from in User object) while (my $session = $rs->search({ expires => { '<', time() } })->next) { - if (my $user = $session->user) { + my $user = $session->user; + my $expires = $session->expires; + if ($user) { my $id = $session->id_code; my $sessions = $user->get_extra_metadata('sessions'); my @new_sessions = grep { $_ ne $id } @$sessions; update_user_sessions($user, \@new_sessions) if @new_sessions != @$sessions; } $session->delete; + if ($user) { + update_user_last_active($user, $expires); + $user->update; + } } if ($init) { @@ -44,11 +50,19 @@ if ($init) { my $sessions = $user->get_extra_metadata('sessions'); my @new_sessions = uniq @$sessions, $id; update_user_sessions($user, \@new_sessions) if @new_sessions != @$sessions; + $user->update; } } # --- +sub update_user_last_active { + my ($user, $expires) = @_; + return unless $expires; + my $t = DateTime->from_epoch(epoch => $expires)->subtract(weeks => 4); + $user->set_last_active($t) if !$user->last_active || $user->last_active < $t; +} + sub update_user_sessions { my ($user, $sessions) = @_; if (@$sessions) { @@ -56,5 +70,4 @@ sub update_user_sessions { } else { $user->unset_extra_metadata('sessions'); } - $user->update; } diff --git a/perllib/Catalyst/Plugin/FixMyStreet/Session/StoreSessions.pm b/perllib/Catalyst/Plugin/FixMyStreet/Session/StoreSessions.pm index 5e7a3cede..30149fc2b 100644 --- a/perllib/Catalyst/Plugin/FixMyStreet/Session/StoreSessions.pm +++ b/perllib/Catalyst/Plugin/FixMyStreet/Session/StoreSessions.pm @@ -7,6 +7,7 @@ after set_authenticated => sub { my $sessions = $c->user->get_extra_metadata('sessions'); push @$sessions, $c->sessionid; $c->user->set_extra_metadata('sessions', $sessions); + $c->user->set_last_active; $c->user->update; }; @@ -16,6 +17,7 @@ before logout => sub { my $sessions = $user->get_extra_metadata('sessions'); $sessions = [ grep { $_ ne $c->sessionid } @$sessions ]; @$sessions ? $user->set_extra_metadata('sessions', $sessions) : $user->unset_extra_metadata('sessions'); + $user->set_last_active; $user->update; } }; diff --git a/perllib/FixMyStreet/DB/Result/User.pm b/perllib/FixMyStreet/DB/Result/User.pm index 3ec6ae92c..8b539f85d 100644 --- a/perllib/FixMyStreet/DB/Result/User.pm +++ b/perllib/FixMyStreet/DB/Result/User.pm @@ -544,4 +544,11 @@ has categories => ( }, ); +sub set_last_active { + my $self = shift; + my $time = shift; + $self->unset_extra_metadata('inactive_email_sent'); + $self->last_active($time or \'current_timestamp'); +} + 1; |