Setting up an Event-based Trigger
Triggered based on the user defined event such as Tailor DB record creation EventType: "tailordb.type_record.created"
.
Tutorial steps
To create an event based trigger, you'll need to:
- Activate the Executor service
- Add the trigger in
executor
configuration file - Enable
PublishRecordEvents
settings - Apply the change
- Verify the trigger
1. Activate the Executor service
To activate the Executor service, add an executor.tf
file to the root folder of the application. Define the trigger as shown below.
<span><span style="color: var(--shiki-token-function)">resource</span><span style="color: var(--shiki-color-text)"> "tailor_executor" "webhook_starship" {</span></span>
<span><span style="color: var(--shiki-color-text)"> workspace_id </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> tailor_workspace.ims.id</span></span>
<span><span style="color: var(--shiki-color-text)"> name </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"<trigger-name>"</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> trigger </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> event </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {}</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> operation </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {}</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
Learn more about executor properties in the Tailor Platform Provider documentation.
2. Add the trigger in executor
configuration file
<span><span style="color: var(--shiki-token-function)">resource</span><span style="color: var(--shiki-color-text)"> "tailor_executor" "event_based_executor" {</span></span>
<span><span style="color: var(--shiki-color-text)"> workspace_id </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> tailor_workspace.ims.id</span></span>
<span><span style="color: var(--shiki-color-text)"> name </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"event-based-executor"</span></span>
<span><span style="color: var(--shiki-color-text)"> description </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Execute query based on an event"</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> trigger </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> event </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> type </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"tailordb.type_record.created"</span></span>
<span><span style="color: var(--shiki-color-text)"> condition </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)"><<EOF</span></span>
<span><span style="color: var(--shiki-token-string)"> args.namespaceName == "ims" && args.typeName == "Category"</span></span>
<span><span style="color: var(--shiki-token-keyword)"> EOF</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> operation </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> tailor_graphql </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> app_name </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> tailor_application.ims.name</span></span>
<span><span style="color: var(--shiki-color-text)"> invoker </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> event_user </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> query </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)"><<EOF</span></span>
<span><span style="color: var(--shiki-token-string)"> mutation createProduct($categoryID: ID!, $title: String!) {</span></span>
<span><span style="color: var(--shiki-token-string)"> createProduct(input: {</span></span>
<span><span style="color: var(--shiki-token-string)"> categoryID: $categoryID</span></span>
<span><span style="color: var(--shiki-token-string)"> title: $title</span></span>
<span><span style="color: var(--shiki-token-string)"> }) {</span></span>
<span><span style="color: var(--shiki-token-string)"> id</span></span>
<span><span style="color: var(--shiki-token-string)"> }</span></span>
<span><span style="color: var(--shiki-token-string)"> }</span></span>
<span><span style="color: var(--shiki-token-keyword)"> EOF</span></span>
<span><span style="color: var(--shiki-color-text)"> variables </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)"><<EOF</span></span>
<span><span style="color: var(--shiki-token-string)"> ({</span></span>
<span><span style="color: var(--shiki-token-string)"> "categoryID": args.newRecord.id,</span></span>
<span><span style="color: var(--shiki-token-string)"> "title": args.newRecord.name + "Product"</span></span>
<span><span style="color: var(--shiki-token-string)"> })</span></span>
<span><span style="color: var(--shiki-token-keyword)"> EOF</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
3. Enable PublishRecordEvents
settings
To ensure that a Product
record is created through the trigger for every Category
type record created, you'll need to enable PublishRecordEvents
in the settings.
<span><span style="color: var(--shiki-token-function)">resource</span><span style="color: var(--shiki-color-text)"> "tailor_tailordb_type" "category" {</span></span>
<span><span style="color: var(--shiki-color-text)"> workspace_id </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> tailor_workspace.ims.id</span></span>
<span><span style="color: var(--shiki-color-text)"> namespace </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> tailor_tailordb.ims.namespace</span></span>
<span><span style="color: var(--shiki-color-text)"> name </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Category"</span></span>
<span><span style="color: var(--shiki-color-text)"> description </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string-expression)">"Contains information about categories of products."</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> settings </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> publish_record_events </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-constant)">true</span><span style="color: var(--shiki-color-text)">,</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> fields </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-keyword)">...</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span></span>
<span><span style="color: var(--shiki-color-text)"> type_permission </span><span style="color: var(--shiki-token-keyword)">=</span><span style="color: var(--shiki-color-text)"> local.permission_everyone</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
4. Apply the change
Run the following command to apply the changes.
<span><span style="color: var(--shiki-token-function)">terraform</span><span style="color: var(--shiki-color-text)"> </span><span style="color: var(--shiki-token-string)">apply</span></span>
<span></span>
5. Verify the trigger
Click on the application and select Executors
from the navigation to view the created executor in the Console.
View the executor details by clicking the Open Details
button in the Details
column of the overview table.
In the console, select GraphQL Playground
to create a new sales order.
<span><span style="color: var(--shiki-token-keyword)">mutation</span><span style="color: var(--shiki-color-text)"> {</span></span>
<span><span style="color: var(--shiki-color-text)"> createSalesOrder(input:{ </span><span style="color: var(--shiki-token-string)">orderNumber</span><span style="color: var(--shiki-color-text)">: </span><span style="color: var(--shiki-token-constant)">987</span><span style="color: var(--shiki-color-text)"> }) {</span></span>
<span><span style="color: var(--shiki-color-text)"> id</span></span>
<span><span style="color: var(--shiki-color-text)"> }</span></span>
<span><span style="color: var(--shiki-color-text)">}</span></span>
<span></span>
After executing the query, view the job created for that executor by selecting the Jobs
tab and choosing the executor from the dropdown menu.
Clicking Open Attempts
displays details of job execution attempts made by the Executor. When the Target execution fails with a status code other than 2xx, the Tailor Platform retries the job execution. However, retries are not performed for certain errors, such as incorrect executor configuration or script errors.
Upon successful completion of the job, a new Shipment record is created.