Move remaining journeys queries to journeys model class

This commit is contained in:
Daniel Friesel 2020-10-11 21:08:22 +02:00
parent 8abb8206ce
commit e61550f751
4 changed files with 163 additions and 109 deletions

View file

@ -512,20 +512,10 @@ sub startup {
my $db = $self->pg->db;
my $tx = $db->begin;
my $journey = $db->select(
'journeys',
'*',
{
user_id => $uid,
id => $journey_id
}
)->hash;
$db->delete(
'journeys',
{
user_id => $uid,
id => $journey_id
}
my $journey = $self->journeys->pop(
uid => $uid,
db => $db,
journey_id => $journey_id
);
if ( $journey->{edited} ) {
@ -744,10 +734,10 @@ sub startup {
);
if ( $has_arrived or $force ) {
delete $journey->{data};
$journey->{edited} = 0;
$journey->{checkout_time} = $now;
$db->insert( 'journeys', $journey );
$self->journeys->add_from_in_transit(
db => $db,
journey => $journey
);
$self->in_transit->delete(
uid => $uid,
db => $db
@ -777,12 +767,11 @@ sub startup {
# cancelled_from action -> 'cancelled journey' panel on main page
# -> cancelled_to action -> force checkout (causing the
# previous branch to be taken due to $force)
$journey->{edited} = 0;
$journey->{checkout_time} = $now;
$journey->{cancelled} = 1;
delete $journey->{data};
$db->insert( 'journeys', $journey );
$journey->{cancelled} = 1;
$self->journeys->add_from_in_transit(
db => $db,
journey => $journey
);
$self->in_transit->set_cancelled_destination(
uid => $uid,
db => $db,
@ -1079,47 +1068,6 @@ sub startup {
}
);
$self->helper(
'history_years' => sub {
my ( $self, $uid ) = @_;
$uid //= $self->current_user->{id},
my $res = $self->pg->db->select(
'journeys',
'distinct extract(year from real_departure) as year',
{ user_id => $uid },
{ order_by => { -asc => 'year' } }
);
my @ret;
for my $row ( $res->hashes->each ) {
push( @ret, [ $row->{year}, $row->{year} ] );
}
return @ret;
}
);
$self->helper(
'history_months' => sub {
my ( $self, $uid ) = @_;
$uid //= $self->current_user->{id},
my $res = $self->pg->db->select(
'journeys',
"distinct to_char(real_departure, 'YYYY.MM') as yearmonth",
{ user_id => $uid },
{ order_by => { -asc => 'yearmonth' } }
);
my @ret;
for my $row ( $res->hashes->each ) {
my ( $year, $month ) = split( qr{[.]}, $row->{yearmonth} );
push( @ret, [ "${year}/${month}", "${month}.${year}" ] );
}
return @ret;
}
);
$self->helper(
'add_route_timestamps' => sub {
my ( $self, $uid, $train, $is_departure ) = @_;
@ -1508,24 +1456,10 @@ sub startup {
return $id;
}
my $journey = $db->select(
'journeys',
['checkout_station_id'],
{
user_id => $uid,
cancelled => 0
},
{
limit => 1,
order_by => { -desc => 'real_departure' }
}
)->hash;
if ( not $journey ) {
return;
}
return $journey->{checkout_station_id};
return $self->journeys->get_latest_checkout_station_id(
uid => $uid,
db => $db
);
}
);
@ -2054,30 +1988,10 @@ sub startup {
return $ret;
}
my $latest = $db->select(
'journeys_str',
'*',
{
user_id => $uid,
cancelled => 0
},
{
order_by => { -desc => 'journey_id' },
limit => 1
}
)->expand->hash;
my $latest_cancellation = $db->select(
'journeys_str',
'*',
{
user_id => $uid,
},
{
order_by => { -desc => 'journey_id' },
limit => 1
}
)->expand->hash;
my ( $latest, $latest_cancellation ) = $self->journeys->get_latest(
uid => $uid,
db => $db
);
if ( $latest_cancellation and $latest_cancellation->{cancelled} ) {
if ( my $station

View file

@ -197,6 +197,18 @@ sub add {
return ( $journey_id, undef );
}
sub add_from_in_transit {
my ( $self, %opt ) = @_;
my $db = $opt{db};
my $journey = $opt{journey};
delete $journey->{data};
$journey->{edited} = 0;
$journey->{checkout_time} = DateTime->now( time_zone => 'Europe/Berlin' );
$db->insert( 'journeys', $journey );
}
sub update {
my ( $self, %opt ) = @_;
@ -414,6 +426,34 @@ sub delete {
return sprintf( 'Deleted %d rows, expected 1', $rows );
}
# Used for undo (move journey entry to in_transit)
sub pop {
my ( $self, %opt ) = @_;
my $uid = $opt{uid};
my $db = $opt{db};
my $journey_id = $opt{journey_id};
my $journey = $db->select(
'journeys',
'*',
{
user_id => $uid,
id => $journey_id
}
)->hash;
$db->delete(
'journeys',
{
user_id => $uid,
id => $journey_id
}
);
return $journey;
}
sub get {
my ( $self, %opt ) = @_;
@ -564,6 +604,40 @@ sub get_single {
return $journeys[0];
}
sub get_latest {
my ( $self, %opt ) = @_;
my $uid = $opt{uid};
my $db = $opt{db} // $self->{pg}->db;
my $latest_successful = $db->select(
'journeys_str',
'*',
{
user_id => $uid,
cancelled => 0
},
{
order_by => { -desc => 'journey_id' },
limit => 1
}
)->expand->hash;
my $latest = $db->select(
'journeys_str',
'*',
{
user_id => $uid,
},
{
order_by => { -desc => 'journey_id' },
limit => 1
}
)->expand->hash;
return ( $latest_successful, $latest );
}
sub get_oldest_ts {
my ( $self, %opt ) = @_;
my $uid = $opt{uid};
@ -589,6 +663,72 @@ sub get_oldest_ts {
return undef;
}
sub get_latest_checkout_station_id {
my ( $self, %opt ) = @_;
my $uid = $opt{uid};
my $db = $opt{db} // $self->{pg}->db;
my $res_h = $db->select(
'journeys',
['checkout_station_id'],
{
user_id => $uid,
cancelled => 0
},
{
limit => 1,
order_by => { -desc => 'real_departure' }
}
)->hash;
if ( not $res_h ) {
return;
}
return $res_h->{checkout_station_id};
}
sub get_years {
my ( $self, %opt ) = @_;
my $uid = $opt{uid};
my $db = $opt{db} // $self->{pg}->db;
my $res = $db->select(
'journeys',
'distinct extract(year from real_departure) as year',
{ user_id => $uid },
{ order_by => { -asc => 'year' } }
);
my @ret;
for my $row ( $res->hashes->each ) {
push( @ret, [ $row->{year}, $row->{year} ] );
}
return @ret;
}
sub get_months {
my ( $self, %opt ) = @_;
my $uid = $opt{uid};
my $db = $opt{db} // $self->{pg}->db;
my $res = $db->select(
'journeys',
"distinct to_char(real_departure, 'YYYY.MM') as yearmonth",
{ user_id => $uid },
{ order_by => { -asc => 'yearmonth' } }
);
my @ret;
for my $row ( $res->hashes->each ) {
my ( $year, $month ) = split( qr{[.]}, $row->{yearmonth} );
push( @ret, [ "${year}/${month}", "${month}.${year}" ] );
}
return @ret;
}
sub sanity_check {
my ( $self, $journey, $lax ) = @_;

View file

@ -1,7 +1,7 @@
<div class="row">
<div class="col s12">
<ul class="pagination">
% for my $month (history_months()) {
% for my $month (journeys->get_months(uid => current_user->{id})) {
% my $link_to = $month->[0];
% my $text = $month->[1];
% my $class = $link_to eq $current ? 'active' : 'waves-effect';

View file

@ -1,7 +1,7 @@
<div class="row">
<div class="col s12">
<ul class="pagination">
% for my $year (history_years()) {
% for my $year (journeys->get_years(uid => current_user->{id})) {
% my $link_to = $year->[0];
% my $text = $year->[1];
% my $class = $link_to eq $current ? 'active' : 'waves-effect';