Stores callback details in a Firestore database, halts execution, and then waits for specific events to occur.
Explore further
For detailed documentation that includes this code sample, see the following:
Code sample
YAML
main
:
steps
:
-
init
:
assign
:
-
pubsub_topic
:
topic-callback
-
storage_bucket
:
${sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "-bucket-callback"}
-
await_pubsub_message
:
call
:
await_callback_event
args
:
event_source
:
${pubsub_topic}
result
:
pubsub_event
-
await_storage_bucket
:
call
:
await_callback_event
args
:
event_source
:
${storage_bucket}
result
:
storage_event
-
return_events
:
return
:
pubsub_event
:
${pubsub_event}
storage_event
:
${storage_event}
await_callback_event
:
params
:
[
event_source
]
steps
:
-
init
:
assign
:
-
database_root
:
${"projects/" + sys.get_env("GOOGLE_CLOUD_PROJECT_ID") + "/databases/(default)/documents/callbacks/"}
-
doc_name
:
${database_root + event_source}
-
execution_id
:
${sys.get_env("GOOGLE_CLOUD_WORKFLOW_EXECUTION_ID")}
-
firestore_key
:
${"exec_" + text.split(execution_id, "-")[0]}
-
create_callback
:
call
:
events.create_callback_endpoint
args
:
http_callback_method
:
POST
result
:
callback_details
-
save_callback_url
:
call
:
googleapis.firestore.v1.projects.databases.documents.patch
args
:
name
:
${doc_name}
updateMask
:
fieldPaths
:
[
"${firestore_key}"
]
body
:
fields
:
${firestore_key}
:
stringValue
:
${callback_details.url}
-
log_and_await_callback
:
try
:
steps
:
-
log_await_start
:
call
:
sys.log
args
:
severity
:
INFO
data
:
${"Started waiting 1hr for an event from source " + event_source}
-
await_callback
:
call
:
events.await_callback
args
:
callback
:
${callback_details}
timeout
:
3600
result
:
callback_request
-
log_await_stop
:
call
:
sys.log
args
:
severity
:
INFO
data
:
${"Stopped waiting for an event from source " + event_source}
except
:
as
:
e
steps
:
-
log_error
:
call
:
sys.log
args
:
severity
:
"ERROR"
text
:
${"Received error " + e.message}
-
delete_callback_url
:
call
:
googleapis.firestore.v1.projects.databases.documents.patch
args
:
name
:
${doc_name}
updateMask
:
fieldPaths
:
[
"${firestore_key}"
]
-
check_null_event
:
switch
:
-
condition
:
${callback_request == null}
return
:
null
-
log_await_result
:
call
:
sys.log
args
:
severity
:
INFO
data
:
${callback_request.http_request.body.event}
-
return_event
:
return
:
${callback_request.http_request.body.event}
What's next
To search and filter code samples for other Google Cloud products, see the Google Cloud sample browser .

