UNPKG

@tmlmobilidade/types

Version:
53 lines (52 loc) 1.77 kB
/* * */ import { DocumentSchema } from '@tmlmobilidade/go-types-shared'; import { z } from 'zod'; /* * */ const PositionSchema = z.array(z.number()).min(2); const LinearRingSchema = z.array(PositionSchema).min(4); const PolygonCoordinatesSchema = z.array(LinearRingSchema).min(1); const MultiPolygonCoordinatesSchema = z.array(PolygonCoordinatesSchema).min(1); const GeometrySchema = z.union([ z.object({ coordinates: PolygonCoordinatesSchema, type: z.literal('Polygon'), }), z.object({ coordinates: MultiPolygonCoordinatesSchema, type: z.literal('MultiPolygon'), }), ]); const FeatureSchema = z.object({ geometry: GeometrySchema, properties: z.record(z.any()).optional().nullable(), type: z.literal('Feature'), }); const FeatureCollectionSchema = z.object({ features: z.array(FeatureSchema).min(1), type: z.literal('FeatureCollection'), }); const GeoJSONSchema = z.union([FeatureSchema, FeatureCollectionSchema]); /* * */ export const ZoneSchema = DocumentSchema.extend({ agency_ids: z.array(z.string()).min(1, 'At least one agency ID is required'), code: z.string().trim().min(1).max(30), geojson: GeoJSONSchema.nullable().default(null), is_locked: z.boolean().default(false), name: z.string().trim().min(1).max(50), }); /* * */ // Only name, code, and agency_ids are required for creation export const CreateZoneSchema = z.object({ agency_ids: ZoneSchema.shape.agency_ids, code: ZoneSchema.shape.code, name: ZoneSchema.shape.name, }).merge(ZoneSchema.omit({ agency_ids: true, code: true, created_at: true, name: true, updated_at: true, }).partial()); export const UpdateZoneSchema = CreateZoneSchema .omit({ created_by: true }) .partial();