diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2020-01-05 09:56:52 +0100 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2020-01-05 09:56:52 +0100 | 
| commit | 75e54f73e5d9e935a9355c427422697bfd97d6f1 (patch) | |
| tree | c277fad0d6ce4f775fab47b09d881cbf9d38f0df /lib/DBInfoscreen | |
| parent | e540de179913a378b00a029f6eedc3b02d63a76b (diff) | |
Fetch map asynchronously
Diffstat (limited to 'lib/DBInfoscreen')
| -rw-r--r-- | lib/DBInfoscreen/Controller/Map.pm | 172 | 
1 files changed, 101 insertions, 71 deletions
| diff --git a/lib/DBInfoscreen/Controller/Map.pm b/lib/DBInfoscreen/Controller/Map.pm index 81c3b20..6337432 100644 --- a/lib/DBInfoscreen/Controller/Map.pm +++ b/lib/DBInfoscreen/Controller/Map.pm @@ -1,53 +1,67 @@  package DBInfoscreen::Controller::Map; +  use Mojo::Base 'Mojolicious::Controller';  use Mojo::JSON qw(decode_json); +use Mojo::Promise; + +use Encode qw(decode);  my $dbf_version = qx{git describe --dirty} || 'experimental';  chomp $dbf_version; -sub get_hafas_polyline { -	my ( $ua, $cache, $trip_id, $line ) = @_; +sub get_hafas_polyline_p { +	my ( $self, $trip_id, $line ) = @_;  	my $url  	  = "https://2.db.transport.rest/trips/${trip_id}?lineName=${line}&polyline=true"; +	my $cache   = $self->app->cache_iris_main; +	my $promise = Mojo::Promise->new; + +	say $url;  	if ( my $content = $cache->thaw($url) ) { -		return $content; +		$promise->resolve($content); +		return $promise;  	} -	$ua->request_timeout(2); - -	#say $url; -	my $res -	  = $ua->get( +	$self->ua->request_timeout(5) +	  ->get_p(  		$url => { 'User-Agent' => "dbf.finalrewind.org/${dbf_version}" } ) -	  ->result; -	if ( $res->is_error ) { -		return; -	} +	  ->then( +		sub { +			my ($tx) = @_; +			my $body = decode( 'utf-8', $tx->res->body ); +			my $json = decode_json($body); +			my @coordinate_list; + +			for my $feature ( @{ $json->{polyline}{features} } ) { +				if ( exists $feature->{geometry}{coordinates} ) { +					push( @coordinate_list, $feature->{geometry}{coordinates} ); +				} + +				#if ($feature->{type} eq 'Feature') { +				#	say "Feature " . $feature->{properties}{name}; +				#} +			} -	my $json = decode_json( $res->body ); -	my @coordinate_list; +			my $ret = { +				name      => $json->{line}{name} // '?', +				polyline  => [@coordinate_list], +				stopovers => $json->{stopovers}, +			}; -	for my $feature ( @{ $json->{polyline}{features} } ) { -		if ( exists $feature->{geometry}{coordinates} ) { -			push( @coordinate_list, $feature->{geometry}{coordinates} ); +			$cache->freeze( $url, $ret ); +			$promise->resolve($ret);  		} +	)->catch( +		sub { +			my ($err) = @_; +			$promise->reject($err); +		} +	)->wait; -		#if ($feature->{type} eq 'Feature') { -		#	say "Feature " . $feature->{properties}{name}; -		#} -	} - -	my $ret = { -		name      => $json->{line}{name} // '?', -		polyline  => [@coordinate_list], -		stopovers => $json->{stopovers}, -	}; - -	$cache->freeze( $url, $ret ); -	return $ret; +	return $promise;  }  sub route { @@ -55,50 +69,66 @@ sub route {  	my $trip_id = $self->stash('tripid');  	my $line_no = $self->stash('lineno'); -	my $pl = get_hafas_polyline( $self->ua, $self->app->cache_iris_main, -		$trip_id, $line_no ); -	my @polyline = @{ $pl->{polyline} }; -	my @line_pairs; -	my @station_coordinates; - -	for my $i ( 1 .. $#polyline ) { -		push( -			@line_pairs, -			[ -				[ $polyline[ $i - 1 ][1], $polyline[ $i - 1 ][0] ], -				[ $polyline[$i][1],       $polyline[$i][0] ] -			] -		); -	} +	$self->render_later; -	for my $stop ( @{ $pl->{stopovers} // [] } ) { -		push( -			@station_coordinates, -			[ -				[ -					$stop->{stop}{location}{latitude}, -					$stop->{stop}{location}{longitude} -				], -				$stop->{stop}{name} -			] -		); -	} +	$self->get_hafas_polyline_p( $trip_id, $line_no )->then( +		sub { +			my ($pl) = @_; + +			my @polyline = @{ $pl->{polyline} }; +			my @line_pairs; +			my @station_coordinates; + +			for my $i ( 1 .. $#polyline ) { +				push( +					@line_pairs, +					[ +						[ $polyline[ $i - 1 ][1], $polyline[ $i - 1 ][0] ], +						[ $polyline[$i][1],       $polyline[$i][0] ] +					] +				); +			} -	$self->render( -		'route_map', -		title           => $pl->{name}, -		hide_opts       => 1, -		with_map        => 1, -		polyline_groups => [ -			{ -				polylines  => \@line_pairs, -				color      => '#00838f', -				opacity    => 0.6, -				fit_bounds => 1, +			for my $stop ( @{ $pl->{stopovers} // [] } ) { +				push( +					@station_coordinates, +					[ +						[ +							$stop->{stop}{location}{latitude}, +							$stop->{stop}{location}{longitude} +						], +						$stop->{stop}{name} +					] +				);  			} -		], -		station_coordinates => [@station_coordinates], -	); + +			$self->render( +				'route_map', +				title           => $pl->{name}, +				hide_opts       => 1, +				with_map        => 1, +				polyline_groups => [ +					{ +						polylines  => \@line_pairs, +						color      => '#00838f', +						opacity    => 0.6, +						fit_bounds => 1, +					} +				], +				station_coordinates => [@station_coordinates], +			); +		} +	)->catch( +		sub { +			my ($err) = @_; +			$self->render( +				'route_map', +				title     => "Fehler", +				hide_opts => 1, +			); + +		} +	)->wait;  }  1; | 
