model Workflow { id String @id @default(cuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt name String description String status String @default("draft") tenantId String? tenant Tenant? @relation(fields: [tenantId], references: [id]) createdByUserId String? createdByUser User? @relation(name: "createdByUser", fields: [createdByUserId], references: [id]) appliesToAllTenants Boolean @default(false) blocks WorkflowBlock[] inputExamples WorkflowInputExample[] executions WorkflowExecution[] } model WorkflowBlock { id String @id @default(cuid()) workflowId String // Foreign key to the Workflow workflow Workflow @relation(fields: [workflowId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt type String description String isTrigger Boolean @default(false) isBlock Boolean @default(false) fromBlocks WorkflowBlockToBlock[] @relation(name: "toBlock") toBlocks WorkflowBlockToBlock[] @relation(name: "fromBlock") input String executions WorkflowBlockExecution[] @relation(name: "executions") fromExecutions WorkflowBlockExecution[] @relation(name: "fromExecutions") conditionsGroups WorkflowBlockConditionGroup[] waitingInExecutions WorkflowExecution[] } model WorkflowBlockConditionGroup { id String @id @default(cuid()) workflowBlockId String workflowBlock WorkflowBlock @relation(fields: [workflowBlockId], references: [id], onDelete: Cascade) index Int type String // AND or OR conditions WorkflowBlockCondition[] } model WorkflowBlockCondition { id String @id @default(cuid()) workflowBlockConditionGroupId String workflowBlockConditionGroup WorkflowBlockConditionGroup @relation(fields: [workflowBlockConditionGroupId], references: [id], onDelete: Cascade) index Int variable String operator String value String } model WorkflowBlockToBlock { id String @id @default(cuid()) fromBlockId String fromBlock WorkflowBlock @relation(name: "fromBlock", fields: [fromBlockId], references: [id], onDelete: Cascade) toBlockId String toBlock WorkflowBlock @relation(name: "toBlock", fields: [toBlockId], references: [id], onDelete: Cascade) condition String? @@unique([fromBlockId, toBlockId]) } model WorkflowExecution { id String @id @default(cuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt workflowId String workflow Workflow @relation(fields: [workflowId], references: [id], onDelete: Cascade) tenantId String? tenant Tenant? @relation(fields: [tenantId], references: [id], onDelete: Cascade) type String // manual, api, stream status String input String output String? duration Int? endedAt DateTime? error String? waitingBlockId String? waitingBlock WorkflowBlock? @relation(fields: [waitingBlockId], references: [id]) createdByUserId String? createdByUser User? @relation(name: "executedByUser", fields: [createdByUserId], references: [id]) appliesToAllTenants Boolean @default(false) blockRuns WorkflowBlockExecution[] @@index([tenantId, appliesToAllTenants, createdAt(sort: Desc)], name: "workflow_execution_tenant_scope_created_at_idx") @@index([workflowId, tenantId, createdAt(sort: Desc)], name: "workflow_execution_workflow_tenant_created_at_idx") @@index([tenantId, status, createdAt(sort: Desc)], name: "workflow_execution_tenant_status_created_at_idx") @@index([tenantId, type, createdAt(sort: Desc)], name: "workflow_execution_tenant_type_created_at_idx") } model WorkflowInputExample { id String @id @default(cuid()) createdAt DateTime @default(now()) workflowId String workflow Workflow @relation(fields: [workflowId], references: [id], onDelete: Cascade) title String input String? @@unique([workflowId, title]) } model WorkflowBlockExecution { id String @id @default(cuid()) workflowExecutionId String workflowExecution WorkflowExecution @relation(fields: [workflowExecutionId], references: [id], onDelete: Cascade) workflowBlockId String workflowBlock WorkflowBlock @relation(name: "executions", fields: [workflowBlockId], references: [id], onDelete: Cascade) fromWorkflowBlockId String? fromWorkflowBlock WorkflowBlock? @relation(name: "fromExecutions", fields: [fromWorkflowBlockId], references: [id]) status String startedAt DateTime input String? output String? duration Int? endedAt DateTime? error String? } model WorkflowVariable { id String @id @default(cuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenantId String? tenant Tenant? @relation(fields: [tenantId], references: [id], onDelete: Cascade) name String value String createdByUserId String? createdByUser User? @relation(fields: [userId], references: [id]) userId String? @@unique([tenantId, name]) } model WorkflowCredential { id String @id @default(cuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt tenantId String? tenant Tenant? @relation(fields: [tenantId], references: [id], onDelete: Cascade) name String value String createdByUserId String? createdByUser User? @relation(fields: [userId], references: [id]) userId String? @@unique([tenantId, name]) }