import {z} from 'zod' export type NocCloudProvider = 'amazons3' | 'amazons3gov' | 'azure' | 'google' | 'googles3' | 'atmos' | 'ironmountain' | 'rackspace' | 'nirvanix' | 'synaptic' | 'castor' | 'delldx' | 'cloudone' | 'hp' | 'cleversafe' | 'vipr' | 'ibmcos' | 'hcp' | 's3_compatible'; export type Protocol = 'NFS' | 'SMB' | 'FTP'; export type PortalApiDtoVolumesRole = 'owner' | 'connected'; export type SecurityMode = 'Publicly Available' | 'Active Directory' | 'LDAP Directory'; export type PermissionPolicy = 'POSIX Mixed Mode' | 'UNIX/NFS Permissions Only Mode' | 'Unauthenticated Access Mode' | 'NTFS Compatible Mode' | 'NTFS Exclusive Mode' | 'NTFS Multiprotocol Mode'; export type ConnectionPermission = 'READONLY' | 'READWRITE' | 'Custom'; export type VolumeSortBy = 'volume_name' | 'cloud_provider' | 'cloud_region' | 'accessible_data' | 'unprotected_data' | 'last_snapshot_utc' | 'appliance_name'; export type SortOrder = 'asc' | 'desc'; export type GetApiVolumeConnectionsArgs = {cloud_providers?: (Array | null) | undefined, protocols?: (Array | null) | undefined, roles?: (Array | null) | undefined, security_modes?: (Array | null) | undefined, permission_policies?: (Array | null) | undefined, connection_permissions?: (Array | null) | undefined, cloud_regions?: (Array | null) | undefined, appliance_names?: (Array | null) | undefined, volume_names?: (Array | null) | undefined, sort_by?: (VolumeSortBy | null) | undefined, sort_order?: SortOrder | undefined, search?: (string | null) | undefined, volume_id?: (string | null) | undefined}; export type GetApiVolumeConnectionsOptions = {baseUrl?: string | undefined, HTTPBearer?: string | undefined, fetch?: typeof fetch | undefined}; export const nocCloudProvider = z.enum(["amazons3", "amazons3gov", "azure", "google", "googles3", "atmos", "ironmountain", "rackspace", "nirvanix", "synaptic", "castor", "delldx", "cloudone", "hp", "cleversafe", "vipr", "ibmcos", "hcp", "s3_compatible"]); export const protocol = z.enum(["NFS", "SMB", "FTP"]); export const permissionPolicy = z.enum(["POSIX Mixed Mode", "UNIX/NFS Permissions Only Mode", "Unauthenticated Access Mode", "NTFS Compatible Mode", "NTFS Exclusive Mode", "NTFS Multiprotocol Mode"]); export const securityMode = z.enum(["Publicly Available", "Active Directory", "LDAP Directory"]); export const snapshotStatus = z.enum(["idle", "pending", "in_progress", "succeeded", "failed", "cancelling", "cancelled", "cancel_rejected", "up_to_date"]); export const connectionPermission = z.enum(["READONLY", "READWRITE", "Custom"]); export const portalApiDtoVolumesRole = z.enum(["owner", "connected"]); export const volumeConnectionItemDto = z.object({cloud_provider: nocCloudProvider.nullable().optional(), cloud_region: z.string().nullable().optional(), protocol: z.array(protocol).optional(), accessible_data: z.number().int().nullable().optional(), unprotected_data: z.number().int().nullable().optional(), volume_id: z.string(), volume_name: z.string(), status: z.string().nullable().optional(), permission_policy: permissionPolicy.nullable().optional(), security_mode: securityMode.nullable().optional(), appliance_id: z.string(), appliance_name: z.string(), last_snapshot_utc: z.string().nullable().optional(), current_snapshot_status: snapshotStatus.optional(), connection_permission: connectionPermission.nullable().optional(), role: portalApiDtoVolumesRole, appliance_hostname: z.string().nullable().optional(), is_readonly: z.boolean().nullable().optional(), share_count: z.number().int().nullable().optional(), export_count: z.number().int().nullable().optional(), ftp_dir_count: z.number().int().nullable().optional(), snapshot_start: z.number().int().nullable().optional(), snapshot_stop: z.number().int().nullable().optional(), snapshot_days: z.array(z.string()).optional(), snapshot_frequency: z.number().int().nullable().optional(), sync_schedule: z.record(z.string(), z.unknown()).nullable().optional(), pinned_folders_count: z.number().int().nullable().optional(), autofault_folders_count: z.number().int().nullable().optional()}); export const volumeConnectionsResponseDto = z.object({items: z.array(volumeConnectionItemDto).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 Volume Connections * * GET /volume_connections */ export const getApiVolumeConnections = async (args: GetApiVolumeConnectionsArgs, options?: GetApiVolumeConnectionsOptions) => { const {baseUrl = "https://am1.portal.api.nasuni.com", fetch: fetchFn = fetch, HTTPBearer} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") for (const item of args.cloud_providers ?? []) query.append("cloud_providers", String(item)) for (const item of args.protocols ?? []) query.append("protocols", String(item)) for (const item of args.roles ?? []) query.append("roles", String(item)) for (const item of args.security_modes ?? []) query.append("security_modes", String(item)) for (const item of args.permission_policies ?? []) query.append("permission_policies", String(item)) for (const item of args.connection_permissions ?? []) query.append("connection_permissions", String(item)) for (const item of args.cloud_regions ?? []) query.append("cloud_regions", String(item)) for (const item of args.appliance_names ?? []) query.append("appliance_names", String(item)) for (const item of args.volume_names ?? []) query.append("volume_names", String(item)) if (args.sort_by != null) query.append("sort_by", String(args.sort_by)) if (args.sort_order != null) query.append("sort_order", String(args.sort_order)) if (args.search != null) query.append("search", String(args.search)) if (args.volume_id != null) query.append("volume_id", String(args.volume_id)) if (HTTPBearer !== undefined) headers.set('authorization', `Bearer ${HTTPBearer}`) const url = `${baseUrl.replace(/\/+$/, '')}/volume_connections${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(volumeConnectionsResponseDto, await res.json()) };