diff options
Diffstat (limited to 'lib/Travelynx/Model')
| -rw-r--r-- | lib/Travelynx/Model/InTransit.pm | 171 | ||||
| -rwxr-xr-x | lib/Travelynx/Model/Journeys.pm | 5 | ||||
| -rw-r--r-- | lib/Travelynx/Model/Stations.pm | 63 | ||||
| -rw-r--r-- | lib/Travelynx/Model/Users.pm | 3 | 
4 files changed, 224 insertions, 18 deletions
| diff --git a/lib/Travelynx/Model/InTransit.pm b/lib/Travelynx/Model/InTransit.pm index cc943b3..470b45d 100644 --- a/lib/Travelynx/Model/InTransit.pm +++ b/lib/Travelynx/Model/InTransit.pm @@ -110,8 +110,6 @@ sub add {  	my $now  = DateTime->now( time_zone => 'Europe/Berlin' );  	if ($train) { - -		# IRIS  		$db->insert(  			'in_transit',  			{ @@ -142,9 +140,60 @@ sub add {  			}  		);  	} -	elsif ( $journey and $stop and $journey->can('product') ) { - -		# HAFAS +	elsif ( $journey +		and $stop +		and ref($journey) eq 'Travel::Status::DE::EFA::Trip' ) +	{ +		my @route; +		for my $j_stop ( $journey->route ) { +			push( +				@route, +				[ +					$j_stop->full_name, +					$j_stop->id_num, +					{ +						sched_arr => _epoch( $j_stop->sched_arr ), +						sched_dep => _epoch( $j_stop->sched_dep ), +						rt_arr    => _epoch( $j_stop->rt_arr ), +						rt_dep    => _epoch( $j_stop->rt_dep ), +						arr_delay => $j_stop->arr_delay, +						dep_delay => $j_stop->dep_delay, +						efa_load  => $j_stop->occupancy, +						lat       => $j_stop->latlon->[0], +						lon       => $j_stop->latlon->[1], +					} +				] +			); +		} +		$db->insert( +			'in_transit', +			{ +				user_id            => $uid, +				cancelled          => 0,                                  # TODO +				checkin_station_id => $stop->id_num, +				checkin_time       => $now, +				dep_platform       => $stop->platform, +				train_type         => $journey->type // q{}, +				train_line         => $journey->line, +				train_no           => $journey->number // q{}, +				train_id           => $opt{trip_id}, +				sched_departure    => $stop->sched_dep, +				real_departure     => $stop->rt_dep // $stop->sched_dep, +				route              => $json->encode( \@route ), +				data               => JSON->new->encode( +					{ +						rt => $stop->rt_dep ? 1 : 0, +						%{ $data // {} } +					} +				), +				backend_id => $backend_id, +			} +		); +	} +	elsif ( $journey +		and $stop +		and ref($journey) eq 'Travel::Status::DE::HAFAS::Journey' ) +	{  		my @route;  		my $product = $journey->product_at( $stop->loc->eva )  		  // $journey->product; @@ -198,9 +247,10 @@ sub add {  			}  		);  	} -	elsif ( $journey and $stop ) { - -		# DBRIS +	elsif ( $journey +		and $stop +		and ref($journey) eq 'Travel::Status::DE::DBRIS::Journey' ) +	{  		my $number = $journey->train_no // $journey->number // $train_suffix;  		my $line; @@ -284,9 +334,10 @@ sub add {  			}  		);  	} -	elsif ( $journey and $stopover ) { - -		# MOTIS +	elsif ( $journey +		and $stopover +		and ref($journey) eq 'Travel::Status::MOTIS::Trip' ) +	{  		my @route;  		for my $journey_stopover ( $journey->stopovers ) {  			push( @@ -340,7 +391,7 @@ sub add {  		);  	}  	else { -		die('neither train nor journey specified'); +		die('invalid arguments / argument types passed to InTransit->add');  	}  } @@ -944,6 +995,41 @@ sub update_departure_dbris {  	);  } +sub update_departure_efa { +	my ( $self, %opt ) = @_; +	my $uid     = $opt{uid}; +	my $db      = $opt{db} // $self->{pg}->db; +	my $dep_eva = $opt{dep_eva}; +	my $arr_eva = $opt{arr_eva}; +	my $journey = $opt{journey}; +	my $stop    = $opt{stop}; +	my $json    = JSON->new; + +	my $res_h = $db->select( 'in_transit', ['data'], { user_id => $uid } ) +	  ->expand->hash; +	my $ephemeral_data = $res_h ? $res_h->{data} : {}; +	if ( $stop->rt_dep ) { +		$ephemeral_data->{rt} = 1; +	} + +	# 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. +	$db->update( +		'in_transit', +		{ +			data           => $json->encode($ephemeral_data), +			real_departure => $stop->rt_dep, +		}, +		{ +			user_id             => $uid, +			train_id            => $opt{trip_id}, +			checkin_station_id  => $dep_eva, +			checkout_station_id => $arr_eva, +		} +	); +} +  sub update_departure_motis {  	my ( $self, %opt ) = @_;  	my $uid      = $opt{uid}; @@ -1137,6 +1223,67 @@ sub update_arrival_dbris {  	);  } +sub update_arrival_efa { +	my ( $self, %opt ) = @_; +	my $uid     = $opt{uid}; +	my $db      = $opt{db} // $self->{pg}->db; +	my $dep_eva = $opt{dep_eva}; +	my $arr_eva = $opt{arr_eva}; +	my $journey = $opt{journey}; +	my $stop    = $opt{stop}; +	my $json    = JSON->new; + +	my $res_h +	  = $db->select( 'in_transit', [ 'data', 'route' ], { user_id => $uid } ) +	  ->expand->hash; +	my $ephemeral_data = $res_h ? $res_h->{data}  : {}; +	my $old_route      = $res_h ? $res_h->{route} : []; + +	if ( $stop->rt_arr ) { +		$ephemeral_data->{rt} = 1; +	} + +	my @route; +	for my $j_stop ( $journey->route ) { +		push( +			@route, +			[ +				$j_stop->full_name, +				$j_stop->id_num, +				{ +					sched_arr => _epoch( $j_stop->sched_arr ), +					sched_dep => _epoch( $j_stop->sched_dep ), +					rt_arr    => _epoch( $j_stop->rt_arr ), +					rt_dep    => _epoch( $j_stop->rt_dep ), +					arr_delay => $j_stop->arr_delay, +					dep_delay => $j_stop->dep_delay, +					efa_load  => $j_stop->occupancy, +					lat       => $j_stop->latlon->[0], +					lon       => $j_stop->latlon->[1], +				} +			] +		); +	} + +	# 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. +	$db->update( +		'in_transit', +		{ +			data         => $json->encode($ephemeral_data), +			real_arrival => $stop->rt_arr, +			route        => $json->encode( [@route] ), +		}, +		{ +			user_id             => $uid, +			train_id            => $opt{trip_id}, +			checkin_station_id  => $dep_eva, +			checkout_station_id => $arr_eva, +		} +	); +} +  sub update_arrival_motis {  	my ( $self, %opt ) = @_;  	my $uid      = $opt{uid}; diff --git a/lib/Travelynx/Model/Journeys.pm b/lib/Travelynx/Model/Journeys.pm index 8efbab2..1662787 100755 --- a/lib/Travelynx/Model/Journeys.pm +++ b/lib/Travelynx/Model/Journeys.pm @@ -1735,6 +1735,8 @@ sub compute_stats {  sub get_stats {  	my ( $self, %opt ) = @_; +	$self->{log}->debug("get_stats"); +  	if ( $opt{cancelled} ) {  		$self->{log}  		  ->warn('get_journey_stats called with illegal option cancelled => 1'); @@ -1761,9 +1763,12 @@ sub get_stats {  		)  	  )  	{ +		$self->{log}->debug("got cached journey stats for $year/$month");  		return $stats;  	} +	$self->{log}->debug("computing journey stats for $year/$month"); +  	my $interval_start = DateTime->new(  		time_zone => 'Europe/Berlin',  		year      => 2000, diff --git a/lib/Travelynx/Model/Stations.pm b/lib/Travelynx/Model/Stations.pm index 174b3b4..bf35d1a 100644 --- a/lib/Travelynx/Model/Stations.pm +++ b/lib/Travelynx/Model/Stations.pm @@ -23,12 +23,15 @@ sub get_backend_id {  		# special case  		return 0;  	} -	if ( $opt{hafas} and $self->{backend_id}{hafas}{ $opt{hafas} } ) { -		return $self->{backend_id}{hafas}{ $opt{hafas} }; -	}  	if ( $opt{dbris} and $self->{backend_id}{dbris}{ $opt{dbris} } ) {  		return $self->{backend_id}{dbris}{ $opt{dbris} };  	} +	if ( $opt{efa} and $self->{backend_id}{efa}{ $opt{efa} } ) { +		return $self->{backend_id}{efa}{ $opt{efa} }; +	} +	if ( $opt{hafas} and $self->{backend_id}{hafas}{ $opt{hafas} } ) { +		return $self->{backend_id}{hafas}{ $opt{hafas} }; +	}  	if ( $opt{motis} and $self->{backend_id}{motis}{ $opt{motis} } ) {  		return $self->{backend_id}{motis}{ $opt{motis} };  	} @@ -47,6 +50,17 @@ sub get_backend_id {  		)->hash->{id};  		$self->{backend_id}{dbris}{ $opt{dbris} } = $backend_id;  	} +	elsif ( $opt{efa} ) { +		$backend_id = $db->select( +			'backends', +			['id'], +			{ +				efa  => 1, +				name => $opt{efa} +			} +		)->hash->{id}; +		$self->{backend_id}{efa}{ $opt{efa} } = $backend_id; +	}  	elsif ( $opt{hafas} ) {  		$backend_id = $db->select(  			'backends', @@ -100,7 +114,7 @@ sub get_backends {  	$opt{db} //= $self->{pg}->db;  	my $res = $opt{db}->select( 'backends', -		[ 'id', 'name', 'iris', 'hafas', 'dbris', 'motis' ] ); +		[ 'id', 'name', 'dbris', 'efa', 'hafas', 'iris', 'motis' ] );  	my @ret;  	while ( my $row = $res->hash ) { @@ -109,9 +123,10 @@ sub get_backends {  			{  				id    => $row->{id},  				name  => $row->{name}, -				iris  => $row->{iris},  				dbris => $row->{dbris}, +				efa   => $row->{efa},  				hafas => $row->{hafas}, +				iris  => $row->{iris},  				motis => $row->{motis},  			}  		); @@ -166,6 +181,44 @@ sub add_or_update {  		return;  	} +	if ( $opt{efa} ) { +		if ( +			my $s = $self->get_by_eva( +				$stop->id_num, +				db         => $opt{db}, +				backend_id => $opt{backend_id} +			) +		  ) +		{ +			$opt{db}->update( +				'stations', +				{ +					name     => $stop->full_name, +					lat      => $stop->latlon->[0], +					lon      => $stop->latlon->[1], +					archived => 0 +				}, +				{ +					eva    => $stop->id_num, +					source => $opt{backend_id} +				} +			); +			return; +		} +		$opt{db}->insert( +			'stations', +			{ +				eva      => $stop->id_num, +				name     => $stop->full_name, +				lat      => $stop->latlon->[0], +				lon      => $stop->latlon->[1], +				source   => $opt{backend_id}, +				archived => 0 +			} +		); +		return; +	} +  	if ( $opt{motis} ) {  		if (  			my $s = $self->get_by_external_id( diff --git a/lib/Travelynx/Model/Users.pm b/lib/Travelynx/Model/Users.pm index 1c3692e..a552633 100644 --- a/lib/Travelynx/Model/Users.pm +++ b/lib/Travelynx/Model/Users.pm @@ -418,7 +418,7 @@ sub get {  		  . 'extract(epoch from registered_at) as registered_at_ts, '  		  . 'extract(epoch from last_seen) as last_seen_ts, '  		  . 'extract(epoch from deletion_requested) as deletion_requested_ts, ' -		  . 'backend_id, backend_name, hafas, dbris, motis', +		  . 'backend_id, backend_name, dbris, efa, hafas, motis',  		{ id => $uid }  	)->hash;  	if ($user) { @@ -458,6 +458,7 @@ sub get {  			backend_id    => $user->{backend_id},  			backend_name  => $user->{backend_name},  			backend_dbris => $user->{dbris}, +			backend_efa   => $user->{efa},  			backend_hafas => $user->{hafas},  			backend_motis => $user->{motis},  		}; | 
