import {z} from 'zod' export type GetApiV1VehiclesVehicleIdMaintenanceServicesArgs = {vehicle_id: string}; export type GetApiV1VehiclesVehicleIdMaintenanceServicesOptions = {baseUrl?: string | undefined, OAuth2ClientCredentialsBearer?: string | undefined, fetch?: typeof fetch | undefined}; export const affectedComponent = z.enum(["VEHICLE", "ENGINE", "TRANSMISSION", "DRIVE_TRAIN", "MOTOR", "BRAKES", "BRAKE_FRONT", "BRAKE_REAR", "BRAKE_FLUID", "BRAKE_BOOSTER", "STEERING", "SUSPENSION", "ELECTRIC_POWER_STEERING", "BATTERY", "AUXILIARY_BATTERY", "ELECTRICAL_SYSTEM", "HYBRID_SYSTEM", "THERMAL_MANAGEMENT", "ENGINE_OIL", "COOLING", "FUEL", "EXHAUST_SYSTEM", "EMISSIONS_SYSTEM", "TIRES", "TIRE_PRESSURE_MONITORING_SYSTEM", "AIRBAGS", "AIRBAG", "SEATBELTS", "CRASH_DETECTION_SYSTEM", "CRASH_SAFETY_SYSTEM", "AUTOMATIC_BRAKING_SYSTEM", "EMERGENCY_BRAKING_SYSTEM", "PEDESTRIAN_PROTECTION_SYSTEM", "LANE_DEPARTURE_WARNING_SYSTEM", "HILL_START_SYSTEM", "AUTOPILOT", "CRUISE_CONTROL", "PARKING_SENSORS", "CAMERAS", "SENSORS", "TRACTION_SYSTEM", "ELECTRONIC_STABILITY_CONTROL", "HEADLIGHTS", "SIDE_LIGHTS", "BRAKE_LIGHTS", "REAR_LIGHTS", "REVERSE_LIGHTS", "SIGNAL_LIGHTS", "NUMBER_PLATE_LIGHTS", "TRAILER_LIGHTS", "ADAPTIVE_LIGHTING_SYSTEM", "LIGHTS", "BODY", "DOORS", "TRUNK", "ROOF", "WINDOWS", "LOCKS", "KEYS", "SECURITY_SYSTEM", "WASHER_LIQUID", "WIPERS", "CLOCK", "ODOMETER", "EXTERNAL_CHARGING_EQUIPMENT", "INTERNAL_CHARGING_EQUIPMENT", "VEHICLE_CHARGING_PORT", "CHARGING_COUPLER", "TRAILER"]); export const serviceType = z.enum(["FULL_SERVICE", "HEALTH_CHECK", "STATUTORY", "OIL_CHANGE"]); export const serviceStatus = z.enum(["PENDING", "NO_SERVICE_DUE", "IN_SERVICE", "NOT_IN_SERVICE_UNKNOWN_IF_DUE"]); export const vehicleService = z.object({component: affectedComponent, type: serviceType, kmToNextService: z.string().nullable().optional(), dateOfNextServiceAt: z.string().nullable().optional(), dateOfLastServiceAt: z.string().nullable().optional(), odometerKmAtLastService: z.string().nullable().optional(), status: serviceStatus.nullable().optional()}); export const vehicleServices = z.object({services: z.array(vehicleService)}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Get Vehicle Services * * GET /v1/vehicles/{vehicle_id}/maintenance/services */ export const getApiV1VehiclesVehicleIdMaintenanceServices = async (args: GetApiV1VehiclesVehicleIdMaintenanceServicesArgs, options?: GetApiV1VehiclesVehicleIdMaintenanceServicesOptions) => { const {baseUrl = "https://api.volteras.com", fetch: fetchFn = fetch, OAuth2ClientCredentialsBearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (OAuth2ClientCredentialsBearer !== undefined) headers.set('authorization', `Bearer ${OAuth2ClientCredentialsBearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/vehicles/${encodeURIComponent(String(args.vehicle_id))}/maintenance/services${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(vehicleServices, await res.json()) };