summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2019-04-24 07:34:41 +0200
committerDaniel Friesel <derf@finalrewind.org>2019-04-24 07:34:41 +0200
commit438319e63a17f3ae5927b274ef491b6e9514f934 (patch)
treea3df2c748d67d485d3a0080a9dd2ec710f620b60
parent906ec60ea201f358993b52a6d73041e2a4fe4a3c (diff)
Bump API to v1
-rwxr-xr-xlib/Travelynx.pm1
-rwxr-xr-xlib/Travelynx/Controller/Api.pm109
-rw-r--r--templates/account.html.ep34
3 files changed, 131 insertions, 13 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm
index 276c958..3f8025a 100755
--- a/lib/Travelynx.pm
+++ b/lib/Travelynx.pm
@@ -1469,6 +1469,7 @@ sub startup {
$r->get('/impressum')->to('static#imprint');
$r->get('/imprint')->to('static#imprint');
$r->get('/api/v0/:user_action/:token')->to('api#get_v0');
+ $r->get('/api/v1/:user_action/:token')->to('api#get_v1');
$r->get('/login')->to('account#login_form');
$r->get('/register')->to('account#registration_form');
$r->get('/reg/:id/:token')->to('account#verify');
diff --git a/lib/Travelynx/Controller/Api.pm b/lib/Travelynx/Controller/Api.pm
index 8e72374..a0b8e07 100755
--- a/lib/Travelynx/Controller/Api.pm
+++ b/lib/Travelynx/Controller/Api.pm
@@ -66,7 +66,7 @@ sub get_v0 {
) ? \1 : \0,
station => {
ds100 => $status->{arr_ds100} // $status->{dep_ds100},
- name => $status->{arr_ds100} // $status->{dep_ds100},
+ name => $status->{arr_name} // $status->{dep_name},
uic => $station_eva,
longitude => $station_lon,
latitude => $station_lat,
@@ -93,6 +93,113 @@ sub get_v0 {
}
}
+sub get_v1 {
+ my ($self) = @_;
+
+ my $api_action = $self->stash('user_action');
+ my $api_token = $self->stash('token');
+ if ( $api_action !~ qr{ ^ (?: status | history | action ) $ }x ) {
+ $self->render(
+ json => {
+ error => 'Invalid action',
+ },
+ );
+ return;
+ }
+ if ( $api_token !~ qr{ ^ (?<id> \d+ ) - (?<token> .* ) $ }x ) {
+ $self->render(
+ json => {
+ error => 'Malformed token',
+ },
+ );
+ return;
+ }
+ my $uid = $+{id};
+ $api_token = $+{token};
+ my $token = $self->get_api_token($uid);
+ if ( $api_token ne $token->{$api_action} ) {
+ $self->render(
+ json => {
+ error => 'Invalid token',
+ },
+ );
+ return;
+ }
+ if ( $api_action eq 'status' ) {
+ my $status = $self->get_user_status($uid);
+
+ my $ret = {
+ deprecated => \0,
+ checkedIn => (
+ $status->{checked_in}
+ or $status->{cancelled}
+ ) ? \1 : \0,
+ fromStation => {
+ ds100 => $status->{dep_ds100},
+ name => $status->{dep_name},
+ uic => undef,
+ longitude => undef,
+ latitude => undef,
+ scheduledTime => $status->{sched_departure}->epoch || undef,
+ realTime => $status->{real_departure}->epoch || undef,
+ },
+ toStation => {
+ ds100 => $status->{arr_ds100},
+ name => $status->{arr_name},
+ uic => undef,
+ longitude => undef,
+ latitude => undef,
+ scheduledTime => $status->{sched_arrival}->epoch || undef,
+ realTime => $status->{real_arrival}->epoch || undef,
+ },
+ train => {
+ type => $status->{train_type},
+ line => $status->{train_line},
+ no => $status->{train_no},
+ id => $status->{train_id},
+ },
+ actionTime => $status->{timestamp}->epoch,
+ };
+
+ if ( $status->{dep_ds100} ) {
+ my @station_descriptions
+ = Travel::Status::DE::IRIS::Stations::get_station(
+ $status->{dep_ds100} );
+ if ( @station_descriptions == 1 ) {
+ (
+ undef, undef,
+ $ret->{fromStation}{uic},
+ $ret->{fromStation}{longitude},
+ $ret->{fromStation}{latitude}
+ ) = @{ $station_descriptions[0] };
+ }
+ }
+
+ if ( $status->{arr_ds100} ) {
+ my @station_descriptions
+ = Travel::Status::DE::IRIS::Stations::get_station(
+ $status->{arr_ds100} );
+ if ( @station_descriptions == 1 ) {
+ (
+ undef, undef,
+ $ret->{toStation}{uic},
+ $ret->{toStation}{longitude},
+ $ret->{toStation}{latitude}
+ ) = @{ $station_descriptions[0] };
+ }
+ }
+
+ $self->render( json => $ret );
+ }
+ else {
+ $self->render(
+ json => {
+ error => 'not implemented',
+ },
+ );
+ }
+}
+
sub set_token {
my ($self) = @_;
if ( $self->validation->csrf_protect->has_error('csrf_token') ) {
diff --git a/templates/account.html.ep b/templates/account.html.ep
index 5a19c90..90c64fc 100644
--- a/templates/account.html.ep
+++ b/templates/account.html.ep
@@ -144,7 +144,7 @@
</div>
</div>
-% my $api_root = $self->url_for('/api/v0')->to_abs->scheme('https');
+% my $api_root = $self->url_for('/api/v1')->to_abs->scheme('https');
<h3>Status</h3>
<div class="row">
<div class="col s12">
@@ -162,22 +162,32 @@
<p style="font-family: Monospace;">
{<br/>
"deprecated" : true / false, (falls true: Diese API-Version wird irgendwann abgeschaltet, bitte auf eine neue umsteigen)<br/>
- "checked_in" : true / false,<br/>
- "station" : {<br/>
- "name" : "Essen Hbf", (Name der letzten Station)<br/>
- "ds100" : "EE", (DS100-Kürzel)<br/>
- "uic" : 8000098, (Internationale Bahnhofsnummer)<br/>
- "longitude" : 7.014793,<br/>
+ "checkedIn" : true / false,<br/>
+ "fromStation" : { (letzter Checkin)<br/>
+ "name" : "Essen Hbf",<br/>
+ "ds100" : "EE",<br/>
+ "uic" : 8000098,<br/>
"latitude" : 51.451355,<br/>
+ "longitude" : 7.014793,<br/>
+ "scheduledTime": 1556083680,<br/>
+ "realTime": 1556083680,<br/>
+ },<br/>
+ "fromStation" : { (zugehöriger Checkout. Wenn noch nicht eingetragen, sind alle Felder null)<br/>
+ "name" : "Essen Stadtwald",<br/>
+ "ds100" : "EESA",<br/>
+ "uic" : 8001896,<br/>
+ "latitude" : 51.422853,<br/>
+ "longitude" : 7.023296,<br/>
+ "scheduledTime": 1556083980, (ggf. null)<br/>
+ "realTime": 1556083980, (ggf. null)<br/>
},<br/>
"train" : {<br/>
- "type" : "ICE", (aktueller / letzter Zugtyp)<br/>
- "line" : null, (Linie als String, nicht immer numerisch, ggf. null)<br/>
- "no" : "1234", (Zugnummer als String)<br/>
+ "type" : "S", (aktueller / letzter Zugtyp)<br/>
+ "line" : "6", (Linie als String, nicht immer numerisch, ggf. null)<br/>
+ "no" : "30634", (Zugnummer als String)<br/>
+ "id" : "7512500863736016593", (IRIS-spezifische Zug-ID)<br/>
},<br/>
"actionTime" : 1234567, (UNIX-Timestamp des letzten Checkin/Checkout)<br/>
- "scheduledTime" : 1234567, (UNIX-Timestamp der zugehörigen Ankunft/Abfahrt gemäß Fahrplan. Ggf. 0)<br/>
- "realTime" : 1234567, (UNIX-Timestamp der zugehörigen Ankunft/Abfahrt laut Echtzeitdaten. Ggf. 0)<br/>
}
</p>
<p>