feat(api/webhook): logging for journey recording, proper HTTP status codes
This commit is contained in:
@ -17,6 +17,7 @@ pub async fn get_railcar_identifier_by_journey(
|
||||
}
|
||||
|
||||
fn find_railcar_identifier(train_ordering: TrainOrdering) -> Result<u64, ResolveTripNumberError> {
|
||||
//TODO: refactor - trainsets can consist out of several trains
|
||||
let trainset = train_ordering.train_sets.first()
|
||||
.ok_or(ResolveTripNumberError::Api("No items in field 'fahrzeuggruppe'".to_string()))?;
|
||||
let identifier_str = trainset.identifier.to_owned();
|
||||
|
@ -7,7 +7,7 @@ use axum::{
|
||||
use axum_core::response::IntoResponse;
|
||||
use chrono::DateTime;
|
||||
use serde::Deserialize;
|
||||
use sqlx::PgPool;
|
||||
use sqlx::{Error, PgPool};
|
||||
use sqlx::postgres::PgQueryResult;
|
||||
use crate::api::db_vendo_navigator::get_railcar_identifier_by_journey;
|
||||
use crate::error::train_order_api_error::{CheckInError, ResolveTripNumberError};
|
||||
@ -46,14 +46,20 @@ async fn receive_travelynx_checkin(
|
||||
)
|
||||
.await
|
||||
.map_err(|e| CheckInError::from(e))?;
|
||||
let train = get_train_by_identifier(railcar_identifier as i32, db.clone())
|
||||
.await
|
||||
.map_err(|e| ResolveTripNumberError::from(e))
|
||||
.map_err(|e| CheckInError::from(e))?;
|
||||
let train_result = get_train_by_identifier(railcar_identifier as i32, db.clone())
|
||||
.await;
|
||||
let train = train_result
|
||||
.map_err(|e| {
|
||||
match e {
|
||||
Error::RowNotFound => CheckInError::TrainNotFound,
|
||||
e => CheckInError::from(ResolveTripNumberError::from(e))
|
||||
}
|
||||
})?;
|
||||
println!("Train: {:?}", train);
|
||||
record_journey(user, train, check_in.status.from_station.scheduled_time.unwrap(), db)
|
||||
let result = record_journey(user, train, check_in.status.from_station.scheduled_time.unwrap(), db)
|
||||
.await
|
||||
.expect("Failed to check in!");
|
||||
.map_err(|e| CheckInError::from(ResolveTripNumberError::from(e)))?;
|
||||
println!("Journey recorded: {:?}", result);
|
||||
let message = format!(
|
||||
"Successfully checked into {} {} ({}), departing from station {} at {}",
|
||||
check_in.status.train.train_type.unwrap(),
|
||||
@ -63,7 +69,7 @@ async fn receive_travelynx_checkin(
|
||||
check_in.status.from_station.scheduled_time.unwrap()
|
||||
);
|
||||
Ok::<_, CheckInError>((
|
||||
StatusCode::OK,
|
||||
StatusCode::CREATED,
|
||||
message
|
||||
).into_response())
|
||||
},
|
||||
|
@ -54,6 +54,7 @@ impl From<sqlx::Error> for ResolveTripNumberError {
|
||||
#[derive(Debug)]
|
||||
pub enum CheckInError {
|
||||
ResolveError(ResolveTripNumberError),
|
||||
TrainNotFound,
|
||||
}
|
||||
|
||||
impl From<ResolveTripNumberError> for CheckInError {
|
||||
@ -65,6 +66,7 @@ impl Display for CheckInError {
|
||||
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
|
||||
match self {
|
||||
CheckInError::ResolveError(e) => f.write_str(e.to_string().as_str()),
|
||||
CheckInError::TrainNotFound => f.write_str("Train not found"),
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -73,9 +75,9 @@ pub type ApiResult<T> = Result<T, CheckInError>;
|
||||
|
||||
impl IntoResponse for CheckInError {
|
||||
fn into_response(self) -> axum_core::response::Response {
|
||||
(
|
||||
StatusCode::INTERNAL_SERVER_ERROR,
|
||||
format!("Error processing checkin: {}", self)
|
||||
).into_response()
|
||||
match self {
|
||||
CheckInError::TrainNotFound => (StatusCode::OK, format!("Train not found")),
|
||||
_ => (StatusCode::INTERNAL_SERVER_ERROR, format!("Error processing checkin: {}", self)),
|
||||
}.into_response()
|
||||
}
|
||||
}
|
@ -20,7 +20,7 @@ async fn main() {
|
||||
.await.expect("Unable to load config");
|
||||
|
||||
let state: AppState = AppState::new(config.clone()).await.unwrap();
|
||||
//migrate(state.clone()).await.expect("Database migration failed");
|
||||
migrate(state.clone()).await.expect("Database migration failed");
|
||||
|
||||
let router = build_router(state);
|
||||
let listener = listen(config).await;
|
||||
|
123
src/sql/migrations/2025051101_triebzuege.sql
Normal file
123
src/sql/migrations/2025051101_triebzuege.sql
Normal file
@ -0,0 +1,123 @@
|
||||
INSERT INTO triebzug (uuid, tz_id, name)
|
||||
VALUES (gen_random_uuid(), 101, 'Gießen'),
|
||||
(gen_random_uuid(), 102, 'Jever'),
|
||||
(gen_random_uuid(), 103, 'Neu-Isenburg'),
|
||||
(gen_random_uuid(), 104, 'Fulda'),
|
||||
(gen_random_uuid(), 105, 'Offenbach am Main'),
|
||||
(gen_random_uuid(), 106, 'Itzehoe'),
|
||||
(gen_random_uuid(), 107, 'Plattling'),
|
||||
(gen_random_uuid(), 108, 'Lichtenfels'),
|
||||
(gen_random_uuid(), 109, 'Lüneburg'),
|
||||
(gen_random_uuid(), 110, 'Gelsenkirchen'),
|
||||
(gen_random_uuid(), 111, 'Nürnberg'),
|
||||
(gen_random_uuid(), 112, 'Memmingen'),
|
||||
(gen_random_uuid(), 113, 'Frankenthal/Pfalz'),
|
||||
(gen_random_uuid(), 114, 'Friedrichshafen'),
|
||||
(gen_random_uuid(), 115, 'Regensburg'),
|
||||
(gen_random_uuid(), 116, 'Pforzheim'),
|
||||
(gen_random_uuid(), 117, 'Hof'),
|
||||
(gen_random_uuid(), 119, 'Osnabrück'),
|
||||
(gen_random_uuid(), 152, 'Hanau'),
|
||||
(gen_random_uuid(), 153, 'Neumünster'),
|
||||
(gen_random_uuid(), 154, 'Flensburg'),
|
||||
(gen_random_uuid(), 155, 'Rosenheim'),
|
||||
(gen_random_uuid(), 156, 'Heppenheim/Bergstraße'),
|
||||
(gen_random_uuid(), 157, 'Landshut'),
|
||||
(gen_random_uuid(), 158, 'Gütersloh'),
|
||||
(gen_random_uuid(), 159, 'Bad Oldesloe'),
|
||||
(gen_random_uuid(), 160, 'Mülheim an der Ruhr'),
|
||||
(gen_random_uuid(), 161, 'Bebra'),
|
||||
(gen_random_uuid(), 162, 'Geisenheim/Rheingau'),
|
||||
(gen_random_uuid(), 166, 'Gelnhausen'),
|
||||
(gen_random_uuid(), 167, 'Garmisch-Partenkirchen'),
|
||||
(gen_random_uuid(), 168, 'Crailsheim'),
|
||||
(gen_random_uuid(), 169, 'Worms'),
|
||||
(gen_random_uuid(), 171, 'Heusenstamm'),
|
||||
(gen_random_uuid(), 172, 'Aschaffenburg'),
|
||||
(gen_random_uuid(), 173, 'Basel'),
|
||||
(gen_random_uuid(), 174, 'Zürich'),
|
||||
(gen_random_uuid(), 175, 'Nürnberg'),
|
||||
(gen_random_uuid(), 176, 'Bremen'),
|
||||
(gen_random_uuid(), 177, 'Rendsburg'),
|
||||
(gen_random_uuid(), 178, 'Bremerhaven'),
|
||||
(gen_random_uuid(), 179, 'Chur'),
|
||||
(gen_random_uuid(), 180, 'Castrop-Rauxel'),
|
||||
(gen_random_uuid(), 181, 'Interlaken'),
|
||||
(gen_random_uuid(), 182, 'Rüdesheim am Rhein'),
|
||||
(gen_random_uuid(), 183, 'Timmendorfer Strand'),
|
||||
(gen_random_uuid(), 184, 'Bruchsal'),
|
||||
(gen_random_uuid(), 185, 'Freilassing'),
|
||||
(gen_random_uuid(), 186, 'Chur'),
|
||||
(gen_random_uuid(), 187, 'Mühldorf a. Inn'),
|
||||
(gen_random_uuid(), 188, 'Hildesheim'),
|
||||
(gen_random_uuid(), 189, 'Castrop-Rauxel'),
|
||||
(gen_random_uuid(), 190, 'Ludwigshafen am Rhein'),
|
||||
(gen_random_uuid(), 301, 'Freiburg im Breisgau'),
|
||||
(gen_random_uuid(), 302, 'Hansestadt Lübeck'),
|
||||
(gen_random_uuid(), 303, 'Dortmund'),
|
||||
(gen_random_uuid(), 304, 'München'),
|
||||
(gen_random_uuid(), 305, 'Baden-Baden'),
|
||||
(gen_random_uuid(), 306, 'Nördlingen'),
|
||||
(gen_random_uuid(), 307, 'Oberhausen'),
|
||||
(gen_random_uuid(), 308, 'Murnau am Staffelsee'),
|
||||
(gen_random_uuid(), 309, 'Aalen'),
|
||||
(gen_random_uuid(), 310, 'Wolfsburg'),
|
||||
(gen_random_uuid(), 311, 'Wiesbaden'),
|
||||
(gen_random_uuid(), 312, 'Montabaur'),
|
||||
(gen_random_uuid(), 313, 'Treuchtlingen'),
|
||||
(gen_random_uuid(), 314, 'Bergisch Gladbach'),
|
||||
(gen_random_uuid(), 315, 'Singen (Hohentwiel)'),
|
||||
(gen_random_uuid(), 316, 'Siegburg'),
|
||||
(gen_random_uuid(), 317, 'Recklinghausen'),
|
||||
(gen_random_uuid(), 318, 'Münster (Westf.)'),
|
||||
(gen_random_uuid(), 319, 'Duisburg'),
|
||||
(gen_random_uuid(), 320, 'Weil am Rhein'),
|
||||
(gen_random_uuid(), 321, 'Krefeld'),
|
||||
(gen_random_uuid(), 322, 'Solingen'),
|
||||
(gen_random_uuid(), 323, 'Schaffhausen'),
|
||||
(gen_random_uuid(), 324, 'Fürth'),
|
||||
(gen_random_uuid(), 325, 'Ravensburg'),
|
||||
(gen_random_uuid(), 326, 'Neunkirchen'),
|
||||
(gen_random_uuid(), 327, 'Siegen'),
|
||||
(gen_random_uuid(), 328, 'Aachen'),
|
||||
(gen_random_uuid(), 330, 'Göttingen'),
|
||||
(gen_random_uuid(), 331, 'Westerland/Sylt'),
|
||||
(gen_random_uuid(), 332, 'Augsburg'),
|
||||
(gen_random_uuid(), 333, 'Goslar'),
|
||||
(gen_random_uuid(), 334, 'Offenburg'),
|
||||
(gen_random_uuid(), 335, 'Konstanz'),
|
||||
(gen_random_uuid(), 336, 'Ingolstadt'),
|
||||
(gen_random_uuid(), 337, 'Stuttgart'),
|
||||
(gen_random_uuid(), 351, 'Herford'),
|
||||
(gen_random_uuid(), 352, 'Mönchengladbach'),
|
||||
(gen_random_uuid(), 353, 'Neu-Ulm'),
|
||||
(gen_random_uuid(), 354, 'Mittenwald'),
|
||||
(gen_random_uuid(), 355, 'Tuttlingen'),
|
||||
(gen_random_uuid(), 357, 'Esslingen am Neckar'),
|
||||
(gen_random_uuid(), 358, 'St. Ingbert'),
|
||||
(gen_random_uuid(), 359, 'Leverkusen'),
|
||||
(gen_random_uuid(), 360, 'Linz am Rhein'),
|
||||
(gen_random_uuid(), 361, 'Celle'),
|
||||
(gen_random_uuid(), 362, 'Schwerte (Ruhr)'),
|
||||
(gen_random_uuid(), 363, 'Weilheim i. OB'),
|
||||
(gen_random_uuid(), 710, 'Ansbach'),
|
||||
(gen_random_uuid(), 712, 'Dillingen a.d. Donau'),
|
||||
(gen_random_uuid(), 717, 'Paris'),
|
||||
(gen_random_uuid(), 8007, 'Rheinland'),
|
||||
(gen_random_uuid(), 8019, 'Düsseldorf'),
|
||||
(gen_random_uuid(), 8020, 'Amsterdam'),
|
||||
(gen_random_uuid(), 8022, 'Waldecker Land'),
|
||||
(gen_random_uuid(), 8029, 'Europa/Europe'),
|
||||
(gen_random_uuid(), 9006, 'Martin Luther'),
|
||||
(gen_random_uuid(), 9018, 'Freistaat Bayern'),
|
||||
(gen_random_uuid(), 9025, 'Nordrhein-Westfalen'),
|
||||
(gen_random_uuid(), 9026, 'Zürichsee'),
|
||||
(gen_random_uuid(), 9028, 'Freistaat Sachsen'),
|
||||
(gen_random_uuid(), 9041, 'Baden-Württemberg'),
|
||||
(gen_random_uuid(), 9050, 'Metropole Ruhr'),
|
||||
(gen_random_uuid(), 9202, 'Schleswig-Holstein'),
|
||||
(gen_random_uuid(), 9208, 'Nationalpark Bayerischer Wald'),
|
||||
(gen_random_uuid(), 9234, 'Ruhr'),
|
||||
(gen_random_uuid(), 9237, 'Spree'),
|
||||
(gen_random_uuid(), 9457, 'Bundesrepublik Deutschland'),
|
||||
(gen_random_uuid(), 9481, 'Rheinland-Pfalz');
|
Reference in New Issue
Block a user