Skip to content

Commit 286919a

Browse files
committed
WIP backend: add combined handler
1 parent 58d8be7 commit 286919a

File tree

4 files changed

+75
-4
lines changed

4 files changed

+75
-4
lines changed

backend/controllers/timetable/bahnhofHandler.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
import express from "npm:express";
33
import { Connection, Journey } from "../../models/connection.ts";
44
import mapConnection from "../../lib/mapping.ts";
5-
6-
type RequestType = "departures" | "arrivals";
5+
import { RequestType } from "./vendoHandler.ts";
76

87
export class BahnhofHandler {
98
async handleRequest(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// @ts-types="npm:@types/express"
2+
import express from "npm:express";
3+
import { RequestType } from "./vendoHandler.ts";
4+
import { DateTime } from "npm:luxon";
5+
6+
type Query = {
7+
evaNumber: string;
8+
type: RequestType;
9+
when?: string;
10+
duration?: number;
11+
results?: number;
12+
}
13+
14+
export class CombinedHandler {
15+
async handleRequest(
16+
req: express.Request,
17+
res: express.Response,
18+
): Promise<void> {
19+
let query: Query = req.query as unknown as Query;
20+
query = {
21+
...req.query as unknown as Query,
22+
when: query.when ?? DateTime.now().toISO(),
23+
duration: query.duration ?? 60,
24+
results: query.results ?? 1000,
25+
}
26+
27+
if (!query.evaNumber) {
28+
res.status(400).send("Station's evaNumber is required");
29+
return;
30+
}
31+
32+
if (!query.type) {
33+
res.status(400).send(
34+
"Type is required. Expected 'departures' or 'arrivals'",
35+
);
36+
return;
37+
}
38+
39+
if (!DateTime.fromISO(query.when).isValid) {
40+
res.status(400).send("Invalid date");
41+
return;
42+
}
43+
44+
const now = DateTime.now().set({ second: 0, millisecond: 0 });
45+
const diffToStart = Math.round(DateTime.fromISO(query.when).diff(now, "hours").hours);
46+
const diffToEnd = Math.round((DateTime.fromISO(query.when).diff(now, "hours").minutes + query.duration) / 60);
47+
48+
// Bahnhof API only allows requests for the next 6 hours
49+
if (diffToStart < -1 || diffToEnd > 6) {
50+
// TODO: somehow url is not correct
51+
const request = await fetch(`http://localhost:8000/api/v1/timetable/vendo?evaNumber=${query.evaNumber}&type=${query.type}&when=${encodeURIComponent(query.when as string)}&duration=${query.duration}&results=${query.results}`, { method: "GET" });
52+
if (!request.ok) {
53+
res.status(200).send(request.body);
54+
return;
55+
}
56+
57+
const data = await request.json();
58+
if (!data[query.type] || !Array.isArray(data[query.type])) {
59+
res.status(200).send([]);
60+
return;
61+
}
62+
63+
res.status(200).send(data);
64+
return;
65+
}
66+
67+
res.status(200).send("OK");
68+
return;
69+
}
70+
}

backend/controllers/timetable/timetable.ts

+3
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22
import express from "npm:express";
33
import { BahnhofHandler } from "./bahnhofHandler.ts";
44
import { VendoHandler } from "./vendoHandler.ts";
5+
import { CombinedHandler } from "./combinedHandler.ts";
56

67
export class TimetableController {
78
public router = express.Router();
89

910
private bahnhofHandler = new BahnhofHandler();
1011
private vendoHandler = new VendoHandler();
12+
private combinedHandler = new CombinedHandler();
1113

1214
constructor() {
15+
this.router.get("/api/v1/timetable", this.combinedHandler.handleRequest.bind(this.combinedHandler));
1316
this.router.get("/api/v1/timetable/bahnhof", this.bahnhofHandler.handleRequest.bind(this.bahnhofHandler));
1417
this.router.get("/api/v1/timetable/vendo", this.vendoHandler.handleSingle.bind(this.vendoHandler));
1518
}

backend/controllers/timetable/vendoHandler.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { Connection } from "../../models/connection.ts";
44
import mapConnection from "../../lib/mapping.ts";
55
import { DateTime } from "npm:luxon";
66
import merge from "../../lib/merge.ts";
7-
import Conn = Deno.Conn;
87

98
export type RequestType = "departures" | "arrivals";
109
// fetches boards; db = RIS id, dbnav = HAFAS, all = both
@@ -31,7 +30,7 @@ export class VendoHandler {
3130
let query: Query = req.query as unknown as Query;
3231
query = {
3332
...req.query as unknown as Query,
34-
when: query.when ?? DateTime.local().toISO(),
33+
when: query.when ?? DateTime.now().toISO(),
3534
duration: query.duration ?? 60,
3635
results: query.results ?? 1000,
3736
}

0 commit comments

Comments
 (0)