import {z} from 'zod' export type GetApiStackAdminconfigV2MaintenanceWindowsPreferencesAvailableWindowsArgs = {stack: string, start?: string | undefined, end?: string | undefined}; export type GetApiStackAdminconfigV2MaintenanceWindowsPreferencesAvailableWindowsOptions = {baseUrl: string, bearerAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const dayOfWeek = z.enum(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]); export const maintenanceWindowsTimeSlot = z.object({end: z.string(), start: z.string()}); export const maintenanceWindowsAvailableWindow = z.object({daysOfWeek: z.array(dayOfWeek), timeSlot: maintenanceWindowsTimeSlot}); export const maintenanceWindowsAvailableWindowsResponse = z.object({availableWindows: z.array(maintenanceWindowsAvailableWindow)}); 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 }; /** * Returns all available windows for a given stack that a customer can choose as 'Preferred time and day of week'. The response groups available days by predefined regional off-hours time slots, with days ordered by availability (most available first). If start and end query parameters are provided, they must match one of the predefined time slots to filter results to that specific time slot only. * * GET /{stack}/adminconfig/v2/maintenance-windows/preferences/available-windows */ export const getApiStackAdminconfigV2MaintenanceWindowsPreferencesAvailableWindows = async (args: GetApiStackAdminconfigV2MaintenanceWindowsPreferencesAvailableWindowsArgs, options: GetApiStackAdminconfigV2MaintenanceWindowsPreferencesAvailableWindowsOptions) => { const {baseUrl, fetch: fetchFn = fetch, bearerAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.start != null) query.append("start", String(args.start)) if (args.end != null) query.append("end", String(args.end)) if (bearerAuth !== undefined) headers.set('authorization', `Bearer ${bearerAuth}`) const url = `${baseUrl.replace(/\/+$/, '')}/${encodeURIComponent(String(args.stack))}/adminconfig/v2/maintenance-windows/preferences/available-windows${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(maintenanceWindowsAvailableWindowsResponse, await res.json()) };