diff options
| -rw-r--r-- | lib/Travelynx/Model/InTransit.pm | 50 | 
1 files changed, 48 insertions, 2 deletions
| diff --git a/lib/Travelynx/Model/InTransit.pm b/lib/Travelynx/Model/InTransit.pm index 38db5ec..6b1b911 100644 --- a/lib/Travelynx/Model/InTransit.pm +++ b/lib/Travelynx/Model/InTransit.pm @@ -17,6 +17,31 @@ sub new {  	return bless( \%opt, $class );  } +# merge [name, eva, data] from old_route into [name, undef, undef] from new_route. +# If new_route already has eva/data, it is kept as-is. +# changes new_route. +sub _merge_old_route { +	my ( $self, %opt ) = @_; +	my $db        = $opt{db}; +	my $uid       = $opt{uid}; +	my $new_route = $opt{route}; + +	my $res_h = $db->select( 'in_transit', ['route'], { user_id => $uid } ) +	  ->expand->hash; +	my $old_route = $res_h ? $res_h->{route} : []; + +	for my $i ( 0 .. $#{$new_route} ) { +		if ( $old_route->[$i] and $old_route->[$i][0] eq $new_route->[$i][0] ) { +			$new_route->[$i][1] //= $old_route->[$i][1]; +			if ( not keys %{ $new_route->[$i][2] // {} } ) { +				$new_route->[$i][2] = $old_route->[$i][2]; +			} +		} +	} + +	return $new_route; +} +  sub add {  	my ( $self, %opt ) = @_; @@ -157,6 +182,12 @@ sub set_arrival {  	my $train = $opt{train};  	my $route = $opt{route}; +	$route = $self->_merge_old_route( +		db    => $db, +		uid   => $uid, +		route => $route +	); +  	my $json = JSON->new;  	$db->update( @@ -242,6 +273,7 @@ sub set_route_data {  	$data->{qos_msg}   = $opt{qos_messages};  	$data->{him_msg}   = $opt{him_messages}; +	# no need to merge $route, it already contains HAFAS data  	$db->update(  		'in_transit',  		{ @@ -274,8 +306,15 @@ sub update_departure {  	my $uid   = $opt{uid};  	my $db    = $opt{db} // $self->{pg}->db;  	my $train = $opt{train}; +	my $route = $opt{route};  	my $json  = JSON->new; +	$route = $self->_merge_old_route( +		db    => $db, +		uid   => $uid, +		route => $route +	); +  	# selecting on user_id and train_no avoids a race condition if a user checks  	# into a new train while we are fetching data for their previous journey. In  	# this case, the new train would receive data from the previous journey. @@ -284,7 +323,7 @@ sub update_departure {  		{  			dep_platform   => $train->platform,  			real_departure => $train->departure, -			route          => $json->encode( $opt{route} ), +			route          => $json->encode($route),  			messages       => $json->encode(  				[ map { [ $_->[0]->epoch, $_->[1] ] } $train->messages ]  			), @@ -330,8 +369,15 @@ sub update_arrival {  	my $db      = $opt{db} // $self->{pg}->db;  	my $arr_eva = $opt{arr_eva};  	my $train   = $opt{train}; +	my $route   = $opt{route};  	my $json    = JSON->new; +	$route = $self->_merge_old_route( +		db    => $db, +		uid   => $uid, +		route => $route +	); +  	# selecting on user_id, train_no and checkout_station_id avoids a  	# race condition when a user checks into a new train or changes  	# their destination station while we are fetching times based on no @@ -342,7 +388,7 @@ sub update_arrival {  			arr_platform  => $train->platform,  			sched_arrival => $train->sched_arrival,  			real_arrival  => $train->arrival, -			route         => $json->encode( $opt{route} ), +			route         => $json->encode($route),  			messages      => $json->encode(  				[ map { [ $_->[0]->epoch, $_->[1] ] } $train->messages ]  			), | 
