import {z} from 'zod' export type GetApiV1AutomationsArgs = {'App-ID': string, 'Auth-Token': string}; export type GetApiV1AutomationsOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const analyzeActionParameters = z.object({force: z.boolean().optional(), force_type: z.enum(["OVERWRITE", "APPEND", "null"]).nullable().optional()}); export const analyzeActionSchema = z.object({parameters: analyzeActionParameters, type: z.literal("ANALYZE")}); export const extractFacesParameters = z.object({face_image_analysis_profile_id: z.string().nullable().optional(), face_video_analysis_profile_id: z.string().nullable().optional(), force: z.boolean().optional()}); export const extractFacesAction = z.object({parameters: extractFacesParameters, type: z.literal("EXTRACT_FACES")}); export const createPublicationTemplate = z.object({data: z.record(z.string(), z.unknown()).optional(), id: z.string()}); export const createPublicationJobThumbnailKeyframe = z.object({asset_id: z.string(), keyframe_id: z.string(), type: z.literal("KEYFRAME")}); export const createPublicationJobParameters = z.object({allow_transfer: z.boolean().optional(), metadata_overrides: z.record(z.string(), z.unknown()).optional(), storage_id: z.string().nullable().optional(), template: createPublicationTemplate, thumbnail: createPublicationJobThumbnailKeyframe.nullable().optional(), title: z.string().min(1).optional(), user_id: z.string()}); export const createPublicationJobAction = z.object({parameters: createPublicationJobParameters, type: z.literal("CREATE_PUBLICATION_JOB")}); export const archiveActionParameters = z.object({allow_duplicate_transfers: z.boolean().optional(), allow_host_transfer: z.boolean().optional(), delete_only_from_source_folder: z.boolean().optional(), delete_original: z.boolean().optional(), destination_directory_path: z.string().nullable().optional(), destination_storage_id: z.string(), keep_collection_structure: z.boolean().optional(), preferred_original_storage_id: z.string().nullable().optional()}); export const archiveActionSchema = z.object({parameters: archiveActionParameters, type: z.literal("ARCHIVE")}); export const restoreActionParameters = z.object({allow_duplicate_transfers: z.boolean().optional(), allow_host_transfer: z.boolean().optional(), delete_only_from_source_folder: z.boolean().optional(), delete_original: z.boolean().optional(), destination_directory_path: z.string().nullable().optional(), destination_storage_id: z.string(), keep_collection_structure: z.boolean().optional(), preferred_original_storage_id: z.string().nullable().optional()}); export const restoreAction = z.object({parameters: restoreActionParameters, type: z.literal("RESTORE")}); export const exportActionParameters = z.object({export_location_id: z.string(), export_metadata: z.boolean().nullable().optional(), export_to_asset_folder: z.boolean().nullable().optional(), file_name: z.string().nullable().optional(), format_id: z.string().nullable().optional(), metadata_format: z.enum(["CSV", "JSON", "XML", "null"]).nullable().optional(), metadata_view: z.string().nullable().optional(), overwrite: z.boolean().nullable().optional(), preferred_original_storage_id: z.string().nullable().optional(), transcode_profile_ids: z.array(z.string()).nullable().optional()}); export const exportAction = z.object({parameters: exportActionParameters, type: z.literal("EXPORT")}); export const aCLUpdateSchema = z.object({group_ids: z.array(z.string()).nullable().optional(), mode: z.enum(["APPEND", "OVERWRITE"]), permissions: z.array(z.enum(["read", "delete", "change-acl", "write"])), user_ids: z.array(z.string()).nullable().optional()}); export const updateACLActionParameters = z.object({objects: z.array(aCLUpdateSchema)}); export const updateACLAction = z.object({parameters: updateACLActionParameters, type: z.literal("UPDATE_ACL")}); export const metadataFieldValueUpdateSchema = z.object({field_values: z.array(z.record(z.string(), z.unknown())).optional(), mode: z.enum(["append", "delete", "overwrite"]).optional()}); export const metadataUpdateActionParameters = z.object({metadata_values: z.record(z.string(), metadataFieldValueUpdateSchema), metadata_view_id: z.string()}); export const metadataUpdateAction = z.object({parameters: metadataUpdateActionParameters, type: z.literal("METADATA_UPDATE")}); export const aIMetadataFillingActionParameters = z.object({field_names: z.array(z.string()).nullable().optional(), metadata_view_id: z.string(), overwrite: z.boolean()}); export const aIMetadataFillingActionSchema = z.object({parameters: aIMetadataFillingActionParameters, type: z.literal("AI_METADATA_FILLING")}); export const transcodeActionParameters = z.object({format_name: z.string().optional(), prefer_any_cloud: z.boolean().optional(), preferred_storage_id: z.string().optional(), preferred_storage_method: z.enum(["FILE", "HTTP", "FTP", "SFTP", "S3", "B2", "GCS", "PORTAL", "CUSTOM", "AZURE"]).optional(), priority: z.number().int().gte(1).lte(10).optional()}); export const transcodeAction = z.object({parameters: transcodeActionParameters, type: z.literal("TRANSCODE")}); export const transferActionParameters = z.object({allow_host_transfer: z.boolean().optional(), destination_directory_path: z.string().nullable().optional(), destination_storage_id: z.string(), format_name: z.string(), preferred_original_storage_id: z.string().nullable().optional()}); export const transferAction = z.object({parameters: transferActionParameters, type: z.literal("TRANSFER")}); export const requestOriginalAction = z.object({parameters: transferActionParameters, type: z.literal("REQUEST_ORIGINAL")}); export const addToCollectionActionParameters = z.object({collection_id: z.string(), index_immediately: z.boolean().optional()}); export const addToCollectionActionSchema = z.object({parameters: addToCollectionActionParameters, type: z.literal("ADD_TO_COLLECTION")}); export const addToPortalActionParameters = z.object({index_immediately: z.boolean().optional(), portal_id: z.string()}); export const addToPortalActionSchema = z.object({parameters: addToPortalActionParameters, type: z.literal("ADD_TO_PORTAL")}); export const removeFromPortalActionParameters = z.object({index_immediately: z.boolean().optional(), portal_id: z.string()}); export const removeFromPortalAction = z.object({parameters: removeFromPortalActionParameters, type: z.literal("REMOVE_FROM_PORTAL")}); export const transcribeActionParameters = z.object({engine: z.string().nullable().optional(), force: z.boolean().optional(), language: z.string().nullable().optional(), speakers: z.number().int().gte(1).lte(100).nullable().optional(), summary: z.boolean().nullable().optional(), topics_extraction: z.boolean().optional(), translate_languages: z.array(z.string()).nullable().optional()}); export const transcribeAction = z.object({parameters: transcribeActionParameters, type: z.literal("TRANSCRIBE")}); export const createShareActionParameters = z.object({allow_approving_comments: z.boolean(), allow_comments: z.boolean(), allow_custom_actions: z.boolean().optional(), allow_download: z.boolean(), allow_download_proxy: z.boolean().optional(), allow_setting_approve_status: z.boolean(), allow_upload: z.boolean().optional(), allow_user_search_for_mentions: z.boolean().optional(), allow_view_transcriptions: z.boolean().optional(), allow_view_versions: z.boolean().optional(), emails: z.array(z.string()), expires_in_days: z.number().int().gte(1).nullable().optional(), has_password: z.unknown(), message: z.string().optional(), metadata_views: z.array(z.string()).nullable().optional(), password: z.string().nullable().optional(), show_watermark: z.boolean().optional(), title: z.string().optional(), upload_storage_id: z.string().nullable().optional(), user_id: z.string()}); export const createShareAction = z.object({parameters: createShareActionParameters, type: z.literal("CREATE_SHARE")}); export const deleteAction = z.object({parameters: z.record(z.string(), z.unknown()).optional(), type: z.literal("DELETE_ASSET")}); export const deleteFileSetActionParameters = z.object({format: z.string(), storage_id: z.string()}); export const deleteFileSetAction = z.object({parameters: deleteFileSetActionParameters, type: z.literal("DELETE_FILE_SET")}); export const restrictAssetActionParameters = z.object({restrict_metadata_field: z.string(), warning: z.string().optional(), warning_metadata_field: z.string().optional()}); export const restrictAssetAction = z.object({parameters: restrictAssetActionParameters, type: z.literal("RESTRICT_ASSET")}); export const removeAssetRestrictionActionParameters = z.object({restrict_metadata_field: z.string(), warning_metadata_field: z.string().optional()}); export const removeAssetRestrictionAction = z.object({parameters: removeAssetRestrictionActionParameters, type: z.literal("REMOVE_ASSET_RESTRICTION")}); export const requestReviewActionParameters = z.object({externals: z.array(z.string()).optional(), groups: z.array(z.string()).optional(), min_number: z.number().int().gte(1).optional(), share: createShareActionParameters, status: z.enum(["N/A", "REQUESTED", "APPROVED", "NOT_APPROVED", "MIXED"]).optional(), users: z.array(z.string()).optional()}); export const requestReviewAction = z.object({parameters: requestReviewActionParameters, type: z.literal("REQUEST_REVIEW")}); export const metadataFieldValueSchema = z.object({field_values: z.array(z.record(z.string(), z.unknown())).optional()}); export const triggerCustomActionParameters = z.object({action_id: z.string(), context: z.enum(["ASSET", "ASSET_SUBCLIP", "BULK"]), metadata_values: z.record(z.string(), metadataFieldValueSchema).optional()}); export const triggerCustomAction = z.object({parameters: triggerCustomActionParameters, type: z.literal("CUSTOM_ACTION")}); export const rangeFilter = z.object({max: z.string().optional(), min: z.string().optional(), timezone: z.string().optional()}); export const term = z.object({exists: z.boolean().optional(), external: z.record(z.string(), z.unknown()).optional(), missing: z.boolean().optional(), name: z.string(), range: rangeFilter.optional(), value: z.unknown(), value_in: z.array(z.string()).optional()}); export const condition: z.ZodType = z.object({conditions: z.array(z.lazy(() => condition)).optional(), filters: z.array(z.lazy(() => condition)).optional(), operator: z.string(), path: z.string().optional(), terms: z.array(term).optional()}); export const metadataUpdateTriggerParameters = z.object({event_type: z.enum(["ASSETS", "COLLECTIONS"]), metadata_values: z.record(z.string(), metadataFieldValueSchema)}); export const metadataUpdateTrigger = z.object({parameters: metadataUpdateTriggerParameters, type: z.literal("METADATA_UPDATE")}); export const assetSharedTriggerParameters = z.object({allow_download: z.boolean().nullable().optional()}); export const assetSharedTriggerSchema = z.object({parameters: assetSharedTriggerParameters, type: z.literal("ASSET_SHARE")}); export const subtitleAddedTriggerParameters = z.object({closed_captions: z.boolean().nullable().optional(), language: z.string().nullable().optional()}); export const subtitleAddedTrigger = z.object({parameters: subtitleAddedTriggerParameters, type: z.literal("SUBTITLE_ADDED")}); export const reviewStatusChangedTriggerParameters = z.object({statuses: z.array(z.enum(["N/A", "REQUESTED", "APPROVED", "NOT_APPROVED", "MIXED"])).optional()}); export const reviewStatusChangedTrigger = z.object({parameters: reviewStatusChangedTriggerParameters, type: z.literal("REVIEW_STATUS_CHANGED")}); export const assetOnlineTriggerParameters = z.object({only_first_version: z.literal(true), wait_for_transcode: z.boolean()}); export const assetOnlineTriggerSchema = z.object({parameters: assetOnlineTriggerParameters, type: z.literal("ASSET_ONLINE")}); export const versionOnlineTriggerParameters = z.object({only_first_version: z.literal(false), wait_for_transcode: z.boolean()}); export const versionOnlineTrigger = z.object({parameters: versionOnlineTriggerParameters, type: z.literal("VERSION_ONLINE")}); export const assetTransferredToStorageParameters = z.object({format: z.string().nullable().optional(), storage_id: z.string()}); export const assetTransferredToStorageTriggerSchema = z.object({parameters: assetTransferredToStorageParameters, type: z.literal("TRANSFER_TO_STORAGE")}); export const assetArchivedTriggerParameters = z.object({storage_id: z.string().optional()}); export const assetArchivedTriggerSchema = z.object({parameters: assetArchivedTriggerParameters, type: z.literal("ARCHIVE")}); export const assetRestoredTriggerParameters = z.object({storage_id: z.string().optional()}); export const assetRestoredTriggerSchema = z.object({parameters: assetRestoredTriggerParameters, type: z.literal("RESTORE")}); export const createdAtTransitionTriggerParameters = z.object({days_since_created: z.number().int().gte(1)}); export const createdAtTransitionTrigger = z.object({parameters: createdAtTransitionTriggerParameters, type: z.literal("CREATED_AT_TRANSITION")}); export const modifiedAtTransitionTriggerParameters = z.object({days_since_modified: z.number().int().gte(1)}); export const modifiedAtTransitionTrigger = z.object({parameters: modifiedAtTransitionTriggerParameters, type: z.literal("MODIFIED_AT_TRANSITION")}); export const objectCollectionTriggerParameters = z.object({collection_ids: z.array(z.string()), include_subcollections: z.boolean().optional(), object_type: z.string()}); export const objectAddedToCollectionTrigger = z.object({parameters: objectCollectionTriggerParameters, type: z.literal("OBJECT_ADDED_TO_COLLECTION")}); export const objectRemovedFromCollectionTrigger = z.object({parameters: objectCollectionTriggerParameters, type: z.literal("OBJECT_REMOVED_FROM_COLLECTION")}); export const automationSchema = z.object({actions: z.array(z.union([analyzeActionSchema, extractFacesAction, createPublicationJobAction, archiveActionSchema, restoreAction, exportAction, updateACLAction, metadataUpdateAction, aIMetadataFillingActionSchema, transcodeAction, transferAction, requestOriginalAction, addToCollectionActionSchema, addToPortalActionSchema, removeFromPortalAction, transcribeAction, createShareAction, deleteAction, deleteFileSetAction, restrictAssetAction, removeAssetRestrictionAction, requestReviewAction, triggerCustomAction])), conditions: z.array(condition).optional(), created_by: z.string().optional(), date_created: z.string().optional(), date_modified: z.string().optional(), description: z.string().optional(), id: z.string().optional(), modified_by: z.string().optional(), name: z.string(), status: z.enum(["ACTIVE", "INACTIVE"]).optional(), system_domain_id: z.string().optional(), triggers: z.array(z.union([metadataUpdateTrigger, assetSharedTriggerSchema, subtitleAddedTrigger, reviewStatusChangedTrigger, assetOnlineTriggerSchema, versionOnlineTrigger, assetTransferredToStorageTriggerSchema, assetArchivedTriggerSchema, assetRestoredTriggerSchema, createdAtTransitionTrigger, modifiedAtTransitionTrigger, objectAddedToCollectionTrigger, objectRemovedFromCollectionTrigger]))}); export const automationsSchema = z.object({first_url: z.string().optional(), last_url: z.string().optional(), next_url: z.string().optional(), objects: z.array(automationSchema).optional(), page: z.number().int().gte(-2147483648).lte(2147483647).optional(), pages: z.number().int().gte(-2147483648).lte(2147483647).optional(), per_page: z.number().int().gte(-2147483648).lte(2147483647).optional(), prev_url: z.string().optional(), total: z.number().int().gte(-9223372036854776000).lte(9223372036854776000).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 }; /** * List of automations * * GET /v1/automations/ */ export const getApiV1Automations = async (args: GetApiV1AutomationsArgs, options: GetApiV1AutomationsOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args['App-ID'] != null) headers.set("App-ID", String(args['App-ID'])) if (args['Auth-Token'] != null) headers.set("Auth-Token", String(args['Auth-Token'])) const url = `${baseUrl.replace(/\/+$/, '')}/v1/automations/${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(automationsSchema, await res.json()) };