prepare DB schema for public registration

This commit is contained in:
Daniel Friesel 2019-03-04 18:17:03 +01:00
parent 3096091f11
commit 8adca327fd
3 changed files with 111 additions and 28 deletions

View file

@ -177,6 +177,20 @@ app->attr(
qq{select id from users where name = ?}); qq{select id from users where name = ?});
} }
); );
app->attr(
get_user_query => sub {
my ($self) = @_;
return $self->app->dbh->prepare(
qq{
select
id, name, status, is_public, email,
registered_at, last_login, deletion_requested
from users where id = ?
}
);
}
);
app->attr( app->attr(
get_stationid_by_ds100_query => sub { get_stationid_by_ds100_query => sub {
my ($self) = @_; my ($self) = @_;
@ -445,6 +459,35 @@ helper 'get_station_id' => sub {
} }
}; };
helper 'get_user_data' => sub {
my ($self) = @_;
my $uid = $self->get_user_id;
my $query = $self->app->get_user_query;
$query->execute($uid);
my $rows = $query->fetchall_arrayref;
if ( @{$rows} ) {
my @row = @{ $rows->[0] };
return {
id => $row[0],
name => $row[1],
status => $row[2],
is_public => $row[3],
email => $row[4],
registered_at => DateTime->from_epoch(
epoch => $row[5],
time_zone => 'Europe/Berlin'
),
last_seen => DateTime->from_epoch(
epoch => $row[6],
time_zone => 'Europe/Berlin'
),
deletion_requested => $row[7]
};
}
return;
};
helper 'get_user_name' => sub { helper 'get_user_name' => sub {
my ($self) = @_; my ($self) = @_;

View file

@ -4,26 +4,31 @@ use strict;
use warnings; use warnings;
use 5.020; use 5.020;
use DateTime;
use DBI; use DBI;
my $dbname = $ENV{TRAVELYNX_DB_FILE} // 'travelynx.sqlite'; my $dbname = $ENV{TRAVELYNX_DB_FILE} // 'travelynx.sqlite';
my $dbh = DBI->connect( "dbi:SQLite:dbname=${dbname}", q{}, q{} ); my $dbh = DBI->connect( "dbi:SQLite:dbname=${dbname}", q{}, q{} );
my $has_version_query = $dbh->prepare(qq{ my $has_version_query = $dbh->prepare(
qq{
select name from sqlite_master select name from sqlite_master
where type = 'table' and name = 'schema_version'; where type = 'table' and name = 'schema_version';
}); }
);
sub get_schema_version { sub get_schema_version {
$has_version_query->execute(); $has_version_query->execute();
my $rows = $has_version_query->fetchall_arrayref; my $rows = $has_version_query->fetchall_arrayref;
if (@{$rows} == 1) { if ( @{$rows} == 1 ) {
my $get_version_query = $dbh->prepare(qq{ my $get_version_query = $dbh->prepare(
qq{
select version from schema_version; select version from schema_version;
}); }
);
$get_version_query->execute(); $get_version_query->execute();
my $rows = $get_version_query->fetchall_arrayref; my $rows = $get_version_query->fetchall_arrayref;
if (@{$rows} == 0) { if ( @{$rows} == 0 ) {
return -1; return -1;
} }
return $rows->[0][0]; return $rows->[0][0];
@ -32,36 +37,68 @@ sub get_schema_version {
} }
my @migrations = ( my @migrations = (
# v0 -> v1 # v0 -> v1
sub { sub {
$dbh->do(qq{ $dbh->begin_work;
begin transaction; $dbh->do(
}); qq{
$dbh->do(qq{
create table schema_version ( create table schema_version (
version integer primary key version integer primary key
); );
}); }
$dbh->do(qq{ );
$dbh->do(
qq{
insert into schema_version (version) values (1); insert into schema_version (version) values (1);
}); }
$dbh->do(qq{ );
$dbh->do(
qq{
create table new_users ( create table new_users (
id integer primary key, id integer primary key,
name char(64) not null unique, name char(64) not null unique,
status int not null, status int not null,
is_public bool not null,
email char(256), email char(256),
password text, password text,
registered_at datetime, registered_at datetime not null,
last_login datetime last_login datetime not null,
deletion_requested datetime
); );
}); }
my $get_users_query = $dbh->prepare(qq{ );
my $get_users_query = $dbh->prepare(
qq{
select * from users; select * from users;
}); }
$dbh->do(qq{ );
commit; my $add_user_query = $dbh->prepare(
}); qq{
insert into new_users
(id, name, status, is_public, registered_at, last_login)
values
(?, ?, ?, ?, ?, ?)
}
);
$get_users_query->execute;
while ( my @row = $get_users_query->fetchrow_array ) {
my ( $id, $name ) = @row;
my $now = DateTime->now( time_zone => 'Europe/Berlin' )->epoch;
$add_user_query->execute( $id, $name, 0, 0, $now, $now );
}
$dbh->do(
qq{
drop table users;
}
);
$dbh->do(
qq{
alter table new_users rename to users;
}
);
$dbh->commit;
}, },
); );
@ -69,11 +106,13 @@ my $schema_version = get_schema_version();
say "Found travelynx schema v${schema_version}"; say "Found travelynx schema v${schema_version}";
if ($schema_version == @migrations) { if ( $schema_version == @migrations ) {
say "Database schema is up-to-date"; say "Database schema is up-to-date";
} }
for my $i ($schema_version .. $#migrations) { for my $i ( $schema_version .. $#migrations ) {
printf("Updating to v%d\n", $i + 1); printf( "Updating to v%d\n", $i + 1 );
$migrations[$i](); $migrations[$i]();
} }
$dbh->disconnect;

View file

@ -1,17 +1,18 @@
<h1>Account</h1> <h1>Account</h1>
% my $acc = get_user_data();
<div class="row"> <div class="row">
<table class="striped"> <table class="striped">
<tr> <tr>
<th scope="row">Name</th> <th scope="row">Name</th>
<td><%= get_user_name() %></td> <td><%= $acc->{name} %></td>
</tr> </tr>
<tr> <tr>
<th scope="row">Mail</th> <th scope="row">Mail</th>
<td>fnord@example.org</td> <td><%= $acc->{email} %></td>
</tr> </tr>
<tr> <tr>
<th scope="row">Registriert am</th> <th scope="row">Registriert am</th>
<td>01.01.1970 00:00</td> <td><%= $acc->{registered_at}->strftime('%d.%m.%Y %H:%M') %></td>
</tr> </tr>
</table> </table>
</div> </div>