mirror of
https://github.com/langgenius/dify.git
synced 2026-04-28 11:56:55 +08:00
add force update workflow to support restore
This commit is contained in:
parent
b4636ddf44
commit
fc230bcc59
@ -107,6 +107,7 @@ class DraftWorkflowApi(Resource):
|
|||||||
parser.add_argument("hash", type=str, required=False, location="json")
|
parser.add_argument("hash", type=str, required=False, location="json")
|
||||||
parser.add_argument("environment_variables", type=list, required=True, location="json")
|
parser.add_argument("environment_variables", type=list, required=True, location="json")
|
||||||
parser.add_argument("conversation_variables", type=list, required=False, location="json")
|
parser.add_argument("conversation_variables", type=list, required=False, location="json")
|
||||||
|
parser.add_argument("force_upload", type=bool, required=False, default=False, location="json")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
elif "text/plain" in content_type:
|
elif "text/plain" in content_type:
|
||||||
try:
|
try:
|
||||||
@ -123,6 +124,7 @@ class DraftWorkflowApi(Resource):
|
|||||||
"hash": data.get("hash"),
|
"hash": data.get("hash"),
|
||||||
"environment_variables": data.get("environment_variables"),
|
"environment_variables": data.get("environment_variables"),
|
||||||
"conversation_variables": data.get("conversation_variables"),
|
"conversation_variables": data.get("conversation_variables"),
|
||||||
|
"force_upload": data.get("force_upload", False),
|
||||||
}
|
}
|
||||||
except json.JSONDecodeError:
|
except json.JSONDecodeError:
|
||||||
return {"message": "Invalid JSON data"}, 400
|
return {"message": "Invalid JSON data"}, 400
|
||||||
@ -151,6 +153,7 @@ class DraftWorkflowApi(Resource):
|
|||||||
account=current_user,
|
account=current_user,
|
||||||
environment_variables=environment_variables,
|
environment_variables=environment_variables,
|
||||||
conversation_variables=conversation_variables,
|
conversation_variables=conversation_variables,
|
||||||
|
force_upload=args.get("force_upload", False),
|
||||||
)
|
)
|
||||||
except WorkflowHashNotEqualError:
|
except WorkflowHashNotEqualError:
|
||||||
raise DraftWorkflowNotSync()
|
raise DraftWorkflowNotSync()
|
||||||
|
|||||||
@ -199,15 +199,17 @@ class WorkflowService:
|
|||||||
account: Account,
|
account: Account,
|
||||||
environment_variables: Sequence[Variable],
|
environment_variables: Sequence[Variable],
|
||||||
conversation_variables: Sequence[Variable],
|
conversation_variables: Sequence[Variable],
|
||||||
|
force_upload: bool = False,
|
||||||
) -> Workflow:
|
) -> Workflow:
|
||||||
"""
|
"""
|
||||||
Sync draft workflow
|
Sync draft workflow
|
||||||
|
:param force_upload: Skip hash validation when True (for restore operations)
|
||||||
:raises WorkflowHashNotEqualError
|
:raises WorkflowHashNotEqualError
|
||||||
"""
|
"""
|
||||||
# fetch draft workflow by app_model
|
# fetch draft workflow by app_model
|
||||||
workflow = self.get_draft_workflow(app_model=app_model)
|
workflow = self.get_draft_workflow(app_model=app_model)
|
||||||
|
|
||||||
if workflow and workflow.unique_hash != unique_hash:
|
if workflow and workflow.unique_hash != unique_hash and not force_upload:
|
||||||
raise WorkflowHashNotEqualError()
|
raise WorkflowHashNotEqualError()
|
||||||
|
|
||||||
# validate features structure
|
# validate features structure
|
||||||
|
|||||||
@ -122,6 +122,7 @@ export const useNodesSyncDraft = () => {
|
|||||||
onError?: () => void
|
onError?: () => void
|
||||||
onSettled?: () => void
|
onSettled?: () => void
|
||||||
},
|
},
|
||||||
|
forceUpload?: boolean,
|
||||||
) => {
|
) => {
|
||||||
if (getNodesReadOnly())
|
if (getNodesReadOnly())
|
||||||
return
|
return
|
||||||
@ -129,15 +130,15 @@ export const useNodesSyncDraft = () => {
|
|||||||
// Check leader status at sync time
|
// Check leader status at sync time
|
||||||
const currentIsLeader = collaborationManager.getIsLeader()
|
const currentIsLeader = collaborationManager.getIsLeader()
|
||||||
|
|
||||||
// If not leader, request the leader to sync
|
// If not leader and not forcing upload, request the leader to sync
|
||||||
if (!currentIsLeader) {
|
if (!currentIsLeader && !forceUpload) {
|
||||||
console.log('Not leader, requesting leader to sync workflow draft')
|
console.log('Not leader, requesting leader to sync workflow draft')
|
||||||
collaborationManager.emitSyncRequest()
|
collaborationManager.emitSyncRequest()
|
||||||
callback?.onSettled?.()
|
callback?.onSettled?.()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('Leader performing workflow draft sync')
|
console.log(forceUpload ? 'Force uploading workflow draft' : 'Leader performing workflow draft sync')
|
||||||
const postParams = getPostParams()
|
const postParams = getPostParams()
|
||||||
|
|
||||||
if (postParams) {
|
if (postParams) {
|
||||||
@ -145,8 +146,18 @@ export const useNodesSyncDraft = () => {
|
|||||||
setSyncWorkflowDraftHash,
|
setSyncWorkflowDraftHash,
|
||||||
setDraftUpdatedAt,
|
setDraftUpdatedAt,
|
||||||
} = workflowStore.getState()
|
} = workflowStore.getState()
|
||||||
|
|
||||||
|
// Add force_upload parameter if needed
|
||||||
|
const finalParams = {
|
||||||
|
...postParams.params,
|
||||||
|
...(forceUpload && { force_upload: true }),
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const res = await syncWorkflowDraft(postParams)
|
const res = await syncWorkflowDraft({
|
||||||
|
url: postParams.url,
|
||||||
|
params: finalParams,
|
||||||
|
})
|
||||||
setSyncWorkflowDraftHash(res.hash)
|
setSyncWorkflowDraftHash(res.hash)
|
||||||
setDraftUpdatedAt(res.updated_at)
|
setDraftUpdatedAt(res.updated_at)
|
||||||
console.log('Leader successfully synced workflow draft')
|
console.log('Leader successfully synced workflow draft')
|
||||||
|
|||||||
@ -72,7 +72,7 @@ const HeaderInRestoring = ({
|
|||||||
onSettled: () => {
|
onSettled: () => {
|
||||||
onRestoreSettled?.()
|
onRestoreSettled?.()
|
||||||
},
|
},
|
||||||
})
|
}, true) // Enable forceUpload for restore operation
|
||||||
deleteAllInspectVars()
|
deleteAllInspectVars()
|
||||||
invalidAllLastRun()
|
invalidAllLastRun()
|
||||||
}, [setShowWorkflowVersionHistoryPanel, workflowStore, handleSyncWorkflowDraft, deleteAllInspectVars, invalidAllLastRun, t, onRestoreSettled, appDetail])
|
}, [setShowWorkflowVersionHistoryPanel, workflowStore, handleSyncWorkflowDraft, deleteAllInspectVars, invalidAllLastRun, t, onRestoreSettled, appDetail])
|
||||||
|
|||||||
@ -21,7 +21,8 @@ type CommonHooksFnMap = {
|
|||||||
onSuccess?: () => void
|
onSuccess?: () => void
|
||||||
onError?: () => void
|
onError?: () => void
|
||||||
onSettled?: () => void
|
onSettled?: () => void
|
||||||
}
|
},
|
||||||
|
forceUpload?: boolean
|
||||||
) => Promise<void>
|
) => Promise<void>
|
||||||
syncWorkflowDraftWhenPageClose: () => void
|
syncWorkflowDraftWhenPageClose: () => void
|
||||||
handleRefreshWorkflowDraft: () => void
|
handleRefreshWorkflowDraft: () => void
|
||||||
|
|||||||
@ -21,12 +21,13 @@ export const useNodesSyncDraft = () => {
|
|||||||
onError?: () => void
|
onError?: () => void
|
||||||
onSettled?: () => void
|
onSettled?: () => void
|
||||||
},
|
},
|
||||||
|
forceUpload?: boolean,
|
||||||
) => {
|
) => {
|
||||||
if (getNodesReadOnly())
|
if (getNodesReadOnly())
|
||||||
return
|
return
|
||||||
|
|
||||||
if (sync)
|
if (sync)
|
||||||
doSyncWorkflowDraft(notRefreshWhenSyncError, callback)
|
doSyncWorkflowDraft(notRefreshWhenSyncError, callback, forceUpload)
|
||||||
else
|
else
|
||||||
debouncedSyncWorkflowDraft(doSyncWorkflowDraft)
|
debouncedSyncWorkflowDraft(doSyncWorkflowDraft)
|
||||||
}, [debouncedSyncWorkflowDraft, doSyncWorkflowDraft, getNodesReadOnly])
|
}, [debouncedSyncWorkflowDraft, doSyncWorkflowDraft, getNodesReadOnly])
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user