import {z} from 'zod' export type CreateApiIntegrationsArgs = {body: {integration: {name: string, enabled?: boolean | undefined, type: 'active_directory_user_import', active_directory_group_id: string, active_directory_tenant_id: string, active_directory_user_email_property?: ('mail' | 'userPrincipalName') | undefined, group_id?: (number | null) | undefined, import_members_only?: boolean | undefined}} | {integration: {name: string, enabled?: boolean | undefined, type: 'braxos_elevator', place_id: number, api_key: string}} | {integration: {name: string, enabled?: boolean | undefined, type: 'event_webhook', url: string, enabled_events?: (Array<'access_key.create' | 'access_key.destroy' | 'amenity.create' | 'amenity.destroy' | 'amenity.update' | 'apple_pass.destroy' | 'apple_pass_instance.destroy' | 'apple_pass_instance.resume' | 'apple_pass_instance.suspend' | 'beacon.update' | 'booking.cancel' | 'booking.create' | 'camera.create' | 'camera.destroy' | 'camera.import' | 'camera.rate_limited' | 'camera_snapshot_set.create' | 'camera.update' | 'card.activate_with_token' | 'card.activate' | 'card.assign' | 'card.create' | 'card.deactivate' | 'card.deassign' | 'card.destroy' | 'card.update' | 'communication_policy.update' | 'controller.assign' | 'controller.deassign' | 'controller_input.closed' | 'controller_input_connection.create' | 'controller_input_connection.destroy' | 'controller_input_connection.update' | 'controller_input.opened' | 'controller_input.tamper' | 'controller_input.triggered' | 'controller.reboot' | 'controller_relay_connection.create' | 'controller_relay_connection.destroy' | 'controller_relay_connection.update' | 'controller.tamper' | 'controller.update' | 'controller.wiegand_board_connect' | 'controller.wiegand_board_disconnect' | 'controller_wiegand_connection.create' | 'controller_wiegand_connection.destroy' | 'controller_wiegand_connection.excessive_pin_attempts' | 'controller_wiegand_connection.update' | 'csv_card_import.create' | 'csv_user_import.create' | 'custom_role.create' | 'custom_role.destroy' | 'custom_role.update' | 'elevator.create' | 'elevator.destroy' | 'elevator.permit' | 'elevator_stop.cancel_lockdown' | 'elevator_stop.create' | 'elevator_stop.destroy' | 'elevator_stop.lock_down' | 'elevator_stop.scheduled_permit_ended' | 'elevator_stop.scheduled_permit_started' | 'elevator_stop.update' | 'elevator.update' | 'event_retention_policy.create' | 'event_retention_policy.destroy' | 'event_retention_policy.update' | 'face_credential.create' | 'face_credential.destroy' | 'face_credential.enroll' | 'floor.create' | 'floor.destroy' | 'floor.update' | 'group.create' | 'group.destroy' | 'group_elevator_stop.create' | 'group_elevator_stop.destroy' | 'group_link.create' | 'group_link.destroy' | 'group_lock.create' | 'group_lock.destroy' | 'group_terminal.create' | 'group_terminal.destroy' | 'group.update' | 'group_zone.create' | 'group_zone.destroy' | 'guest.create' | 'guest.destroy' | 'incident.create' | 'incident_policy.create' | 'incident_policy.destroy' | 'incident_policy_subscription.create' | 'incident_policy_subscription.destroy' | 'incident_policy_subscription.update' | 'incident_policy.update' | 'incident.update' | 'integration.create' | 'integration.destroy' | 'integration.disable_due_to_error' | 'integration.update' | 'integration.warn_due_to_error' | 'intercom.answer_call' | 'intercom.assign' | 'intercom_assignment.create' | 'intercom_assignment.destroy' | 'intercom_completed_call.create' | 'intercom.deassign' | 'intercom.dismiss_call' | 'intercom.finish_call' | 'intercom.initiate_streaming' | 'intercom.miss_call' | 'intercom.timeout_call' | 'intercom.trigger_call' | 'intercom.update' | 'invite.create' | 'kiosk.assign' | 'kiosk.deassign' | 'kiosk_shortcut.create' | 'kiosk_shortcut.destroy' | 'kiosk.update' | 'lock.cancel_lockdown' | 'lock.closed' | 'lock.create' | 'lock.destroy' | 'lock.first_to_arrive' | 'lock.forced_open' | 'lock.held_open' | 'lock.last_to_leave' | 'lock.lock_down' | 'lock.locked' | 'lock.opened' | 'lock.scheduled_unlock_ended' | 'lock.scheduled_unlock_started' | 'lock.tailgate' | 'lock.unlock' | 'lock.update' | 'login.create' | 'login.destroy' | 'login.promote' | 'login.resolve' | 'marketplace_app_share.create' | 'marketplace_app_share.destroy' | 'marketplace_installation.create' | 'marketplace_installation.destroy' | 'marketplace_installation.update' | 'marketplace_shortcut.create' | 'marketplace_shortcut.destroy' | 'marketplace_shortcut.update' | 'member.create' | 'member.destroy' | 'member.update' | 'third_party_hf_uid_read_configuration.create' | 'third_party_hf_uid_read_configuration.destroy' | 'mifare_classic_data_block_configuration.create' | 'mifare_classic_data_block_configuration.destroy' | 'mifare_desfire_extra_application_configuration.create' | 'mifare_desfire_master_key_configuration.create' | 'mobile_cache_policy.update' | 'mobile_cache_policy.invalidate' | 'organization.accept_transfer' | 'organization.cancel_transfer' | 'organization.create' | 'organization.generate_next_certificate' | 'organization.reject_transfer' | 'organization.request_transfer' | 'organization.reset_scim_token' | 'organization.rotate_certificate' | 'organization.update' | 'place.cancel_lockdown' | 'place_card.create' | 'place_card.destroy' | 'place.create' | 'place.destroy' | 'place.lock_down' | 'place.occupancy_rate_limit_reach' | 'place.update' | 'reader.access' | 'reader.assign' | 'reader.deassign' | 'reader.reboot' | 'reader.reset_tamper' | 'reader.tamper' | 'reader.update' | 'report.create' | 'report.destroy' | 'report.download' | 'report.finish' | 'role_assignment.create' | 'role_assignment.destroy' | 'role_assignment.update' | 'schedule.create' | 'schedule.destroy' | 'schedule.update' | 'scheduled_report.create' | 'scheduled_report.destroy' | 'scheduled_report.update' | 'share.create' | 'share.destroy' | 'share.update' | 'subscription.update' | 'team.create' | 'team.destroy' | 'team_membership.create' | 'team_membership.destroy' | 'team.update' | 'terminal.create' | 'terminal.destroy' | 'terminal.trigger' | 'terminal.update' | 'user.activate_2fa' | 'user.create_backup_codes' | 'user.create_password' | 'user.create' | 'user.deactivate_2fa' | 'user.destroy' | 'user.show_confirmation' | 'user.update_password' | 'user.update' | 'visualization_page_reporter.create' | 'visualization_page_reporter.destroy' | 'visualization_page_share.create' | 'visualization_page_share.destroy' | 'wireless_lock.battery_warning' | 'wireless_lock.closed' | 'wireless_lock_connection.create' | 'wireless_lock_connection.destroy' | 'wireless_lock_connection.update' | 'wireless_lock.disenroll' | 'wireless_lock.locked' | 'wireless_lock.opened' | 'wireless_lock.tampered' | 'wireless_lock.unlocked' | 'wireless_lock.update' | 'zone.create' | 'zone.destroy' | 'zone.external_mode_override' | 'zone.override' | 'zone.policy_activate' | 'zone.policy_override' | 'zone.policy_transition' | 'zone.policy_violate' | 'zone.reset' | 'zone.update'>) | undefined, signature_key?: string | undefined}} | {integration: {name: string, enabled?: boolean | undefined, type: 'jumpcloud_user_import', jumpcloud_organization_id?: (string | null) | undefined, jumpcloud_group_id?: (string | null) | undefined, group_id?: (number | null) | undefined, import_members_only?: boolean | undefined, api_key: string}}}; export type CreateApiIntegrationsOptions = {baseUrl?: string | undefined, KisiLogin?: string | undefined, fetch?: typeof fetch | undefined}; export const createApiIntegrationsResponse = z.union([z.object({id: z.number().int(), resource_type: z.literal("Integration"), name: z.string(), type: z.literal("active_directory_user_import"), enabled: z.boolean(), disabled_due_to_error: z.boolean(), disabled_due_to_error_at: z.string().nullable(), created_at: z.string(), updated_at: z.string(), organization_id: z.number().int(), organization: z.object({id: z.number().int(), resource_type: z.literal("Organization"), name: z.string(), domain: z.string()}), place_id: z.number().int().nullable(), place: z.object({id: z.number().int(), resource_type: z.literal("Place"), name: z.string()}).optional(), active_directory_tenant_id: z.string(), active_directory_group_id: z.string(), active_directory_user_email_property: z.enum(["mail", "userPrincipalName"]), import_members_only: z.boolean(), group_id: z.number().int().nullable(), group: z.object({id: z.number().int(), resource_type: z.literal("Group"), name: z.string()}).optional()}), z.object({id: z.number().int(), resource_type: z.literal("Integration"), name: z.string(), type: z.literal("braxos_elevator"), enabled: z.boolean(), disabled_due_to_error: z.boolean(), disabled_due_to_error_at: z.string().nullable(), created_at: z.string(), updated_at: z.string(), organization_id: z.number().int(), organization: z.object({id: z.number().int(), resource_type: z.literal("Organization"), name: z.string(), domain: z.string()}), place_id: z.number().int(), place: z.object({id: z.number().int(), resource_type: z.literal("Place"), name: z.string()})}), z.object({id: z.number().int(), resource_type: z.literal("Integration"), name: z.string(), type: z.literal("event_webhook"), enabled: z.boolean(), disabled_due_to_error: z.boolean(), disabled_due_to_error_at: z.string().nullable(), created_at: z.string(), updated_at: z.string(), organization_id: z.number().int(), organization: z.object({id: z.number().int(), resource_type: z.literal("Organization"), name: z.string(), domain: z.string()}), place_id: z.number().int().nullable(), place: z.object({id: z.number().int(), resource_type: z.literal("Place"), name: z.string()}).optional(), url: z.string(), enabled_events: z.array(z.enum(["access_key.create", "access_key.destroy", "amenity.create", "amenity.destroy", "amenity.update", "apple_pass.destroy", "apple_pass_instance.destroy", "apple_pass_instance.resume", "apple_pass_instance.suspend", "beacon.update", "booking.cancel", "booking.create", "camera.create", "camera.destroy", "camera.import", "camera.rate_limited", "camera_snapshot_set.create", "camera.update", "card.activate_with_token", "card.activate", "card.assign", "card.create", "card.deactivate", "card.deassign", "card.destroy", "card.update", "communication_policy.update", "controller.assign", "controller.deassign", "controller_input.closed", "controller_input_connection.create", "controller_input_connection.destroy", "controller_input_connection.update", "controller_input.opened", "controller_input.tamper", "controller_input.triggered", "controller.reboot", "controller_relay_connection.create", "controller_relay_connection.destroy", "controller_relay_connection.update", "controller.tamper", "controller.update", "controller.wiegand_board_connect", "controller.wiegand_board_disconnect", "controller_wiegand_connection.create", "controller_wiegand_connection.destroy", "controller_wiegand_connection.excessive_pin_attempts", "controller_wiegand_connection.update", "csv_card_import.create", "csv_user_import.create", "custom_role.create", "custom_role.destroy", "custom_role.update", "elevator.create", "elevator.destroy", "elevator.permit", "elevator_stop.cancel_lockdown", "elevator_stop.create", "elevator_stop.destroy", "elevator_stop.lock_down", "elevator_stop.scheduled_permit_ended", "elevator_stop.scheduled_permit_started", "elevator_stop.update", "elevator.update", "event_retention_policy.create", "event_retention_policy.destroy", "event_retention_policy.update", "face_credential.create", "face_credential.destroy", "face_credential.enroll", "floor.create", "floor.destroy", "floor.update", "group.create", "group.destroy", "group_elevator_stop.create", "group_elevator_stop.destroy", "group_link.create", "group_link.destroy", "group_lock.create", "group_lock.destroy", "group_terminal.create", "group_terminal.destroy", "group.update", "group_zone.create", "group_zone.destroy", "guest.create", "guest.destroy", "incident.create", "incident_policy.create", "incident_policy.destroy", "incident_policy_subscription.create", "incident_policy_subscription.destroy", "incident_policy_subscription.update", "incident_policy.update", "incident.update", "integration.create", "integration.destroy", "integration.disable_due_to_error", "integration.update", "integration.warn_due_to_error", "intercom.answer_call", "intercom.assign", "intercom_assignment.create", "intercom_assignment.destroy", "intercom_completed_call.create", "intercom.deassign", "intercom.dismiss_call", "intercom.finish_call", "intercom.initiate_streaming", "intercom.miss_call", "intercom.timeout_call", "intercom.trigger_call", "intercom.update", "invite.create", "kiosk.assign", "kiosk.deassign", "kiosk_shortcut.create", "kiosk_shortcut.destroy", "kiosk.update", "lock.cancel_lockdown", "lock.closed", "lock.create", "lock.destroy", "lock.first_to_arrive", "lock.forced_open", "lock.held_open", "lock.last_to_leave", "lock.lock_down", "lock.locked", "lock.opened", "lock.scheduled_unlock_ended", "lock.scheduled_unlock_started", "lock.tailgate", "lock.unlock", "lock.update", "login.create", "login.destroy", "login.promote", "login.resolve", "marketplace_app_share.create", "marketplace_app_share.destroy", "marketplace_installation.create", "marketplace_installation.destroy", "marketplace_installation.update", "marketplace_shortcut.create", "marketplace_shortcut.destroy", "marketplace_shortcut.update", "member.create", "member.destroy", "member.update", "third_party_hf_uid_read_configuration.create", "third_party_hf_uid_read_configuration.destroy", "mifare_classic_data_block_configuration.create", "mifare_classic_data_block_configuration.destroy", "mifare_desfire_extra_application_configuration.create", "mifare_desfire_master_key_configuration.create", "mobile_cache_policy.update", "mobile_cache_policy.invalidate", "organization.accept_transfer", "organization.cancel_transfer", "organization.create", "organization.generate_next_certificate", "organization.reject_transfer", "organization.request_transfer", "organization.reset_scim_token", "organization.rotate_certificate", "organization.update", "place.cancel_lockdown", "place_card.create", "place_card.destroy", "place.create", "place.destroy", "place.lock_down", "place.occupancy_rate_limit_reach", "place.update", "reader.access", "reader.assign", "reader.deassign", "reader.reboot", "reader.reset_tamper", "reader.tamper", "reader.update", "report.create", "report.destroy", "report.download", "report.finish", "role_assignment.create", "role_assignment.destroy", "role_assignment.update", "schedule.create", "schedule.destroy", "schedule.update", "scheduled_report.create", "scheduled_report.destroy", "scheduled_report.update", "share.create", "share.destroy", "share.update", "subscription.update", "team.create", "team.destroy", "team_membership.create", "team_membership.destroy", "team.update", "terminal.create", "terminal.destroy", "terminal.trigger", "terminal.update", "user.activate_2fa", "user.create_backup_codes", "user.create_password", "user.create", "user.deactivate_2fa", "user.destroy", "user.show_confirmation", "user.update_password", "user.update", "visualization_page_reporter.create", "visualization_page_reporter.destroy", "visualization_page_share.create", "visualization_page_share.destroy", "wireless_lock.battery_warning", "wireless_lock.closed", "wireless_lock_connection.create", "wireless_lock_connection.destroy", "wireless_lock_connection.update", "wireless_lock.disenroll", "wireless_lock.locked", "wireless_lock.opened", "wireless_lock.tampered", "wireless_lock.unlocked", "wireless_lock.update", "zone.create", "zone.destroy", "zone.external_mode_override", "zone.override", "zone.policy_activate", "zone.policy_override", "zone.policy_transition", "zone.policy_violate", "zone.reset", "zone.update"]))}), z.object({id: z.number().int(), resource_type: z.literal("Integration"), name: z.string(), type: z.literal("jumpcloud_user_import"), enabled: z.boolean(), disabled_due_to_error: z.boolean(), disabled_due_to_error_at: z.string().nullable(), created_at: z.string(), updated_at: z.string(), organization_id: z.number().int(), organization: z.object({id: z.number().int(), resource_type: z.literal("Organization"), name: z.string(), domain: z.string()}), place_id: z.number().int().nullable(), place: z.object({id: z.number().int(), resource_type: z.literal("Place"), name: z.string()}).optional(), jumpcloud_group_id: z.string().nullable(), jumpcloud_organization_id: z.string().nullable(), import_members_only: z.boolean(), group_id: z.number().int().nullable(), group: z.object({id: z.number().int(), resource_type: z.literal("Group"), name: z.string()}).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 }; /** * Create integration * * POST /integrations * * Also accepts auth: OAuth2 */ export const createApiIntegrations = async (args: CreateApiIntegrationsArgs, options?: CreateApiIntegrationsOptions) => { const {baseUrl = "https://api.kisi.io", fetch: fetchFn = fetch, KisiLogin} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (KisiLogin !== undefined) headers.set("Authorization", KisiLogin) const url = `${baseUrl.replace(/\/+$/, '')}/integrations${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(createApiIntegrationsResponse, await res.json()) };