Unverified Commit f987ae59 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

carriage formation: directly refer to Travel::Status::DE::DBRIS

Also removes old has_wagonorder / get_wagonorder split. That used to be
sensible when we had multiple backends, but has long since lost its meaning.
parent c0eb68d1
Loading
Loading
Loading
Loading
+11 −20
Original line number Diff line number Diff line
@@ -1886,31 +1886,20 @@ sub startup {
			my $db = $self->pg->db;

			if ( $datetime and $train_no ) {
				$self->dbris->has_wagonorder_p(%opt)->then(
				$self->dbris->get_wagonorder_p(%opt)->then(
					sub {
						return $self->dbris->get_wagonorder_p(%opt);
					}
				)->then(
					sub {
						my ($wagonorder) = @_;
						my ($status) = @_;
						my $wr = $status->result;

						my $data      = {};
						my $user_data = {};

						my $wr;
						eval {
							$wr
							  = Travel::Status::DE::DBRIS::Formation->new(
								json => $wagonorder );
						};

						if (    $opt{is_departure}
							and $wr
							and not exists $wagonorder->{error} )
							and $wr )
						{
							my $dt
							  = $opt{datetime}->clone->set_time_zone('UTC');
							$data->{wagonorder_dep}   = $wagonorder;
							$data->{wagonorder_dep}   = $status->{raw_json};
							$data->{wagonorder_param} = {
								time      => $dt->rfc3339 =~ s{(?=Z)}{.000}r,
								number    => $opt{train_no},
@@ -1964,10 +1953,8 @@ sub startup {
								train_id  => $train_id,
							);
						}
						elsif ( $opt{is_arrival}
							and not exists $wagonorder->{error} )
						{
							$data->{wagonorder_arr} = $wagonorder;
						elsif ( $opt{is_arrival} ) {
							$data->{wagonorder_arr} = $status->{raw_json};
							$self->in_transit->update_data(
								uid      => $uid,
								db       => $db,
@@ -1979,6 +1966,10 @@ sub startup {
					}
				)->catch(
					sub {
						my ($err) = @_;
						$self->log->debug(
							"add_wagonorder: promise rejected with ${err}");

						# no wagonorder? no problem.
						return;
					}
+15 −120
Original line number Diff line number Diff line
@@ -160,130 +160,25 @@ sub get_journey_p {
	return $promise;
}

sub has_wagonorder_p {
	my ( $self, %opt ) = @_;

	$opt{train_type} //= q{};
	my $datetime = $opt{datetime}->clone->set_time_zone('UTC');
	my %param    = (
		administrationId => 80,
		category         => $opt{train_type},
		date             => $datetime->strftime('%Y-%m-%d'),
		evaNumber        => $opt{eva},
		number           => $opt{train_no},
		time             => $datetime->rfc3339 =~ s{(?=Z)}{.000}r
	);

	my $url = sprintf( '%s?%s',
'https://www.bahn.de/web/api/reisebegleitung/wagenreihung/vehicle-sequence',
		join( '&', map { $_ . '=' . $param{$_} } sort keys %param ) );

	my $promise = Mojo::Promise->new;
	my $debug_prefix
	  = "has_wagonorder_p($opt{train_type} $opt{train_no} @ $opt{eva})";

	if ( my $content = $self->{main_cache}->get("HEAD $url")
		// $self->{realtime_cache}->get("HEAD $url") )
	{
		if ( $content eq 'n' ) {
			$self->{log}->debug("${debug_prefix}: n (cached)");
			return $promise->reject;
		}
		else {
			$self->{log}->debug("${debug_prefix}: ${content} (cached)");
			return $promise->resolve($content);
		}
	}

	$self->get_agent->request_timeout(5)
	  ->get_p( $url => $self->{header} )
	  ->then(
		sub {
			my ($tx) = @_;
			if ( $tx->result->is_success ) {
				$self->{log}->debug("${debug_prefix}: a");
				$self->{main_cache}->set( "HEAD $url", 'a' );
				my $body = decode( 'utf-8', $tx->res->body );
				my $json = JSON->new->decode($body);
				$self->{main_cache}->freeze( $url, $json );
				$promise->resolve('a');
			}
			else {
				my $code = $tx->res->code;
				$self->{log}->debug("${debug_prefix}: n (HTTP $code)");
				$self->{realtime_cache}->set( "HEAD $url", 'n' );
				$promise->reject;
			}
			return;
		}
	  )->catch(
		sub {
			my ($err) = @_;
			$self->{log}->debug("${debug_prefix}: n ($err)");
			$self->{realtime_cache}->set( "HEAD $url", 'n' );
			$promise->reject;
			return;
		}
	  )->wait;
	return $promise;
}

sub get_wagonorder_p {
	my ( $self, %opt ) = @_;

	my $datetime = $opt{datetime}->clone->set_time_zone('UTC');
	my %param    = (
		administrationId => 80,
		category         => $opt{train_type},
		date             => $datetime->strftime('%Y-%m-%d'),
		evaNumber        => $opt{eva},
		number           => $opt{train_no},
		time             => $datetime->rfc3339 =~ s{(?=Z)}{.000}r
	);

	my $url = sprintf( '%s?%s',
'https://www.bahn.de/web/api/reisebegleitung/wagenreihung/vehicle-sequence',
		join( '&', map { $_ . '=' . $param{$_} } sort keys %param ) );
	my $debug_prefix
	  = "get_wagonorder_p($opt{train_type} $opt{train_no} @ $opt{eva})";

	my $promise = Mojo::Promise->new;

	if ( my $content = $self->{main_cache}->thaw($url) ) {
		$self->{log}->debug("${debug_prefix}: (cached)");
		$promise->resolve($content);
		return $promise;
	}
	$self->{log}
	  ->debug("get_wagonorder_p($opt{train_type} $opt{train_no} @ $opt{eva})");

	$self->get_agent->request_timeout(5)
	  ->get_p( $url => $self->{header} )
	  ->then(
		sub {
			my ($tx) = @_;

			if ( $tx->result->is_success ) {
				my $body = decode( 'utf-8', $tx->res->body );
				my $json = JSON->new->decode($body);
				$self->{log}->debug("${debug_prefix}: success");
				$self->{main_cache}->freeze( $url, $json );
				$promise->resolve($json);
			}
			else {
				my $code = $tx->res->code;
				$self->{log}->debug("${debug_prefix}: HTTP ${code}");
				$promise->reject("HTTP ${code}");
			}
			return;
		}
	  )->catch(
		sub {
			my ($err) = @_;
			$self->{log}->debug("${debug_prefix}: error ${err}");
			$promise->reject($err);
			return;
		}
	  )->wait;
	return $promise;
	return Travel::Status::DE::DBRIS->new_p(
		cache         => $self->{main_cache},
		failure_cache => $self->{realtime_cache},
		promise       => 'Mojo::Promise',
		user_agent    => $self->get_agent->request_timeout(10),
		formation     => {
			departure    => $opt{datetime},
			eva          => $opt{eva},
			train_type   => $opt{train_type},
			train_number => $opt{train_no}
		},
		developer_mode => $self->{log}->is_level('debug') ? 1 : 0,
	);
}

1;