import { googleTriggerDefinitions as definitions } from "@automate.ax/catalog/triggers/google" import type { TriggerEvent } from "@automate.ax/integration-contracts/triggers" import { createTrigger } from "../../automation/create-trigger" import type { IntegrationAccountReference } from "../../automation/integrations" import type { Signal } from "../../automation/signal-protocol" export interface OnGoogleDriveEventOptions { account?: string | IntegrationAccountReference<"google"> /** Includes nested items when the target is a folder or shared drive. */ includeDescendants?: boolean /** * Drive file, folder, or shared-drive ID or URL. Copied shared-drive URLs use * the same `/folders/` path as folder URLs, so set `resourceType: "drive"`. */ resource: string /** Defaults to `file`; inferred only from URLs containing `/drives/`. */ resourceType?: "file" | "drive" } /** Subscribes to every event supported by the selected Drive resource. */ export const onGoogleDriveEvent = createTrigger( definitions.googleDriveEvent, toGoogleDriveTriggerConfig, ) export const onGoogleDriveAccessProposalCreated = driveTrigger( definitions.googleDriveAccessProposalCreated, ) export const onGoogleDriveAccessProposalResolved = driveTrigger( definitions.googleDriveAccessProposalResolved, ) export const onGoogleDriveApprovalCancelled = driveTrigger( definitions.googleDriveApprovalCancelled, ) export const onGoogleDriveApprovalCompleted = driveTrigger( definitions.googleDriveApprovalCompleted, ) export const onGoogleDriveApprovalCreated = driveTrigger( definitions.googleDriveApprovalCreated, ) export const onGoogleDriveApprovalReset = driveTrigger( definitions.googleDriveApprovalReset, ) export const onGoogleDriveApprovalReviewerResponded = driveTrigger( definitions.googleDriveApprovalResponded, ) export const onGoogleDriveApprovalReviewersChanged = driveTrigger( definitions.googleDriveApprovalReviewersChanged, ) export const onGoogleDriveCommentCreated = driveTrigger( definitions.googleDriveCommentCreated, ) export const onGoogleDriveCommentDeleted = driveTrigger( definitions.googleDriveCommentDeleted, ) export const onGoogleDriveCommentEdited = driveTrigger( definitions.googleDriveCommentEdited, ) export const onGoogleDriveCommentReopened = driveTrigger( definitions.googleDriveCommentReopened, ) export const onGoogleDriveCommentResolved = driveTrigger( definitions.googleDriveCommentResolved, ) export const onGoogleDriveFileContentChanged = driveTrigger( definitions.googleDriveFileContentChanged, ) export const onGoogleDriveFileCreated = driveTrigger( definitions.googleDriveFileCreated, ) export const onGoogleDriveFileDeleted = driveTrigger( definitions.googleDriveFileDeleted, ) export const onGoogleDriveFileMoved = driveTrigger( definitions.googleDriveFileMoved, ) export const onGoogleDriveFileRenamed = driveTrigger( definitions.googleDriveFileRenamed, ) export const onGoogleDriveFileTrashed = driveTrigger( definitions.googleDriveFileTrashed, ) export const onGoogleDriveFileUntrashed = driveTrigger( definitions.googleDriveFileUntrashed, ) export const onGoogleDrivePermissionCreated = driveTrigger( definitions.googleDrivePermissionCreated, ) export const onGoogleDrivePermissionDeleted = driveTrigger( definitions.googleDrivePermissionDeleted, ) export const onGoogleDrivePermissionEdited = driveTrigger( definitions.googleDrivePermissionEdited, ) export const onGoogleDriveReplyCreated = driveTrigger( definitions.googleDriveReplyCreated, ) export const onGoogleDriveReplyDeleted = driveTrigger( definitions.googleDriveReplyDeleted, ) export const onGoogleDriveReplyEdited = driveTrigger( definitions.googleDriveReplyEdited, ) /** * Defines a Drive trigger with shared resource configuration. * * @param definition - Catalog trigger definition. */ function driveTrigger< const TDefinition extends Parameters[0], >( definition: TDefinition, ): ( options: OnGoogleDriveEventOptions, ) => Signal> function driveTrigger(definition: Parameters[0]) { return createTrigger(definition, toGoogleDriveTriggerConfig) } /** * Converts author input to the deployed Drive subscription configuration. * * @param options - Public trigger options. */ function toGoogleDriveTriggerConfig(options: OnGoogleDriveEventOptions) { const resource = normalizeGoogleDriveResource(options.resource) return { account: options.account, includeDescendants: options.includeDescendants, resourceId: resource.id, resourceType: options.resourceType ?? resource.type, } } /** * Resolves a raw Drive resource ID or supported URL. * * @param resource - Raw resource ID or URL. * @throws When a URL is not a recognizable Drive resource URL. */ function normalizeGoogleDriveResource(resource: string) { const value = resource.trim() if (!URL.canParse(value)) return { id: value, type: "file" as const } const url = new URL(value) if ( url.hostname !== "drive.google.com" && url.hostname !== "docs.google.com" ) { throw new Error(`Expected a Google Drive URL, received "${value}".`) } const parts = url.pathname.split("/").filter(Boolean) const driveIndex = parts.indexOf("drives") const driveId = driveIndex === -1 ? undefined : parts[driveIndex + 1] if (driveId) return { id: driveId, type: "drive" as const } const foldersIndex = parts.indexOf("folders") const folderId = foldersIndex === -1 ? undefined : parts[foldersIndex + 1] if (folderId) return { id: folderId, type: "file" as const } const dIndex = parts.indexOf("d") const documentId = dIndex === -1 ? undefined : parts[dIndex + 1] if (documentId) return { id: documentId, type: "file" as const } const id = url.searchParams.get("id") if (id) return { id, type: "file" as const } throw new Error(`Could not find a Drive resource ID in "${value}".`) }