Implement deletion of inactive accounts

This commit is contained in:
Daniel Friesel 2019-04-30 12:47:32 +02:00
parent 867a5d4afb
commit 99aa3a4a0d
6 changed files with 39 additions and 4 deletions

View file

@ -577,6 +577,18 @@ sub startup {
}
);
$self->helper(
'mark_seen' => sub {
my ( $self, $uid ) = @_;
$self->pg->db->update(
'users',
{ last_seen => DateTime->now( time_zone => 'Europe/Berlin' ) },
{ id => $uid }
);
}
);
$self->helper(
'update_journey_part' => sub {
my ( $self, $db, $journey_id, $key, $value ) = @_;
@ -878,7 +890,7 @@ sub startup {
'users',
'id, name, status, public_level, email, '
. 'extract(epoch from registered_at) as registered_at_ts, '
. 'extract(epoch from last_login) as last_login_ts, '
. 'extract(epoch from last_seen) as last_seen_ts, '
. 'extract(epoch from deletion_requested) as deletion_requested_ts',
{ id => $uid }
)->hash;
@ -895,7 +907,7 @@ sub startup {
time_zone => 'Europe/Berlin'
),
last_seen => DateTime->from_epoch(
epoch => $user_data->{last_login_ts},
epoch => $user_data->{last_seen_ts},
time_zone => 'Europe/Berlin'
),
deletion_requested => $user_data->{deletion_requested_ts}
@ -967,7 +979,7 @@ sub startup {
token => $token,
password => $password,
registered_at => $now,
last_login => $now,
last_seen => $now,
},
{ returning => 'id' }
);

View file

@ -412,6 +412,18 @@ my @migrations = (
}
);
},
# v8 -> v9
sub {
my ($db) = @_;
$db->query(
qq{
alter table users rename column last_login to last_seen;
drop table user_actions;
update schema_version set version = 9;
}
);
},
);
sub setup_db {

View file

@ -13,6 +13,7 @@ sub run {
my $now = DateTime->now( time_zone => 'Europe/Berlin' );
my $verification_deadline = $now->clone->subtract( hours => 48 );
my $deletion_deadline = $now->clone->subtract( hours => 72 );
my $old_deadline = $now->clone->subtract( years => 1 );
my $db = $self->app->pg->db;
my $tx = $db->begin;
@ -80,6 +81,12 @@ sub run {
{ deletion_requested => { '<', $deletion_deadline } } );
my @uids_to_delete = $to_delete->arrays->map( sub { shift->[0] } )->each;
$to_delete
= $db->select( 'users', ['id'], { last_seen => { '<', $old_deadline } } );
push( @uids_to_delete,
$to_delete->arrays->map( sub { shift->[0] } )->each );
if ( @uids_to_delete > 10 ) {
printf STDERR (
"About to delete %d accounts, which is quite a lot.\n",

View file

@ -38,6 +38,7 @@ sub do_login {
else {
if ( $self->authenticate( $user, $password ) ) {
$self->redirect_to( $self->req->param('redirect_to') // '/' );
$self->mark_seen( $self->current_user->{id} );
}
else {
my $data = $self->get_user_password($user);
@ -535,6 +536,7 @@ sub account {
my ($self) = @_;
$self->render('account');
$self->mark_seen( $self->current_user->{id} );
}
sub json_export {

View file

@ -13,6 +13,7 @@ sub homepage {
with_autocomplete => 1,
with_geolocation => 1
);
$self->mark_seen( $self->current_user->{id} );
}
else {
$self->render( 'landingpage', intro => 1 );
@ -272,6 +273,7 @@ sub station {
title => "travelynx: $status->{station_name}",
);
}
$self->mark_seen( $self->current_user->{id} );
}
sub redirect_to_station {

View file

@ -51,7 +51,7 @@
an Dritte weitergegeben. Die <a
href="/impressum">Datenschutzerklärung</a> beschreibt weitere
erhobene Daten sowie deren Zweck und Speicherfristen.
Accounts werden nach einem Jahr ohne Nutzung automatisch gelöscht.
Accounts werden nach einem Jahr ohne Aktivität automatisch gelöscht.
</p>
<p>
Bitte beachten: Travelynx ist ein privat betriebenes Projekt ohne