summaryrefslogtreecommitdiff
path: root/lib/Travelynx/Model/InTransit.pm
diff options
context:
space:
mode:
authorBirte Kristina Friesel <derf@finalrewind.org>2025-06-15 08:23:48 +0200
committerBirte Kristina Friesel <derf@finalrewind.org>2025-06-15 08:23:51 +0200
commitc250a2f2c7968966014315f76b25109b83c041ed (patch)
tree3c6ee328e7e67beadeac44d9458a048fe3e0b473 /lib/Travelynx/Model/InTransit.pm
parentf1da50f9f18f0a2a5fd202daff4b6f0b517f35e0 (diff)
Add experimental EFA support
Squashed commit of the following: commit b7457791ab7ab4859ebf4a5ce173e1aaeed4c7fb Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Sun Jun 15 08:18:46 2025 +0200 changelog commit 7f3d61066195cfc3c83a8fc1b2fc3743e7e6171c Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Sat Jun 14 19:55:51 2025 +0200 Mark EFA backends as experimental for now For instance, VRR has very interesting issues when checking into departures that do not have real-time data yet. commit 3370c0f6c25bd6b02cc4d56e9a3aba2a66d1151a Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Sat Jun 14 19:49:48 2025 +0200 InTransit: remove debug output commit deb5444fa2965228b537e86fce862436ef2e6e19 Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Sat Jun 14 19:12:44 2025 +0200 frontend js for checked-in view: never show fractional delays commit d47ff9615b551bbd844a799be7717e9e74a04266 Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Sat Jun 14 19:12:31 2025 +0200 worker: add EFA support commit 3a955c0105bf13d040a821e2c87a19694202cde6 Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Sat Jun 14 17:48:46 2025 +0200 EFA: checkin support worker support and cancellations are still missing commit 19dea1ad13029d19cba38e7d1338718149c139fb Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Sat Jun 14 14:32:59 2025 +0200 actions.js: pass on efa parameter commit 8f18ff2c8f9f906a387dbe16d372e1c4b4a6f259 Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Sat Jun 14 14:32:48 2025 +0200 EFA: implement geolocation lookup commit bce1139bab9aab167cdab910fa86085529d45b80 Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Sat Jun 14 14:32:21 2025 +0200 EFA: ->id is no longer supported, use ->id_num commit e4397e6b1538ddfa71da9839d6011a73fadc528f Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Mon Jun 9 20:34:22 2025 +0200 ... derp commit e0c4cbf862a8f5a7bca0b1aceab3760af94093e9 Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Mon Jun 9 18:28:35 2025 +0200 database: it's dbris, not ris commit bfb1e834ce6c3171011dc20b32117065960b8771 Merge: 42f9a00 f1da50f Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Mon Jun 9 18:20:51 2025 +0200 Merge branch 'main' into efa-support commit 42f9a00d98dbd675234c05b3e25c3e722cfdd7ba Author: Birte Kristina Friesel <derf@finalrewind.org> Date: Wed Jan 8 18:11:28 2025 +0100 EFA support (WiP)
Diffstat (limited to 'lib/Travelynx/Model/InTransit.pm')
-rw-r--r--lib/Travelynx/Model/InTransit.pm171
1 files changed, 159 insertions, 12 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};