import {z} from 'zod' export type GetApiV1ResourceownerContacts3MeOptions = {baseUrl: string, oauth2?: string | undefined, fetch?: typeof fetch | undefined}; export const organizationPermissionBooleans = z.object({OrganizationNodeViewVehicle: z.boolean().optional(), OrganizationNodeCreateEditVehicle: z.boolean().optional(), OrganizationNodeViewGeofence: z.boolean().optional(), OrganizationNodeCreateEditGeofence: z.boolean().optional(), OrganizationNodeViewPOI: z.boolean().optional(), OrganizationNodeCreateEditPOI: z.boolean().optional(), OrganizationNodeViewTrigger: z.boolean().optional(), OrganizationNodeCreateEditTrigger: z.boolean().optional(), OrganizationNodeViewTrip: z.boolean().optional(), OrganizationNodeEditTrip: z.boolean().optional(), OrganizationNodeViewTripIfDriver: z.boolean().optional(), OrganizationNodeEditTripIfDriver: z.boolean().optional(), OrganizationNodeView: z.boolean().optional(), OrganizationNodeViewContact: z.boolean().optional(), OrganizationNodeCreateEditContact: z.boolean().optional(), OrganizationNodeViewSchedule: z.boolean().optional(), OrganizationNodeCreateEditSchedule: z.boolean().optional(), OrganizationNodeViewExpense: z.boolean().optional(), OrganizationNodeCreateEditExpense: z.boolean().optional(), OrganizationView: z.boolean().optional(), OrganizationCreateEditDelete: z.boolean().optional(), OrganizationNodeCreateEditDelete: z.boolean().optional(), OrganizationNodeViewExcludePrivateTrips: z.boolean().optional(), OrganizationNodeViewLive: z.boolean().optional(), OrganizationNodeViewTripSpeed: z.boolean().optional(), OrganizationNodeEditOdometer: z.boolean().optional()}); export const companyScopesModel = z.object({CompanyId: z.number().int().optional(), VehicleIds: z.array(z.number().int()).optional(), Scopes: z.array(z.string()).optional()}); export const customCategoryModel = z.object({CustomCategoryId: z.number().int().optional(), Value: z.string().optional(), CustomCategoryType: z.union([z.literal(0), z.literal(1)]).optional()}); export const addressModel = z.object({AddressId: z.number().int().optional(), CompanyName: z.string().optional(), ContactNameAtAddress: z.string().optional(), AddressLine2: z.string().min(1), AddressLine3: z.string().optional(), AddressLine4: z.string().optional(), ZipCode: z.string().min(1), City: z.string().min(1), StateOrProvince: z.string().optional(), ISO3166CountryCode: z.string().min(1)}); export const organizationModel = z.object({OrganizationName: z.string().optional(), LegalIdentificationNumber: z.string().optional(), VATNumber: z.string().optional(), BillingAddress: addressModel.optional(), ShipmentAddress: addressModel.optional(), Culture: z.string().optional(), UnitType: z.union([z.literal(0), z.literal(1), z.literal(2)]).optional(), IsHierarchyEnabled: z.boolean().optional(), ISO4217CurrencyCode: z.string().optional(), OrganizationId: z.number().int().optional()}); export const timeSpan = z.object({Ticks: z.number().int().optional(), Days: z.number().int().optional(), Hours: z.number().int().optional(), Milliseconds: z.number().int().optional(), Microseconds: z.number().int().optional(), Nanoseconds: z.number().int().optional(), Minutes: z.number().int().optional(), Seconds: z.number().int().optional(), TotalDays: z.number().optional(), TotalHours: z.number().optional(), TotalMilliseconds: z.number().optional(), TotalMicroseconds: z.number().optional(), TotalNanoseconds: z.number().optional(), TotalMinutes: z.number().optional(), TotalSeconds: z.number().optional()}); export const hoursOfServiceSettingsModel = z.object({TimeZoneType: z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5), z.literal(6), z.literal(7), z.literal(8)]).optional(), WorkDayStartTime: timeSpan.optional(), CycleRuleType: z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5), z.literal(6), z.literal(7)]).optional(), CargoTypeType: z.union([z.literal(0), z.literal(1), z.literal(2)]).optional(), RestartRuleType: z.union([z.literal(0), z.literal(1)]).optional(), RestBreakRuleType: z.union([z.literal(0), z.literal(1)]).optional(), ShortHaulExceptionType: z.union([z.literal(0), z.literal(1)]).optional(), OdometerUnitType: z.union([z.literal(0), z.literal(1), z.literal(2)]).optional(), WellSiteRuleType: z.union([z.literal(0), z.literal(1)]).optional(), CarrierInfo: addressModel.optional(), IsEnabled: z.boolean().optional()}); export const contactMenuLayoutModel = z.object({MenuLayout: z.record(z.string(), z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(4)])).optional(), ExpiresAtUtc: z.string().optional(), RefreshedAtUtc: z.string().optional()}); export const accountOutstandingMessageModel = z.object({Title: z.string().optional(), Message: z.string().optional()}); export const accountInformationModel = z.object({AccountOutstandingMessage: accountOutstandingMessageModel.optional()}); export const tripScoreMessageModel = z.object({Title: z.string().optional(), Message: z.string().optional()}); export const tripScoreLevelModel = z.object({Color: z.string().optional(), MinValue: z.number().int().optional(), Text: z.string().optional()}); export const tripScoreInformationModel = z.object({CrownValue: z.number().int().optional(), EmptyMessage: tripScoreMessageModel.optional(), HelpMessage: tripScoreMessageModel.optional(), Levels: z.array(tripScoreLevelModel).optional()}); export const sSOConfigurationModel = z.object({ClientId: z.string().optional(), TenantId: z.string().optional(), Scopes: z.array(z.string()).optional()}); export const contact3DetailModel = z.object({ContactId: z.number().int().optional(), FirstName: z.string().optional(), LastName: z.string().optional(), EmailAddress: z.string().optional(), Description: z.string().optional(), CultureName: z.string().optional(), CountryCodeIso1366: z.string().optional(), DefaultVehicleId: z.number().int().optional(), UnitType: z.union([z.literal(0), z.literal(1), z.literal(2)]).optional(), SubscribeToNewsLetter: z.boolean().optional(), MobilePhoneNumber: z.string().optional(), MapType: z.union([z.literal(0), z.literal(1), z.literal(2)]).optional(), CheckedIntoVehicleId: z.number().int().optional(), CheckedInDateTimeUtc: z.string().optional(), CheckOutDateTimeUtc: z.string().optional(), CheckedInTripType: z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3)]).optional(), CheckedInCustomTripTypeName: z.string().optional(), CompanyRoles: z.array(z.union([z.literal(0), z.literal(1), z.literal(2), z.literal(3), z.literal(4), z.literal(5)])).optional(), ProfileImageUrl: z.string().optional(), OrganizationPermissions: organizationPermissionBooleans.optional(), CurrencyCode: z.string().optional(), CompaniesScopes: z.array(companyScopesModel).optional(), IsLocked: z.boolean().optional(), CustomCategories: z.array(customCategoryModel).optional(), OrganizationNodeId: z.number().int().optional(), Organization: organizationModel.optional(), HoursOfServiceSettingsModel: hoursOfServiceSettingsModel.optional(), FieldServiceEnabled: z.boolean().optional(), FieldServiceEnabledWithinOrganization: z.boolean().optional(), ContactMenuLayout: contactMenuLayoutModel.optional(), CreatedAt: z.string().optional(), AccountInformation: accountInformationModel.optional(), TripScoreInformation: tripScoreInformationModel.optional(), SSO: z.boolean().optional(), SSOConfig: sSOConfigurationModel.optional()}); 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 the contact representing myself * * GET /v1/resourceowner/contacts3/me */ export const getApiV1ResourceownerContacts3Me = async (options: GetApiV1ResourceownerContacts3MeOptions) => { const {baseUrl, fetch: fetchFn = fetch, oauth2} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (oauth2 !== undefined) headers.set('authorization', `Bearer ${oauth2}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/resourceowner/contacts3/me${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(contact3DetailModel, await res.json()) };