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

check train/trip id when updating associated data

this avoid race conditions when a user changes their checkin between the time
of request (old trip id) and the time of data update (new trip id). These
could lead to funny effects such as buses suddenly having S-Bahn carriage
formations.
parent f7a92139
Loading
Loading
Loading
Loading
+26 −17
Original line number Diff line number Diff line
@@ -1242,6 +1242,7 @@ sub startup {
			}

			my $route    = $in_transit->{route};
			my $train_id = $in_transit->{train_id};

			# TODO get_tripid_p is only needed on the first call, afterwards the tripid is known.
			$self->hafas->get_tripid_p( train => $train )->then(
@@ -1251,7 +1252,8 @@ sub startup {
					$self->in_transit->update_data(
						uid      => $uid,
						db       => $db,
						data => { trip_id => $trip_id }
						data     => { trip_id => $trip_id },
						train_id => $train_id,
					);

					return $self->hafas->get_route_p(
@@ -1340,6 +1342,7 @@ sub startup {
							  $train->qos_messages
						],
						him_messages => \@messages,
						train_id     => $train_id,
					);

					if ($polyline) {
@@ -1348,6 +1351,7 @@ sub startup {
							db       => $db,
							polyline => $polyline,
							old_id   => $in_transit->{polyline_id},
							train_id => $train_id,
						);
					}

@@ -1423,12 +1427,14 @@ sub startup {
							$self->in_transit->update_data(
								uid      => $uid,
								db       => $db,
								data => $data
								data     => $data,
								train_id => $train_id,
							);
							$self->in_transit->update_user_data(
								uid       => $uid,
								db        => $db,
								user_data => $user_data
								user_data => $user_data,
								train_id  => $train_id,
							);
						}
						elsif ( not $is_departure
@@ -1438,7 +1444,8 @@ sub startup {
							$self->in_transit->update_data(
								uid      => $uid,
								db       => $db,
								data => $data
								data     => $data,
								train_id => $train_id,
							);
						}
						return;
@@ -1460,7 +1467,8 @@ sub startup {
						$self->in_transit->update_data(
							uid      => $uid,
							db       => $db,
							data => $data
							data     => $data,
							train_id => $train_id,
						);
						return;
					}
@@ -1481,7 +1489,8 @@ sub startup {
						$self->in_transit->update_data(
							uid      => $uid,
							db       => $db,
							data => $data
							data     => $data,
							train_id => $train_id,
						);
						return;
					}
+31 −17
Original line number Diff line number Diff line
@@ -577,7 +577,8 @@ sub set_polyline {
		$self->set_polyline_id(
			uid         => $uid,
			db          => $db,
			polyline_id => $polyline_id
			polyline_id => $polyline_id,
			train_id    => $opt{train_id},
		);
	}

@@ -590,11 +591,13 @@ sub set_polyline_id {
	my $db          = $opt{db} // $self->{pg}->db;
	my $polyline_id = $opt{polyline_id};

	$db->update(
		'in_transit',
		{ polyline_id => $polyline_id },
		{ user_id     => $uid }
	);
	my %where = ( user_id => $uid );

	if ( $opt{train_id} ) {
		$where{train_id} = $opt{train_id};
	}

	$db->update( 'in_transit', { polyline_id => $polyline_id }, \%where );
}

sub set_route_data {
@@ -607,6 +610,12 @@ sub set_route_data {
	my $qos_msg   = $opt{qos_messages};
	my $him_msg   = $opt{him_messages};

	my %where = ( user_id => $uid );

	if ( $opt{train_id} ) {
		$where{train_id} = $opt{train_id};
	}

	my $res_h = $db->select( 'in_transit', ['data'], { user_id => $uid } )
	  ->expand->hash;

@@ -623,7 +632,7 @@ sub set_route_data {
			route => JSON->new->encode($route),
			data  => JSON->new->encode($data)
		},
		{ user_id => $uid }
		\%where
	);
}

@@ -850,6 +859,12 @@ sub update_data {
	my $db       = $opt{db}   // $self->{pg}->db;
	my $new_data = $opt{data} // {};

	my %where = ( user_id => $uid );

	if ( $opt{train_id} ) {
		$where{train_id} = $opt{train_id};
	}

	my $res_h = $db->select( 'in_transit', ['data'], { user_id => $uid } )
	  ->expand->hash;

@@ -859,11 +874,7 @@ sub update_data {
		$data->{$k} = $v;
	}

	$db->update(
		'in_transit',
		{ data    => JSON->new->encode($data) },
		{ user_id => $uid }
	);
	$db->update( 'in_transit', { data => JSON->new->encode($data) }, \%where );
}

sub update_user_data {
@@ -873,6 +884,12 @@ sub update_user_data {
	my $db       = $opt{db}        // $self->{pg}->db;
	my $new_data = $opt{user_data} // {};

	my %where = ( user_id => $uid );

	if ( $opt{train_id} ) {
		$where{train_id} = $opt{train_id};
	}

	my $res_h = $db->select( 'in_transit', ['user_data'], { user_id => $uid } )
	  ->expand->hash;

@@ -882,11 +899,8 @@ sub update_user_data {
		$data->{$k} = $v;
	}

	$db->update(
		'in_transit',
		{ user_data => JSON->new->encode($data) },
		{ user_id   => $uid }
	);
	$db->update( 'in_transit',
		{ user_data => JSON->new->encode($data) }, \%where );
}

sub update_visibility {