Store callback details in a Firestore database

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 .

Create a Mobile Website
View Site in Mobile | Classic
Share by: