aboutsummaryrefslogtreecommitdiff
path: root/src/frontend/app/api/schema.ts
blob: 60e2d972054ec75d40715cfcf20912e0d04214cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import { z } from "zod";

export const RouteInfoSchema = z.object({
  shortName: z.string(),
  colour: z.string(),
  textColour: z.string(),
});

export const HeadsignInfoSchema = z.object({
  badge: z.string().optional().nullable(),
  destination: z.string(),
  marquee: z.string().optional().nullable(),
});

export const ArrivalPrecissionSchema = z.enum([
  "confident",
  "unsure",
  "scheduled",
  "past",
]);

export const ArrivalDetailsSchema = z.object({
  minutes: z.number(),
  precission: ArrivalPrecissionSchema,
});

export const DelayBadgeSchema = z.object({
  minutes: z.number(),
});

export const ShiftBadgeSchema = z.object({
  shiftName: z.string(),
  shiftTrip: z.string(),
});

export const ArrivalSchema = z.object({
  route: RouteInfoSchema,
  headsign: HeadsignInfoSchema,
  estimate: ArrivalDetailsSchema,
  delay: DelayBadgeSchema.optional().nullable(),
  shift: ShiftBadgeSchema.optional().nullable(),
});

export const StopArrivalsResponseSchema = z.object({
  stopCode: z.string(),
  stopName: z.string(),
  arrivals: z.array(ArrivalSchema),
});

export type RouteInfo = z.infer<typeof RouteInfoSchema>;
export type HeadsignInfo = z.infer<typeof HeadsignInfoSchema>;
export type ArrivalPrecission = z.infer<typeof ArrivalPrecissionSchema>;
export type ArrivalDetails = z.infer<typeof ArrivalDetailsSchema>;
export type DelayBadge = z.infer<typeof DelayBadgeSchema>;
export type ShiftBadge = z.infer<typeof ShiftBadgeSchema>;
export type Arrival = z.infer<typeof ArrivalSchema>;
export type StopArrivalsResponse = z.infer<typeof StopArrivalsResponseSchema>;

// Consolidated Circulation (Legacy/Alternative API)
export const ConsolidatedCirculationSchema = z.object({
  line: z.string(),
  route: z.string(),
  schedule: z
    .object({
      running: z.boolean(),
      minutes: z.number(),
      serviceId: z.string(),
      tripId: z.string(),
      shapeId: z.string().optional().nullable(),
    })
    .optional()
    .nullable(),
  realTime: z
    .object({
      minutes: z.number(),
      distance: z.number(),
    })
    .optional()
    .nullable(),
  currentPosition: z
    .object({
      latitude: z.number(),
      longitude: z.number(),
      orientationDegrees: z.number(),
      shapeIndex: z.number().optional().nullable(),
    })
    .optional()
    .nullable(),
  isPreviousTrip: z.boolean().optional().nullable(),
  previousTripShapeId: z.string().optional().nullable(),
  nextStreets: z.array(z.string()).optional().nullable(),
});

export type ConsolidatedCirculation = z.infer<
  typeof ConsolidatedCirculationSchema
>;