@tmlmobilidade/types
Version:
125 lines (124 loc) • 4.08 kB
JavaScript
/* * */
import { createGtfsMapper } from '../gtfs-new/mapper.js';
import { StopIdSchema } from '../stops/stop-id.js';
import { CommentSchema, DocumentSchema } from '@tmlmobilidade/go-types-shared';
import { z } from 'zod';
import { StopsParametersListSchema } from './parameters.js';
import { PatternUpdateRulesSchema, ScheduleRuleSchema } from './rules.js';
/* * */
export const PatternDirectionValues = [
'outbound',
'inbound',
];
export const PatternDirectionSchema = z.enum(PatternDirectionValues);
export const patternDirectionMapper = createGtfsMapper({
inbound: '1',
outbound: '0',
});
export const directionOptions = [
{ label: 'Ida', value: 'outbound' },
{ label: 'Volta', value: 'inbound' },
];
/* * */
export const PathSchema = z.object({
_id: z.string(),
allow_drop_off: z.boolean().default(true),
allow_pickup: z.boolean().default(true),
distance_delta: z.number().nullable().default(null),
stop_id: StopIdSchema,
timepoint: z.boolean().default(true),
zones: z.array(z.string()).optional(),
});
/* * */
const ShapeAnchorSchema = z.object({
_id: z.string(),
after_stop_id: StopIdSchema,
before_stop_id: StopIdSchema,
lat: z.number(),
lon: z.number(),
sequence: z.number().default(0),
type: z.enum(['via', 'through']).default('via'),
});
const ShapeLegSchema = z.object({
distance: z.number(),
duration: z.number(),
encoded_polyline: z.string().optional(),
from_index: z.number(),
geojson: z.object({
geometry: z.object({
coordinates: z.array(z.array(z.number())),
type: z.string().default('LineString'),
}),
properties: z.object({
distance: z.number(),
duration: z.number(),
from_index: z.number(),
to_index: z.number(),
}),
type: z.string().default('Feature'),
}),
geometry: z.array(z.tuple([z.number(), z.number()])),
to_index: z.number(),
});
export const ShapeSchema = z.object({
anchors: z.array(ShapeAnchorSchema).optional(),
encoded_polyline: z.string().optional(),
extension: z.number(),
geojson: z.object({
geometry: z.object({
coordinates: z.array(z.array(z.number())),
type: z.string().default('LineString'),
}),
properties: z.object({}).optional(),
type: z.string().default('Feature'),
}),
legs: z.array(ShapeLegSchema).optional(),
});
/* * */
export const PatternSchema = DocumentSchema.extend({
code: z.string().trim().min(1).max(10),
// Activity (field changes and notes)
comments: z.array(CommentSchema).optional().default([]),
destination: z.string().trim().min(1).max(100),
direction: PatternDirectionSchema.default('outbound'),
headsign: z.string().trim().min(1).max(100),
is_locked: z.boolean().default(false),
line_id: z.string(),
origin: z.string().trim().min(1).max(100),
parameters: StopsParametersListSchema.optional(),
path: z.array(PathSchema).optional(),
route_id: z.string(),
rules: z.array(ScheduleRuleSchema).optional().default([]),
shape: ShapeSchema.optional(),
});
export const PatternSimplifiedSchema = z.object({
_id: z.string(),
code: z.string().trim().min(1).max(10),
headsign: z.string().trim().min(1).max(100),
line_id: z.string(),
route_id: z.string(),
});
export const PatternShapeMapItemSchema = z.object({
agency_id: z.string(),
color: z.string(),
destination: z.string(),
encoded_polyline: z.string(),
headsign: z.string(),
line_code: z.string(),
line_id: z.string(),
line_name: z.string(),
line_text_color: z.string(),
origin: z.string(),
pattern_code: z.string(),
pattern_id: z.string(),
route_id: z.string(),
});
/* * */
export const CreatePatternSchema = PatternSchema.omit({ _id: true, created_at: true, updated_at: true });
export const UpdatePatternSchema = CreatePatternSchema
.omit({ created_by: true })
.partial()
.extend({
rules: PatternUpdateRulesSchema,
});
/* * */