diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm
index cc0f81d..3abe949 100755
--- a/lib/Travelynx.pm
+++ b/lib/Travelynx.pm
@@ -159,12 +159,13 @@ sub startup {
status => 1,
history => 2,
action => 3,
+ import => 4,
};
}
);
$self->attr(
token_types => sub {
- return [qw(status history action)];
+ return [qw(status history action import)];
}
);
@@ -330,7 +331,7 @@ sub startup {
my ( $self, %opt ) = @_;
my $db = $opt{db};
- my $uid = $self->current_user->{id};
+ my $uid = $opt{uid} // $self->current_user->{id};
my $now = DateTime->now( time_zone => 'Europe/Berlin' );
my $dep_station = get_station( $opt{dep_station} );
my $arr_station = get_station( $opt{arr_station} );
@@ -410,7 +411,7 @@ sub startup {
$journey_id
= $db->insert( 'journeys', $entry, { returning => 'id' } )
->hash->{id};
- $self->invalidate_stats_cache( $opt{rt_departure}, $db );
+ $self->invalidate_stats_cache( $opt{rt_departure}, $db, $uid );
};
if ($@) {
@@ -3232,6 +3233,7 @@ sub startup {
$r->get('/status/:name/:ts')->to('traveling#user_status');
$r->get('/ajax/status/:name')->to('traveling#public_status_card');
$r->get('/ajax/status/:name/:ts')->to('traveling#public_status_card');
+ $r->post('/api/v1/import')->to('api#import_v1');
$r->post('/action')->to('traveling#log_action');
$r->post('/geolocation')->to('traveling#geolocation');
$r->post('/list_departures')->to('traveling#redirect_to_station');
diff --git a/lib/Travelynx/Controller/Api.pm b/lib/Travelynx/Controller/Api.pm
index a442784..84e1507 100755
--- a/lib/Travelynx/Controller/Api.pm
+++ b/lib/Travelynx/Controller/Api.pm
@@ -1,6 +1,7 @@
package Travelynx::Controller::Api;
use Mojo::Base 'Mojolicious::Controller';
+use DateTime;
use Travel::Status::DE::IRIS::Stations;
use UUID::Tiny qw(:std);
@@ -8,6 +9,17 @@ sub make_token {
return create_uuid_as_string(UUID_V4);
}
+sub sanitize {
+ my ( $type, $value ) = @_;
+ if ( not defined $value ) {
+ return undef;
+ }
+ if ( $type eq '' ) {
+ return '' . $value;
+ }
+ return 0 + $value;
+}
+
sub documentation {
my ($self) = @_;
@@ -71,9 +83,9 @@ sub get_v0 {
or $status->{cancelled}
) ? \1 : \0,
station => {
- ds100 => $status->{arr_ds100} // $status->{dep_ds100},
- name => $status->{arr_name} // $status->{dep_name},
- uic => $station_eva,
+ ds100 => $status->{arr_ds100} // $status->{dep_ds100},
+ name => $status->{arr_name} // $status->{dep_name},
+ uic => $station_eva,
longitude => $station_lon,
latitude => $station_lat,
},
@@ -153,6 +165,155 @@ sub get_v1 {
}
}
+sub import_v1 {
+ my ($self) = @_;
+
+ my $payload = $self->req->json;
+ my $api_token = $payload->{token} // '';
+
+ if ( $api_token !~ qr{ ^ (?
-->
+
+ Travel
@@ -192,7 +192,30 @@
%= end
-
+
diff --git a/templates/api_documentation.html.ep b/templates/api_documentation.html.ep
index dd59be6..de0231d 100644
--- a/templates/api_documentation.html.ep
+++ b/templates/api_documentation.html.ep
@@ -41,7 +41,7 @@
"scheduledTime": 1556083680,Import
+
+ % if ($token->{import}) {
+ %= $acc->{id} . '-' . $token->{import}
+ % }
+ % else {
+ —
+ % }
+
+
+ %= form_for 'set_token' => begin
+ %= csrf_field
+ %= hidden_field 'token' => 'import'
+
+
+ %= end
+
+
"realTime": 1556083680,
},
- "fromStation" : { (zugehöriger Checkout. Wenn noch nicht eingetragen, sind alle Felder null)
+ "toStation" : { (zugehöriger Checkout. Wenn noch nicht eingetragen, sind alle Felder null)
"name" : "Essen Stadtwald",
"ds100" : "EESA",
"uic" : 8001896,
@@ -72,14 +72,64 @@
Coming soon.
- Ein- und Auschecken per API. Coming soon. + Manueller Import vergangener Zugfahrten (eine Fahrt pro API-Aufruf). +
++ curl -X POST -H "Content-Type: application/json" -d '{"token":"<%= $uid %>-<%= $token->{status} // 'TOKEN' %>"}' <%= $api_root %>/import +
+Payload (alle nicht als optional markierten Felder sind Pflicht):
+
+ {
+ "token" : "<%= $token->{import} // 'TOKEN' %>",
+ "dryRun" : True/False, (optional: wenn True, wird die Eingabe validiert, aber keine Zugfahrt angelegt)
+ "cancelled" : True/False, (Zugausfall?)
+ "train" : {
+ "type" : "S", (Zugtyp, z.B. ICE, RE, S)
+ "line" : "6", (Linie als String, bei Zügen ohne Linie wie IC/ICE u.ä. null)
+ "no" : "30634", (Zugnummer als String)
+ },
+ "fromStation" : { (Start / Checkin)
+ "name" : "Essen Hbf", (Name oder DS100)
+ "scheduledTime": 1556083680, (UNIX-Timestamp)
+ "realTime": 1556083680, (UNIX-Timestamp, optional, default == scheduledTime)
+ },
+ "toStation" : { (Ziel / Checkout)
+ "name" : "Essen Stadtwald", (Name oder DS100)
+ "scheduledTime": 1556083980, (UNIX-Timestamp)
+ "realTime": 1556083980, (UNIX-Timestamp, optional, default == scheduledTime)
+ },
+ "route" : [ (optionale Liste mit Unterwegshalten als Name oder DS100, darf keine Stationen vor Checkin oder nach Checkout beinhalten)
+ "Essen Hbf",
+ "Essen Süd",
+ "Essen Stadtwald"
+ ],
+ "comment" : "Beliebiger Text" (optionaler Freitext-Kommentar)
+ }
+
+ Antwort bei Erfolg (der Inhalt von "result" ist von dryRun unabhängig): +
+
+ {
+ "success" : True,
+ "id" : 1234, (ID der eingetragenen Zugfahrt)
+ "result" : { ... } (Eingetragene Daten, Inhalt ist variabel)
+ }
+
+ Antwort bei Fehler: +
+
+ {
+ "success" : False,
+ "error" : "Begründung"
+ }