aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Somerville <matthew-github@dracos.co.uk>2018-05-14 12:38:36 +0100
committerMatthew Somerville <matthew-github@dracos.co.uk>2018-05-23 18:55:09 +0100
commit4264a9aac285fc31b354a74805c5bff72b517fb7 (patch)
tree20483ccac14d8cbf02d78e16bf59034c5c3f34af
parent910b1b8fef7e19b102459c97fc700a117d7a12aa (diff)
Update last_active on login/logout/session expiry.
-rw-r--r--CHANGELOG.md1
-rwxr-xr-xbin/expire-sessions17
-rw-r--r--perllib/Catalyst/Plugin/FixMyStreet/Session/StoreSessions.pm2
-rw-r--r--perllib/FixMyStreet/DB/Result/User.pm7
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;