mirror of
https://github.com/xtr-dev/payload-automation.git
synced 2025-12-11 09:13:24 +00:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cd85f90ef1 | |||
| 38fbb1922a |
151
CUSTOMER-DIAGNOSTIC.md
Normal file
151
CUSTOMER-DIAGNOSTIC.md
Normal file
@@ -0,0 +1,151 @@
|
||||
# 🔍 CRITICAL DIAGNOSTIC: Why The Plugin Works Locally But Not For You
|
||||
|
||||
## The Key Insight
|
||||
|
||||
Our tests work because we define collections **inline** in the config:
|
||||
|
||||
```typescript
|
||||
// OUR TEST ENVIRONMENT - WORKS
|
||||
export default buildConfig({
|
||||
collections: [
|
||||
{
|
||||
slug: 'posts',
|
||||
fields: [...],
|
||||
// Collection defined RIGHT HERE
|
||||
}
|
||||
],
|
||||
plugins: [
|
||||
workflowsPlugin({...}) // Plugin can see collections above
|
||||
]
|
||||
})
|
||||
```
|
||||
|
||||
## The Likely Customer Setup
|
||||
|
||||
You probably have collections defined **separately**:
|
||||
|
||||
```typescript
|
||||
// YOUR ENVIRONMENT - LIKELY STRUCTURE
|
||||
import { Orders } from './collections/Orders'
|
||||
import { Users } from './collections/Users'
|
||||
import { Products } from './collections/Products'
|
||||
|
||||
export default buildConfig({
|
||||
collections: [
|
||||
Orders, // Imported from separate file
|
||||
Users, // Imported from separate file
|
||||
Products // Imported from separate file
|
||||
],
|
||||
plugins: [
|
||||
workflowsPlugin({...}) // Plugin runs but collections might be different
|
||||
]
|
||||
})
|
||||
```
|
||||
|
||||
## The Critical Question
|
||||
|
||||
**How are your collections defined?**
|
||||
|
||||
### Option 1: Separate Files (Most Common)
|
||||
```typescript
|
||||
// collections/Orders.ts
|
||||
export const Orders: CollectionConfig = {
|
||||
slug: 'orders',
|
||||
hooks: {
|
||||
// Your existing hooks here
|
||||
},
|
||||
fields: [...]
|
||||
}
|
||||
```
|
||||
|
||||
### Option 2: Factory Functions
|
||||
```typescript
|
||||
// collections/Orders.ts
|
||||
export const Orders = (): CollectionConfig => ({
|
||||
slug: 'orders',
|
||||
// ...
|
||||
})
|
||||
```
|
||||
|
||||
### Option 3: Class-based or Complex Setup
|
||||
```typescript
|
||||
// Something more complex that might not be in config.collections yet
|
||||
```
|
||||
|
||||
## 🚨 THE DIAGNOSTIC TEST
|
||||
|
||||
Add this to your payload.config.ts BEFORE the workflowsPlugin:
|
||||
|
||||
```typescript
|
||||
export default buildConfig({
|
||||
collections: [Orders, Users, Products],
|
||||
plugins: [
|
||||
// ADD THIS DIAGNOSTIC PLUGIN FIRST
|
||||
(config) => {
|
||||
console.log('🔍 DIAGNOSTIC: Collections in config:')
|
||||
console.log(' - config.collections exists?', !!config.collections)
|
||||
console.log(' - config.collections length:', config.collections?.length)
|
||||
console.log(' - Collection slugs:', config.collections?.map(c => c.slug))
|
||||
|
||||
// Check if orders collection has hooks already
|
||||
const ordersConfig = config.collections?.find(c => c.slug === 'orders')
|
||||
console.log(' - Orders collection found?', !!ordersConfig)
|
||||
console.log(' - Orders has hooks?', !!ordersConfig?.hooks)
|
||||
console.log(' - Orders afterChange hooks:', ordersConfig?.hooks?.afterChange?.length || 0)
|
||||
|
||||
return config
|
||||
},
|
||||
|
||||
// THEN your automation plugin
|
||||
workflowsPlugin({...})
|
||||
]
|
||||
})
|
||||
```
|
||||
|
||||
## 🎯 What This Will Tell Us
|
||||
|
||||
1. **If collections show up**: The plugin should work with v0.0.20
|
||||
2. **If collections are empty/undefined**: That's why hooks aren't registering
|
||||
3. **If orders already has hooks**: There might be a conflict
|
||||
|
||||
## 💡 The Likely Solution
|
||||
|
||||
If your collections are in separate files, you might need to:
|
||||
|
||||
### Option A: Add hooks directly to collection files
|
||||
```typescript
|
||||
// collections/Orders.ts
|
||||
import { automationHook } from '@xtr-dev/payload-automation/hooks' // We'd need to export this
|
||||
|
||||
export const Orders: CollectionConfig = {
|
||||
slug: 'orders',
|
||||
hooks: {
|
||||
afterChange: [
|
||||
automationHook, // Add directly here
|
||||
// ... your other hooks
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Option B: Modify collections before passing to buildConfig
|
||||
```typescript
|
||||
// payload.config.ts
|
||||
import { Orders } from './collections/Orders'
|
||||
import { addAutomationHooks } from '@xtr-dev/payload-automation/utils' // We'd need to create this
|
||||
|
||||
const OrdersWithAutomation = addAutomationHooks(Orders)
|
||||
|
||||
export default buildConfig({
|
||||
collections: [OrdersWithAutomation, Users, Products],
|
||||
// ...
|
||||
})
|
||||
```
|
||||
|
||||
## 🔑 The Bottom Line
|
||||
|
||||
**The plugin works when collections are defined inline because they exist in `config.collections` when the plugin runs.**
|
||||
|
||||
**If your collections are imported from separate files, they might not be in the right structure for the plugin to modify them.**
|
||||
|
||||
Run the diagnostic above and share the console output - it will tell us exactly why the hooks aren't registering in your environment!
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@xtr-dev/payload-workflows",
|
||||
"version": "0.0.20",
|
||||
"version": "0.0.21",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@xtr-dev/payload-workflows",
|
||||
"version": "0.0.20",
|
||||
"version": "0.0.21",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"jsonpath-plus": "^10.3.0",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@xtr-dev/payload-automation",
|
||||
"version": "0.0.20",
|
||||
"version": "0.0.21",
|
||||
"description": "PayloadCMS Automation Plugin - Comprehensive workflow automation system with visual workflow building, execution tracking, and step types",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
|
||||
@@ -21,6 +21,12 @@ let globalExecutor: WorkflowExecutor | null = null
|
||||
const setWorkflowExecutor = (executor: WorkflowExecutor) => {
|
||||
console.log('🚨 SETTING GLOBAL EXECUTOR')
|
||||
globalExecutor = executor
|
||||
|
||||
// Also set on global object as fallback
|
||||
if (typeof global !== 'undefined') {
|
||||
(global as any).__workflowExecutor = executor
|
||||
console.log('🚨 EXECUTOR ALSO SET ON GLOBAL OBJECT')
|
||||
}
|
||||
}
|
||||
|
||||
const getWorkflowExecutor = (): WorkflowExecutor | null => {
|
||||
@@ -79,38 +85,58 @@ export const workflowsPlugin =
|
||||
collection.hooks.afterChange = []
|
||||
}
|
||||
|
||||
// Add our hook DIRECTLY to the collection config
|
||||
// This happens BEFORE PayloadCMS processes the config
|
||||
const automationHook = async (args: any) => {
|
||||
console.log('🔥🔥🔥 AUTOMATION HOOK FROM CONFIG PHASE! 🔥🔥🔥')
|
||||
console.log('Collection:', args.collection.slug)
|
||||
console.log('Operation:', args.operation)
|
||||
console.log('Doc ID:', args.doc?.id)
|
||||
|
||||
// We'll need to get the executor from somewhere
|
||||
// For now, just prove the hook works
|
||||
console.log('🔥🔥🔥 CONFIG-PHASE HOOK SUCCESSFULLY EXECUTED! 🔥🔥🔥')
|
||||
|
||||
// Try to get executor from global registry
|
||||
const executor = getWorkflowExecutor()
|
||||
if (executor) {
|
||||
console.log('✅ Executor available - executing workflows!')
|
||||
// Create a properly bound hook function that doesn't rely on closures
|
||||
// Use a simple function that PayloadCMS can definitely execute
|
||||
const automationHook = Object.assign(
|
||||
async function payloadAutomationHook(args: any) {
|
||||
try {
|
||||
await executor.executeTriggeredWorkflows(
|
||||
args.collection.slug,
|
||||
args.operation,
|
||||
args.doc,
|
||||
args.previousDoc,
|
||||
args.req
|
||||
)
|
||||
console.log('✅ Workflow execution completed!')
|
||||
// Use global console to ensure output
|
||||
global.console.log('🔥🔥🔥 AUTOMATION HOOK EXECUTED! 🔥🔥🔥')
|
||||
global.console.log('Collection:', args?.collection?.slug)
|
||||
global.console.log('Operation:', args?.operation)
|
||||
global.console.log('Doc ID:', args?.doc?.id)
|
||||
|
||||
// Try multiple ways to get the executor
|
||||
let executor = null
|
||||
|
||||
// Method 1: Global registry
|
||||
if (typeof getWorkflowExecutor === 'function') {
|
||||
executor = getWorkflowExecutor()
|
||||
}
|
||||
|
||||
// Method 2: Global variable fallback
|
||||
if (!executor && typeof global !== 'undefined' && (global as any).__workflowExecutor) {
|
||||
executor = (global as any).__workflowExecutor
|
||||
global.console.log('Got executor from global variable')
|
||||
}
|
||||
|
||||
if (executor) {
|
||||
global.console.log('✅ Executor found - executing workflows!')
|
||||
await executor.executeTriggeredWorkflows(
|
||||
args.collection.slug,
|
||||
args.operation,
|
||||
args.doc,
|
||||
args.previousDoc,
|
||||
args.req
|
||||
)
|
||||
global.console.log('✅ Workflow execution completed!')
|
||||
} else {
|
||||
global.console.log('⚠️ No executor available')
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('❌ Workflow execution failed:', error)
|
||||
global.console.error('❌ Hook execution error:', error)
|
||||
// Don't throw - just log
|
||||
}
|
||||
} else {
|
||||
console.log('⚠️ Executor not yet available')
|
||||
|
||||
// Always return undefined to match other hooks
|
||||
return undefined
|
||||
},
|
||||
{
|
||||
// Add metadata to help debugging
|
||||
__isAutomationHook: true,
|
||||
__version: '0.0.21'
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
// Add the hook to the collection config
|
||||
collection.hooks.afterChange.push(automationHook)
|
||||
|
||||
Reference in New Issue
Block a user