Loading lib/Travelynx/Command/database.pm +14 −0 Original line number Diff line number Diff line Loading @@ -1915,6 +1915,20 @@ my @migrations = ( } ); }, # v49 -> v50 # travelynx 2.0 introduced proper HAFAS support, so there is no need for # the 'FYI, here is some hAFAS data' kludge anymore. sub { my ($db) = @_; $db->query( qq{ drop view user_transit; drop table localtransit; update schema_version set version = 50; } ); }, ); sub sync_stations { Loading lib/Travelynx/Controller/Account.pm +6 −24 Original line number Diff line number Diff line Loading @@ -800,10 +800,7 @@ sub insight { my ($self) = @_; my $user = $self->current_user; my ( $use_history, $destinations ) = $self->users->use_history( uid => $user->{id}, with_local_transit => 1 ); my $use_history = $self->users->use_history( uid => $user->{id} ); if ( $self->param('action') and $self->param('action') eq 'save' ) { if ( $self->param('on_departure') ) { Loading @@ -820,22 +817,9 @@ sub insight { $use_history &= ~0x02; } if ( $self->param('local_transit') ) { $use_history |= 0x04; } else { $use_history &= ~0x04; } if ( $self->param('destinations') ) { $destinations = [ split( qr{\r?\n\r?}, $self->param('destinations') ) ]; } $self->users->use_history( uid => $user->{id}, set => $use_history, destinations => $destinations set => $use_history ); $self->flash( success => 'use_history' ); $self->redirect_to('account'); Loading @@ -843,8 +827,6 @@ sub insight { $self->param( on_departure => $use_history & 0x01 ? 1 : 0 ); $self->param( on_arrival => $use_history & 0x02 ? 1 : 0 ); $self->param( local_transit => $use_history & 0x04 ? 1 : 0 ); $self->param( destinations => join( "\n", @{$destinations} ) ); $self->render('use_history'); } Loading lib/Travelynx/Controller/Traveling.pm +69 −77 Original line number Diff line number Diff line Loading @@ -28,10 +28,7 @@ sub get_connecting_trains_p { my ( $self, %opt ) = @_; my $uid = $opt{uid} //= $self->current_user->{id}; my ( $use_history, $lt_stops ) = $self->users->use_history( uid => $uid, with_local_transit => 1 ); my $use_history = $self->users->use_history( uid => $uid ); my ( $eva, $exclude_via, $exclude_train_id, $exclude_before ); my $now = $self->now->epoch; Loading Loading @@ -68,13 +65,14 @@ sub get_connecting_trains_p { return $promise->reject; } my @destinations = $self->journeys->get_connection_targets(%opt); my @destinations = uniq_by { $_->{name} } $self->journeys->get_connection_targets(%opt); if ($exclude_via) { @destinations = grep { $_ ne $exclude_via } @destinations; @destinations = grep { $_->{name} ne $exclude_via } @destinations; } if ( not( @destinations or $use_history & 0x04 and @{$lt_stops} ) ) { if ( not @destinations ) { return $promise->reject; } Loading @@ -83,8 +81,11 @@ sub get_connecting_trains_p { = $can_check_in ? 40 : ( ( ${arr_countdown} // 0 ) / 60 + 40 ); my $iris_promise = Mojo::Promise->new; my %via_count = map { $_->{name} => 0 } @destinations; if (@destinations) { if ( $eva >= 8000000 and List::Util::any { $_->{eva} >= 8000000 } @destinations ) { $self->iris->get_departures_p( station => $eva, lookbehind => 10, Loading @@ -94,7 +95,7 @@ sub get_connecting_trains_p { sub { my ($stationboard) = @_; if ( $stationboard->{errstr} ) { $iris_promise->reject( $stationboard->{errstr} ); $iris_promise->resolve( [] ); return; } Loading @@ -105,7 +106,6 @@ sub get_connecting_trains_p { my @results; my @cancellations; my $excluded_train; my %via_count = map { $_ => 0 } @destinations; for my $train ( @{ $stationboard->{results} } ) { if ( not $train->departure ) { next; Loading Loading @@ -144,7 +144,7 @@ sub get_connecting_trains_p { $train->sched_route_post, $train->sched_route_end ); for my $dest (@destinations) { if ( has_str_in_list( $dest, @via ) ) { if ( has_str_in_list( $dest->{name}, @via ) ) { push( @cancellations, [ $train, $dest ] ); next; } Loading @@ -153,8 +153,8 @@ sub get_connecting_trains_p { else { my @via = ( $train->route_post, $train->route_end ); for my $dest (@destinations) { if ( $via_count{$dest} < 2 and has_str_in_list( $dest, @via ) ) if ( $via_count{ $dest->{name} } < 2 and has_str_in_list( $dest->{name}, @via ) ) { push( @results, [ $train, $dest ] ); Loading @@ -162,7 +162,7 @@ sub get_connecting_trains_p { if ( not $train->departure or $train->departure->epoch >= $now ) { $via_count{$dest}++; $via_count{ $dest->{name} }++; } next; } Loading Loading @@ -234,7 +234,7 @@ sub get_connecting_trains_p { } )->catch( sub { $iris_promise->reject(@_); $iris_promise->resolve( [] ); return; } )->wait; Loading Loading @@ -267,8 +267,8 @@ sub get_connecting_trains_p { sub { my ( $iris, $hafas ) = @_; my @iris_trains = @{ $iris->[0] }; my @hafas_trains = @{ $hafas->[0] }; my @transit_fyi; my @all_hafas_trains = @{ $hafas->[0] }; my @hafas_trains; # We've already got a list of connecting trains; this function # only adds further information to them. We ignore errors, as Loading @@ -278,11 +278,12 @@ sub get_connecting_trains_p { if ( $iris_train->[0]->departure_is_cancelled ) { next; } for my $hafas_train (@hafas_trains) { for my $hafas_train (@all_hafas_trains) { if ( $hafas_train->number and $hafas_train->number == $iris_train->[0]->train_no ) { $hafas_train->{iris_seen} = 1; if ( $hafas_train->load and $hafas_train->load->{SECOND} ) { Loading @@ -290,7 +291,8 @@ sub get_connecting_trains_p { } for my $stop ( $hafas_train->route ) { if ( $stop->{name} and $stop->{name} eq $iris_train->[1] and $stop->{name} eq $iris_train->[1]->{name} and $stop->{arr} ) { $iris_train->[2] = $stop->{arr}; Loading @@ -308,14 +310,15 @@ sub get_connecting_trains_p { } } } if ( $use_history & 0x04 and @{$lt_stops} ) { my %via_count = map { $_ => 0 } @{$lt_stops}; for my $hafas_train (@hafas_trains) { for my $hafas_train (@all_hafas_trains) { if ( $hafas_train->{iris_seen} ) { next; } for my $stop ( $hafas_train->route ) { for my $dest ( @{$lt_stops} ) { for my $dest (@destinations) { if ( $stop->{name} and $stop->{name} eq $dest and $via_count{$dest} < 2 and $stop->{name} eq $dest->{name} and $via_count{ $dest->{name} } < 2 and $hafas_train->datetime ) { my $departure = $hafas_train->datetime; Loading @@ -326,21 +329,10 @@ sub get_connecting_trains_p { { $arrival->add( minutes => $delay ); } if ( $departure->epoch >= $exclude_before ) { $via_count{$dest}++; push( @transit_fyi, [ { line => $hafas_train->line, departure => $departure, departure_delay => $delay }, $dest, $arrival ] ); } if ( $departure->epoch >= $exclude_before ) { $via_count{ $dest->{name} }++; push( @hafas_trains, [ $hafas_train, $dest, $arrival ] ); } } } Loading @@ -353,14 +345,12 @@ sub get_connecting_trains_p { ); } $promise->resolve( \@iris_trains, \@transit_fyi ); $promise->resolve( \@iris_trains, \@hafas_trains ); return; } )->catch( sub { my ($err) = @_; # TODO logging. HAFAS errors should never happen, IRIS errors are noteworthy too. $promise->reject($err); return; } Loading Loading @@ -401,13 +391,13 @@ sub homepage { $self->render_later; $self->get_connecting_trains_p->then( sub { my ( $connecting_trains, $transit_fyi ) = @_; my ( $connections_iris, $connections_hafas ) = @_; $self->render( 'landingpage', user_status => $status, journey_visibility => $journey_visibility, connections => $connecting_trains, transit_fyi => $transit_fyi, connections_iris => $connections_iris, connections_hafas => $connections_hafas, ); $self->users->mark_seen( uid => $uid ); } Loading Loading @@ -474,13 +464,13 @@ sub status_card { $self->render_later; $self->get_connecting_trains_p->then( sub { my ( $connecting_trains, $transit_fyi ) = @_; my ( $connections_iris, $connections_hafas ) = @_; $self->render( '_checked_in', journey => $status, journey_visibility => $journey_visibility, connections => $connecting_trains, transit_fyi => $transit_fyi connections_iris => $connections_iris, connections_hafas => $connections_hafas, ); } )->catch( Loading Loading @@ -511,7 +501,7 @@ sub status_card { $self->render( '_cancelled_departure', journey => $status->{cancellation}, connections => $connecting_trains connections_iris => $connecting_trains ); } )->catch( Loading @@ -529,11 +519,12 @@ sub status_card { $self->render_later; $self->get_connecting_trains_p->then( sub { my ($connecting_trains) = @_; my ( $connections_iris, $connections_hafas ) = @_; $self->render( '_checked_out', journey => $status, connections => $connecting_trains connections_iris => $connections_iris, connections_hafas => $connections_hafas, ); } )->catch( Loading Loading @@ -1028,7 +1019,7 @@ sub station { if ($connections_p) { $connections_p->then( sub { my ($connecting_trains) = @_; my ( $connections_iris, $connections_hafas ) = @_; $self->render( 'departures', eva => $status->{station_eva}, Loading @@ -1038,7 +1029,8 @@ sub station { related_stations => $status->{related_stations}, user_status => $user_status, can_check_out => $can_check_out, connections => $connecting_trains, connections_iris => $connections_iris, connections_hafas => $connections_hafas, api_link => $api_link, title => "travelynx: $status->{station_name}", ); Loading lib/Travelynx/Model/Journeys.pm +1 −2 Original line number Diff line number Diff line Loading @@ -1726,7 +1726,7 @@ sub get_connection_targets { my $min_count = $opt{min_count} // 3; if ( $opt{destination_name} ) { return ( $opt{destination_name} ); return ( { eva => $opt{eva}, name => $opt{destination_name} } ); } my $dest_id = $opt{eva} // $self->get_latest_dest_id(%opt); Loading Loading @@ -1755,7 +1755,6 @@ sub get_connection_targets { = $res->hashes->grep( sub { shift->{count} >= $min_count } ) ->map( sub { shift->{dest} } )->each; @destinations = $self->{stations}->get_by_evas(@destinations); @destinations = map { $_->{name} } @destinations; return @destinations; } Loading lib/Travelynx/Model/Users.pm +2 −25 Original line number Diff line number Diff line Loading @@ -567,7 +567,6 @@ sub delete { $res{transit} = $db->delete( 'in_transit', { user_id => $uid } ); $res{hooks} = $db->delete( 'webhooks', { user_id => $uid } ); $res{trwl} = $db->delete( 'traewelling', { user_id => $uid } ); $res{lt} = $db->delete( 'localtransit', { user_id => $uid } ); $res{password} = $db->delete( 'pending_passwords', { user_id => $uid } ); $res{relations} = $db->delete( 'relations', [ { subject_id => $uid }, { object_id => $uid } ] ); Loading Loading @@ -651,36 +650,14 @@ sub use_history { my $uid = $opt{uid}; my $value = $opt{set}; if ( $opt{destinations} ) { $db->insert( 'localtransit', { user_id => $uid, data => JSON->new->encode( { destinations => $opt{destinations} } ) }, { on_conflict => \'(user_id) do update set data = EXCLUDED.data' } ); } if ($value) { $db->update( 'users', { use_history => $value }, { id => $uid } ); } else { if ( $opt{with_local_transit} ) { my $res = $db->select( 'user_transit', [ 'use_history', 'data' ], { id => $uid } )->expand->hash; return ( $res->{use_history}, $res->{data}{destinations} // [] ); } else { return $db->select( 'users', ['use_history'], { id => $uid } ) ->hash->{use_history}; } } } sub use_external_services { my ( $self, %opt ) = @_; Loading Loading
lib/Travelynx/Command/database.pm +14 −0 Original line number Diff line number Diff line Loading @@ -1915,6 +1915,20 @@ my @migrations = ( } ); }, # v49 -> v50 # travelynx 2.0 introduced proper HAFAS support, so there is no need for # the 'FYI, here is some hAFAS data' kludge anymore. sub { my ($db) = @_; $db->query( qq{ drop view user_transit; drop table localtransit; update schema_version set version = 50; } ); }, ); sub sync_stations { Loading
lib/Travelynx/Controller/Account.pm +6 −24 Original line number Diff line number Diff line Loading @@ -800,10 +800,7 @@ sub insight { my ($self) = @_; my $user = $self->current_user; my ( $use_history, $destinations ) = $self->users->use_history( uid => $user->{id}, with_local_transit => 1 ); my $use_history = $self->users->use_history( uid => $user->{id} ); if ( $self->param('action') and $self->param('action') eq 'save' ) { if ( $self->param('on_departure') ) { Loading @@ -820,22 +817,9 @@ sub insight { $use_history &= ~0x02; } if ( $self->param('local_transit') ) { $use_history |= 0x04; } else { $use_history &= ~0x04; } if ( $self->param('destinations') ) { $destinations = [ split( qr{\r?\n\r?}, $self->param('destinations') ) ]; } $self->users->use_history( uid => $user->{id}, set => $use_history, destinations => $destinations set => $use_history ); $self->flash( success => 'use_history' ); $self->redirect_to('account'); Loading @@ -843,8 +827,6 @@ sub insight { $self->param( on_departure => $use_history & 0x01 ? 1 : 0 ); $self->param( on_arrival => $use_history & 0x02 ? 1 : 0 ); $self->param( local_transit => $use_history & 0x04 ? 1 : 0 ); $self->param( destinations => join( "\n", @{$destinations} ) ); $self->render('use_history'); } Loading
lib/Travelynx/Controller/Traveling.pm +69 −77 Original line number Diff line number Diff line Loading @@ -28,10 +28,7 @@ sub get_connecting_trains_p { my ( $self, %opt ) = @_; my $uid = $opt{uid} //= $self->current_user->{id}; my ( $use_history, $lt_stops ) = $self->users->use_history( uid => $uid, with_local_transit => 1 ); my $use_history = $self->users->use_history( uid => $uid ); my ( $eva, $exclude_via, $exclude_train_id, $exclude_before ); my $now = $self->now->epoch; Loading Loading @@ -68,13 +65,14 @@ sub get_connecting_trains_p { return $promise->reject; } my @destinations = $self->journeys->get_connection_targets(%opt); my @destinations = uniq_by { $_->{name} } $self->journeys->get_connection_targets(%opt); if ($exclude_via) { @destinations = grep { $_ ne $exclude_via } @destinations; @destinations = grep { $_->{name} ne $exclude_via } @destinations; } if ( not( @destinations or $use_history & 0x04 and @{$lt_stops} ) ) { if ( not @destinations ) { return $promise->reject; } Loading @@ -83,8 +81,11 @@ sub get_connecting_trains_p { = $can_check_in ? 40 : ( ( ${arr_countdown} // 0 ) / 60 + 40 ); my $iris_promise = Mojo::Promise->new; my %via_count = map { $_->{name} => 0 } @destinations; if (@destinations) { if ( $eva >= 8000000 and List::Util::any { $_->{eva} >= 8000000 } @destinations ) { $self->iris->get_departures_p( station => $eva, lookbehind => 10, Loading @@ -94,7 +95,7 @@ sub get_connecting_trains_p { sub { my ($stationboard) = @_; if ( $stationboard->{errstr} ) { $iris_promise->reject( $stationboard->{errstr} ); $iris_promise->resolve( [] ); return; } Loading @@ -105,7 +106,6 @@ sub get_connecting_trains_p { my @results; my @cancellations; my $excluded_train; my %via_count = map { $_ => 0 } @destinations; for my $train ( @{ $stationboard->{results} } ) { if ( not $train->departure ) { next; Loading Loading @@ -144,7 +144,7 @@ sub get_connecting_trains_p { $train->sched_route_post, $train->sched_route_end ); for my $dest (@destinations) { if ( has_str_in_list( $dest, @via ) ) { if ( has_str_in_list( $dest->{name}, @via ) ) { push( @cancellations, [ $train, $dest ] ); next; } Loading @@ -153,8 +153,8 @@ sub get_connecting_trains_p { else { my @via = ( $train->route_post, $train->route_end ); for my $dest (@destinations) { if ( $via_count{$dest} < 2 and has_str_in_list( $dest, @via ) ) if ( $via_count{ $dest->{name} } < 2 and has_str_in_list( $dest->{name}, @via ) ) { push( @results, [ $train, $dest ] ); Loading @@ -162,7 +162,7 @@ sub get_connecting_trains_p { if ( not $train->departure or $train->departure->epoch >= $now ) { $via_count{$dest}++; $via_count{ $dest->{name} }++; } next; } Loading Loading @@ -234,7 +234,7 @@ sub get_connecting_trains_p { } )->catch( sub { $iris_promise->reject(@_); $iris_promise->resolve( [] ); return; } )->wait; Loading Loading @@ -267,8 +267,8 @@ sub get_connecting_trains_p { sub { my ( $iris, $hafas ) = @_; my @iris_trains = @{ $iris->[0] }; my @hafas_trains = @{ $hafas->[0] }; my @transit_fyi; my @all_hafas_trains = @{ $hafas->[0] }; my @hafas_trains; # We've already got a list of connecting trains; this function # only adds further information to them. We ignore errors, as Loading @@ -278,11 +278,12 @@ sub get_connecting_trains_p { if ( $iris_train->[0]->departure_is_cancelled ) { next; } for my $hafas_train (@hafas_trains) { for my $hafas_train (@all_hafas_trains) { if ( $hafas_train->number and $hafas_train->number == $iris_train->[0]->train_no ) { $hafas_train->{iris_seen} = 1; if ( $hafas_train->load and $hafas_train->load->{SECOND} ) { Loading @@ -290,7 +291,8 @@ sub get_connecting_trains_p { } for my $stop ( $hafas_train->route ) { if ( $stop->{name} and $stop->{name} eq $iris_train->[1] and $stop->{name} eq $iris_train->[1]->{name} and $stop->{arr} ) { $iris_train->[2] = $stop->{arr}; Loading @@ -308,14 +310,15 @@ sub get_connecting_trains_p { } } } if ( $use_history & 0x04 and @{$lt_stops} ) { my %via_count = map { $_ => 0 } @{$lt_stops}; for my $hafas_train (@hafas_trains) { for my $hafas_train (@all_hafas_trains) { if ( $hafas_train->{iris_seen} ) { next; } for my $stop ( $hafas_train->route ) { for my $dest ( @{$lt_stops} ) { for my $dest (@destinations) { if ( $stop->{name} and $stop->{name} eq $dest and $via_count{$dest} < 2 and $stop->{name} eq $dest->{name} and $via_count{ $dest->{name} } < 2 and $hafas_train->datetime ) { my $departure = $hafas_train->datetime; Loading @@ -326,21 +329,10 @@ sub get_connecting_trains_p { { $arrival->add( minutes => $delay ); } if ( $departure->epoch >= $exclude_before ) { $via_count{$dest}++; push( @transit_fyi, [ { line => $hafas_train->line, departure => $departure, departure_delay => $delay }, $dest, $arrival ] ); } if ( $departure->epoch >= $exclude_before ) { $via_count{ $dest->{name} }++; push( @hafas_trains, [ $hafas_train, $dest, $arrival ] ); } } } Loading @@ -353,14 +345,12 @@ sub get_connecting_trains_p { ); } $promise->resolve( \@iris_trains, \@transit_fyi ); $promise->resolve( \@iris_trains, \@hafas_trains ); return; } )->catch( sub { my ($err) = @_; # TODO logging. HAFAS errors should never happen, IRIS errors are noteworthy too. $promise->reject($err); return; } Loading Loading @@ -401,13 +391,13 @@ sub homepage { $self->render_later; $self->get_connecting_trains_p->then( sub { my ( $connecting_trains, $transit_fyi ) = @_; my ( $connections_iris, $connections_hafas ) = @_; $self->render( 'landingpage', user_status => $status, journey_visibility => $journey_visibility, connections => $connecting_trains, transit_fyi => $transit_fyi, connections_iris => $connections_iris, connections_hafas => $connections_hafas, ); $self->users->mark_seen( uid => $uid ); } Loading Loading @@ -474,13 +464,13 @@ sub status_card { $self->render_later; $self->get_connecting_trains_p->then( sub { my ( $connecting_trains, $transit_fyi ) = @_; my ( $connections_iris, $connections_hafas ) = @_; $self->render( '_checked_in', journey => $status, journey_visibility => $journey_visibility, connections => $connecting_trains, transit_fyi => $transit_fyi connections_iris => $connections_iris, connections_hafas => $connections_hafas, ); } )->catch( Loading Loading @@ -511,7 +501,7 @@ sub status_card { $self->render( '_cancelled_departure', journey => $status->{cancellation}, connections => $connecting_trains connections_iris => $connecting_trains ); } )->catch( Loading @@ -529,11 +519,12 @@ sub status_card { $self->render_later; $self->get_connecting_trains_p->then( sub { my ($connecting_trains) = @_; my ( $connections_iris, $connections_hafas ) = @_; $self->render( '_checked_out', journey => $status, connections => $connecting_trains connections_iris => $connections_iris, connections_hafas => $connections_hafas, ); } )->catch( Loading Loading @@ -1028,7 +1019,7 @@ sub station { if ($connections_p) { $connections_p->then( sub { my ($connecting_trains) = @_; my ( $connections_iris, $connections_hafas ) = @_; $self->render( 'departures', eva => $status->{station_eva}, Loading @@ -1038,7 +1029,8 @@ sub station { related_stations => $status->{related_stations}, user_status => $user_status, can_check_out => $can_check_out, connections => $connecting_trains, connections_iris => $connections_iris, connections_hafas => $connections_hafas, api_link => $api_link, title => "travelynx: $status->{station_name}", ); Loading
lib/Travelynx/Model/Journeys.pm +1 −2 Original line number Diff line number Diff line Loading @@ -1726,7 +1726,7 @@ sub get_connection_targets { my $min_count = $opt{min_count} // 3; if ( $opt{destination_name} ) { return ( $opt{destination_name} ); return ( { eva => $opt{eva}, name => $opt{destination_name} } ); } my $dest_id = $opt{eva} // $self->get_latest_dest_id(%opt); Loading Loading @@ -1755,7 +1755,6 @@ sub get_connection_targets { = $res->hashes->grep( sub { shift->{count} >= $min_count } ) ->map( sub { shift->{dest} } )->each; @destinations = $self->{stations}->get_by_evas(@destinations); @destinations = map { $_->{name} } @destinations; return @destinations; } Loading
lib/Travelynx/Model/Users.pm +2 −25 Original line number Diff line number Diff line Loading @@ -567,7 +567,6 @@ sub delete { $res{transit} = $db->delete( 'in_transit', { user_id => $uid } ); $res{hooks} = $db->delete( 'webhooks', { user_id => $uid } ); $res{trwl} = $db->delete( 'traewelling', { user_id => $uid } ); $res{lt} = $db->delete( 'localtransit', { user_id => $uid } ); $res{password} = $db->delete( 'pending_passwords', { user_id => $uid } ); $res{relations} = $db->delete( 'relations', [ { subject_id => $uid }, { object_id => $uid } ] ); Loading Loading @@ -651,36 +650,14 @@ sub use_history { my $uid = $opt{uid}; my $value = $opt{set}; if ( $opt{destinations} ) { $db->insert( 'localtransit', { user_id => $uid, data => JSON->new->encode( { destinations => $opt{destinations} } ) }, { on_conflict => \'(user_id) do update set data = EXCLUDED.data' } ); } if ($value) { $db->update( 'users', { use_history => $value }, { id => $uid } ); } else { if ( $opt{with_local_transit} ) { my $res = $db->select( 'user_transit', [ 'use_history', 'data' ], { id => $uid } )->expand->hash; return ( $res->{use_history}, $res->{data}{destinations} // [] ); } else { return $db->select( 'users', ['use_history'], { id => $uid } ) ->hash->{use_history}; } } } sub use_external_services { my ( $self, %opt ) = @_; Loading