From a431054e9b90b84a320e03c4d0d1a3c5a10c9d09 Mon Sep 17 00:00:00 2001 From: marudor Date: Sat, 18 Jan 2025 11:59:23 +0100 Subject: [PATCH] chore: some temp api --- src/external/risBoards.ts | 15 +++++++++ src/server/rpc/boards.ts | 35 +++++++++++++++++++++ src/server/rpc/index.ts | 9 ++++++ src/server/rpc/journeys.ts | 63 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 src/server/rpc/boards.ts diff --git a/src/external/risBoards.ts b/src/external/risBoards.ts index c93ac4114..7edfaa55f 100644 --- a/src/external/risBoards.ts +++ b/src/external/risBoards.ts @@ -43,6 +43,21 @@ interface CombinedArrivalDeparture { departure?: StopDeparture; } +export async function rawRisDepartures( + evaNumber: string, + timeStart: Date, + timeEnd: Date, +) { + const departures = await boardsClient.boardDeparture({ + evaNumbers: [evaNumber], + includeStationGroup: true, + timeStart: timeStart.toISOString(), + timeEnd: timeEnd.toISOString(), + }); + + return departures.data; +} + // NOT SORTED export async function departureAndArrivals( evaNumber: string, diff --git a/src/server/rpc/boards.ts b/src/server/rpc/boards.ts new file mode 100644 index 000000000..145d96598 --- /dev/null +++ b/src/server/rpc/boards.ts @@ -0,0 +1,35 @@ +import type { BoardPublicDeparture } from '@/external/generated/risBoards'; +import { rawRisDepartures } from '@/external/risBoards'; +import { rpcAppRouter, rpcProcedure } from '@/server/rpc/base'; +import type { QueryProcedure } from '@trpc/server/unstable-core-do-not-import'; +import { z } from 'zod'; + +type RawRisDeparturesProcedure = QueryProcedure<{ + input: { + evaNumber: string; + timeStart: Date; + timeEnd: Date; + }; + output: BoardPublicDeparture; +}>; + +export const boardsRpcRouter = rpcAppRouter({ + rawDepartures: rpcProcedure + .meta({ + openapi: { + method: 'GET', + path: '/boards/v1/departures/{evaNumber}', + }, + }) + .input( + z.object({ + evaNumber: z.string(), + timeStart: z.date(), + timeEnd: z.date(), + }), + ) + .output(z.any()) + .query(({ input: { evaNumber, timeStart, timeEnd } }) => { + return rawRisDepartures(evaNumber, timeStart, timeEnd); + }) as RawRisDeparturesProcedure, +}); diff --git a/src/server/rpc/index.ts b/src/server/rpc/index.ts index 1774ffa55..012662665 100644 --- a/src/server/rpc/index.ts +++ b/src/server/rpc/index.ts @@ -1,5 +1,6 @@ import { bahnRpcRouter } from '@/server/rpc/bahn'; import { rpcAppRouter } from '@/server/rpc/base'; +import { boardsRpcRouter } from '@/server/rpc/boards'; import { coachSequenceRpcRouter } from '@/server/rpc/coachSequence'; import { connectionsRouter } from '@/server/rpc/connections'; import { hafasRpcRouter } from '@/server/rpc/hafas'; @@ -18,6 +19,7 @@ const mainRouter = rpcAppRouter({ journeys: journeysRpcRouter, connections: connectionsRouter, bahn: bahnRpcRouter, + boards: boardsRpcRouter, }); export type AppRouter = typeof mainRouter; @@ -30,6 +32,13 @@ export const rpcHttpHandler = createOpenApiHttpHandler({ maxBodySize: undefined, }); +// const doc = generateOpenApiDocument(mainRouter, { +// title: 'bahn.expert', +// baseUrl: 'https://bahn.expert/api', +// version: '0.0.1', +// }); +// fs.writeFileSync('./openapi.json', JSON.stringify(doc), 'utf8'); + const rpcHandler = createHTTPHandler({ router: mainRouter, }); diff --git a/src/server/rpc/journeys.ts b/src/server/rpc/journeys.ts index e8f01319c..81c142b5c 100644 --- a/src/server/rpc/journeys.ts +++ b/src/server/rpc/journeys.ts @@ -1,4 +1,8 @@ import { bahnJourneyDetails } from '@/bahnde/journeyDetails/journeyDetails'; +import type { + JourneyEventBased, + JourneyFindResult, +} from '@/external/generated/risJourneysV2'; import { findJourney, findJourneyHafasCompatible, @@ -6,6 +10,7 @@ import { import { findJourneyHafasCompatible as findJourneyHafasCompatibleV2, findJourney as findJourneyV2, + getJourneyDetails, } from '@/external/risJourneysV2'; import { getCategoryAndNumberFromName } from '@/server/journeys/journeyDetails'; import { journeyDetails } from '@/server/journeys/v2/journeyDetails'; @@ -75,7 +80,65 @@ export type JourneyRPCQuery = QueryProcedure<{ output: JourneyResponse | undefined | null; }>; +type RawRPCJourney = QueryProcedure<{ + input: { + journeyId: string; + }; + output: JourneyEventBased | undefined; +}>; + +type RawRPCJourneyFind = QueryProcedure<{ + input: { + journeyNumber: number; + date: Date; + category?: string; + administration?: string; + }; + output: JourneyFindResult[]; +}>; + export const journeysRpcRouter = rpcAppRouter({ + rawJourneyByNumber: rpcProcedure + .meta({ + openapi: { + method: 'GET', + path: '/journeys/v1/{journeyId}', + }, + }) + .input( + z.object({ + journeyId: z.string(), + }), + ) + .output(z.any()) + .query(async ({ input: { journeyId } }) => { + const journey = await getJourneyDetails(journeyId); + if (!journey) { + throw new TRPCError({ + code: 'NOT_FOUND', + }); + } + return journey; + }) as RawRPCJourney, + rawJourneyFind: rpcProcedure + .meta({ + openapi: { + method: 'GET', + path: '/journeys/v1/find', + }, + }) + .input( + z.object({ + journeyNumber: z.number(), + date: z.date(), + category: z.string().optional(), + administration: z.string().optional(), + }), + ) + .output(z.any()) + .query(({ input: { date, journeyNumber, administration, category } }) => { + return findJourneyV2(journeyNumber, date, category, true, administration); + }) as RawRPCJourneyFind, findByNumber: rpcProcedure .input( z.object({